找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4655|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-16 02:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                        以前做单片机的时候总会遇到一个问题就是:在单片机的键盘输入的键盘一次处理时,原来的做法通常是通过“延时”等待键盘的松开,所以单片机就会停留在此处,其他的程序进行不下去。会出现显示不正常、无响应等错误。
以前的程序如下:
其中p10P10端口做键盘输入,p10= =0为按下,调用的delay程序为
voiddelay(unsigned int cnt)
{
unsigned char i;
while(cnt--!=0)
for(i=100;i!=0;i--);
}
键盘扫描子程序如下:
voidscankey()  //扫描按键
{
if(p10==0) //p10口按键及处理程序
      {
      delay(100);//键盘防抖动
      if(p10==0)
             {
             do delay(10);//如果键盘一直按下则一直“延时”等待松开
             while(p10==0);
             TR0=!TR0;   //松开时相应
             }
      }
}
所以从以上程序看如果程序一直按下则单片机一直会在延时程序等待,占用了整个单片机
我想通过flag可以很好的解决这个问题
bitflag=0; 定义标志
以下是键盘处理程序:
voidscankey()  //扫描按键
{

if(p10==0&&flag= =0) //p10口按键及处理程序,其中flag如果为1就不用再扫描
{
delay(10);
flag=1;
delay(5);
}
if(p10==1&&flag= =1)  //如果p101flag1说明已经被按下并抬起
{
TR0=!TR0;   //松开时相应
flag=0;   //标志清零,为下次按键做准备(其实为一次处理)
}
}
程序已经仿真,没改过的之前,长按按键数码管只有最后一个亮。
改过后长按按键,数码管显示正常。
细细回味非常有意思,和大家分享。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表