完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
在网上看到这篇心得,感觉还是很实用的小问题,转来希望大家共同学习,
在网上看了《单片机按键一次处理的优化方法》这篇文章,很有点启发,不过我疑惑的是第二个程序中的消除抖动语句怎么没了,再查发现网上所有的文章都一模一样,难道所有人都完全懂了,所有人都没有我这个困惑~,求解释 以前做单片机的时候总会遇到一个问题就是:在单片机的键盘输入的键盘一次处理时,原来的做法通常是通过“延时”等待键盘的松开,所以单片机就会停留在此处,其他的程序进行不下去。会出现显示不正常、无响应等错误。 以前的程序如下: 其中p10为P10端口做键盘输入,p10= =0为按下,调用的delay程序为 void delay(unsigned int cnt) { unsigned char i; while(cnt--!=0) for(i=100;i!=0;i--); } 键盘扫描子程序如下: void scankey() //扫描按键 { if(p10==0) //p10口按键及处理程序 { delay(100);//键盘防抖动 if(p10==0) { do delay(10);//如果键盘一直按下则一直“延时”等待松开 while(p10==0); TR0=!TR0; //松开时相应 } } } 所以从以上程序看如果程序一直按下则单片机一直会在延时程序等待,占用了整个单片机 我想通过flag可以很好的解决这个问题 bit flag=0; 定义标志 以下是键盘处理程序: void scankey() //扫描按键 { if(p10= =0&&flag= =0) //p10口按键及处理程序,其中flag如果为1就不用再扫描 就是这里,没有消抖动了~是怎么回事咧 { delay(10); flag=1; delay(5); } if(p10= =1&&flag= =1) //如果p10为1,flag为1说明已经被按下并抬起 { TR0=!TR0; //松开时相应 flag=0; //标志清零,为下次按键做准备(其实为一次处理) } } 程序已经仿真,没改过的之前,长按按键数码管只有最后一个亮。 改过后长按按键,数码管显示正常。 细细回味非常有意思,和大家分享。 |
|
相关推荐
6 个讨论
|
|
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16901 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 03:31 , Processed in 0.784921 second(s), Total 45, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3744