单片机中按键“一次”处理的优化方法
时间:11-29
来源:互联网
点击:
以前做单片机的时候总会遇到一个问题就是:在单片机的键盘输入的键盘一次处理时,原来的做法通常是通过“延时”等待键盘的松开,所以单片机就会停留在此处,其他的程序进行不下去。会出现显示不正常、无响应等错误。
以前的程序如下:
其中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;//标志清零,为下次按键做准备(其实为一次处理)
}
}
程序已经仿真,没改过的之前,长按按键数码管只有最后一个亮。
改过后长按按键,数码管显示正常。
单片机优化方 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)