(玩电子) 电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机中按键“一次”处理的优化方法

作者:佚名   来源:本站原创   点击数:x  更新时间:2012年10月13日   【字体:

  以前做单片机的时候总会遇到一个问题就是:在单片机的键盘输入的键盘一次处理时,原来的做法通常是通过“延时”等待键盘的松开,所以单片机就会停留在此处,其他的程序进行不下去。会出现显示不正常、无响应等错误。

以前的程序如下:

其中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(100);

flag=1;

delay(5);

}

if(p10= =1&&flag= =1)//如果p10为1,flag为1说明已经被按下并抬起

{

TR0=!TR0;   //松开时相应

flag=0;   //标志清零,为下次按键做准备(其实为一次处理)

}

}

程序已经仿真,没改过的之前,长按按键数码管只有最后一个亮。

改过后长按按键,数码管显示正常。

细细回味非常有意思,和大家分享。

发表评论】【告诉好友】【收藏此文】【关闭窗口

文章评论

相关文章

14761大香蕉视频