完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
题目如下,用两个按键控制流水灯,按键1按下时流水灯左右流水(延时3s),按键2按下时流水灯不停闪烁(间隔3s)。我想到的程序大概是这样,
switch(key) case(key1):while(1) { led=_crol_(led,1); delay(3s); if(key2); break; }; case( key2 ):while(1):{led=0xff; delay(3s); led=~led; delay(3s); if (key1); break; }...... 当然程序这么写是不行的,我的问题主要是不用while(1)吧,不能实现循环,用了吧不能检测及时退出,因为有延时函数,按下另一个键的时候经常检测不到。请问大家这个程序正确的思路应该怎么编写啊?大家给个思路就好,我想应该很简单吧这个程序。。 |
|
相关推荐
12个回答
|
|
在中断里查询按键,
|
|
|
|
你好,谢谢你的指点,请问如果我用中断查询按键2,一旦按键2被按下即转入中断执行led闪烁的语句,但是要led不停闪烁也需要while(1)语句,此时再按下按键1并不能被检测到呢。 |
|
|
|
中断嵌套,你看怎么样
|
|
|
|
|
|
|
|
给他个标志位就行了的, 按下对应键的时候就对应给他一个标志位,然后再在标志位的函数里面处理LED的闪烁问题就行咧,你试下呗
|
|
|
|
“中断不是有优先级之分吗?用了之后好像两个按键总有一个按键不能响应啊?”
首先,中断肯定是有优先之分的,这个要理清。 然后,你按键那里加了while循环肯定就跳不出了。 |
|
|
|
switch(key) case(key1):while(key2!=0) { led=_crol_(led,1); } case( key2 ):while(key1!=0):{led=0xff; delay(3s); led=~led; },刚想到的,类似于互锁。。。。。 |
|
|
|
看看~~~~~~~~~~~~~~~
|
|
|
|
楼主多看看程序,别人怎么显得,慢慢就找到感觉了,其实就那么些东西,肯下功夫就能学在手
|
|
|
|
本帖最后由 ntmusic 于 2014-3-21 12:46 编辑
写程序要讲究程序框架。比如按键事件和动作内容,可以将其分开,通过变量或标志来进行两者间的信号传递。尽量避免死循环条件!类似这样: void main() { Init();//程序初始化部分 while(1) { //按键扫描和按键事件处理部分 switch(KeyScan()) { case KEYA: Run_Mode=WATERLIGHT;break; case KEYB:Run_Mode=FLASHLIGHT;break; } //主功能实现部分 switch(Run_Mode) { case WATERLIGHT:WaterRun();breakl; case FLASHLIGHT:FlashRun();break; } } } |
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12028 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 12:17 , Processed in 0.964867 second(s), Total 96, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号