单片机中按键“一次”处理的优化方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delay(100);//键盘防抖动 if(p10==0) { do delay(10);//如果键盘一直按下则一直“ 延时”等待松开 while(p10==0); TR0=!TR0; //松开时相应 } } } 所以从以上程序看如果程序一直按下则单片机一直会 在延时程序等待,占用了整个单片机 我想通过 flag 可以很好的解决这个问题 bit flag=0;定义标志 以下是键盘处理程序: void scankey() //扫描按键 {
单片机中按键“一次”处理的优化方法
以前做单片机的时候总会遇到一个问题就是:在单 片机的键盘输入的键盘一次处理时,原来的做法通常是 通过“延时”等待键盘的松开,所以单片机 就会停留在此处,其他的程序进行不下去。会出现显示 不正常、无响应等错误。
以前的程序如下: 其中 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 口按键及处理程序 {
if(p10= =0&&flag= =0)//p10 口按键及处理程序,其 中 flag 如果为 1 就不用再扫描
{ delay(100); flag=1; delay(5); } if(p10= =1&&flag= =1)//如果 p10 为 1,flag 为 1 说明已经被按下并抬起 { TR0=!TR0; //松开时相应 flag=0; //标志清零,为下次按键做准备(其实为一次处理) } } 程序已经仿真,没改过的之前,长按按键数码管只有 最后一个亮。 改过后长按按键,数码管显示正常。 细细回味非常有意思,和大家分享。