嗨!..我们好,我是SUNNY。自己学51单片机到现在根本是把握了8成了,计划再过一阵子学习AVR和ARM了。现在给我们出一套自己自己开发的按键程序,本程序占用资源极低,并且支撑长按接连履行。举个比如,假如你在调理分钟,那么长按的话会接连依照150ms的速度连加或许连减。此版别暂时不支撑长按短按辨认!作业原理:一般的按键处理选用延时避开颤动,并且通过while句子辨认弹起,这样在延时就浪费了CPU时刻不说,就那个while句子就使程序死了,其他都不履行,并且难以做到长按。自己依据windows键盘原理,选用守时辨认法,以150ms扫描一次键盘,假如按键按下就读键值,通过不同的键值处理不同的程序。自己通过屡次实验,150ms刚刚好,不光有用避开颤动,并且履行速度刚好在人的辨认范围内。自己下面这个比如是两个按键操控两个数码管的数添加或许削减,99最大!不废话,下面是程序:
我之前有写过单片机做的相似PLC的操控板!用守时器以3.3ms的速度扫描I/O口,当接连比较三次相同则以为的确改变了并设置对应缓存,假如三次不同则以为是搅扰,保持原状况,简练高效,长按检测只需要参加接连比较相同的次数就可以完成了!这种办法根本不会占用CPU太多时刻,十分实践,+ M ` W$ A; ]+ }
void time0_prg() interrupt 1 using 1 //中止进口1程序 输入I/O扫描
{ //以3.3ms的速度扫描输入I/O,并将数据放入内存缓存区以便后续输入滤波处理
TH0 = 0x0F3; //12M 3.3ms
TL0 = 0x1C; //设置中止扫描时刻
WDT_CONTR=0x38; //喂狗 (3.3ms改写看们狗)
key_buffer[nc1+1]=in_put; //扫描输入
if(nc1>=2) nc1=0; //NC1 计时器 扫描触发时钟 U1 e6 P% r: W1 f; j; p
else nc1++;
void in_scan() //输入滤波输入抗搅扰处理
{ //原理:比较每个输入I/O的接连三次凹凸电位状况当某I/O接连3次数据不同的时分
uchar n1,n2; //则以为是搅扰!当接连的某位3次数据相同则以为I/O的确改变了!并输出相应位的改变
for(n1=0;n1<8;n1++) //比较8个I/O口
{ 7 D- q* R7 q9 b
n2=key_buffer[1]&key_constant[n1];
– T1 X0 d0 _& R8 q f
if(n2==(key_buffer[2]&key_constant[n1]))
{
if(n2==(key_buffer[3]&key_constant[n1]))
{
if(n2) in_buffer=in_buffer&~key_constant[n1]; //检测到三次输入相同为0, 则判别输入对应位为0;
else in_buffer=in_buffer|key_constant[n1]; //检测到三次输入相同为1, 则判别输入对应位为1;
}
}
}
}