锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

按键另类处理高效程序V1.0

时间:2024-05-07 22:37:09

嗨!..大家好,我是。本人学51单片机到现在基本是掌握了8成了,打算再过一阵子学习和了。现在给大家出一套本人自己开发的按键程序,本程序占用资源极低,并且支持长按连续执行。举个例子,如果你在调节分钟,那么长按的话会连续按照150ms的速度连加或者连减。此版本暂时不支持长按短按识别!工作原理:一般的按键处理采用延时避开抖动,并且通过while语句识别弹起,这样在延时就浪费了时间不说,就那个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_COR=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;
}
}

}
}


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章