微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机按键的问题(转)

单片机按键的问题(转)

时间:10-02 整理:3721RD 点击:
在网上看到这篇心得,感觉还是很实用的小问题,转来希望大家共同学习,
在网上看了《单片机按键一次处理的优化方法》这篇文章,很有点启发,不过我疑惑的是第二个程序中的消除抖动语句怎么没了,再查发现网上所有的文章都一模一样,难道所有人都完全懂了,所有人都没有我这个困惑~,求解释

以前做单片机的时候总会遇到一个问题就是:在单片机的键盘输入的键盘一次处理时,原来的做法通常是通过“延时”等待键盘的松开,所以单片机就会停留在此处,其他的程序进行不下去。会出现显示不正常、无响应等错误。
以前的程序如下:
其中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;    //标志清零,为下次按键做准备(其实为一次处理)
}
}
程序已经仿真,没改过的之前,长按按键数码管只有最后一个亮。
改过后长按按键,数码管显示正常。
细细回味非常有意思,和大家分享。

确实没消抖,按下执行第一个if,松开执行第二个if!

优先级问题

学习!

我还有个疑问,第一个if里面的delay()函数不是一样占用cpu的资源吗?其他程序照样不能执行。

我也不太理解

谢了,解决了我当下的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top