独立按键检测技术讲解

独立按键根据其击键持续时间可分为短按和长按。在一键多功能技术中,短按和长按所实现的功能是不一样的。如mp3播放器中的下一曲按扭,短按时执行的功能是选择下一曲,而长按时则是当前歌曲的快进。一般将按键按下的时间小于1s以内的称为短按键,按键按下超过1s的称为长按。大部分单片机中所讲述的按键都属于短按功能。本节通过按键短按功能讲述独立按键的检测及软件防抖动的基本方法。如图所示的实验电路中,其按键检测程序代码如下:
sbit led0=p1^0; //定义led0为p1.0口sbit led1=p1^1; //定义led1为p1.1口sbit led2=p1^2; //定义led2为p1.2口sbit led3=p1^3; //定义led3为p1.3口sbit led4=p1^4; //定义led4为p1.4口void main(void) { unsigned char sw; //定义按键检测中间变量 while(1) { sw=p2&0x1f; //屏蔽p2口高3位 switch(sw) { case 0x1e: led0=0 ; //执行sw1按下的功能 break; case 0x1d: led1=0 ; //执行sw2按下的功能 break; case 0x1b: led2=0 ; //执行sw3按下的功能 break; case 0x17: led3=0 ; //执行sw4按下的功能 break; case 0x0f: led4=0 ; //执行sw5按下的功能 break; default: //没键按下 退出 break; } }}独立按键检测技术一般是通过检测与按键相连的i/o口线的状态。由图可知当按键按下时,与其连接的i/o口线将向单片机系统输入低(单片机读取的值是0)。因此通过检测i/o口是否有低输入可判断是否有按键按下。上述程序能够检测到按键按下,检测不到按键释放的,每次只能检测到一个按键,同一时刻有两个或以上的按键按下时按键无效(无按键按下)。而且没有添加软件去抖动功能,但是它提供了一种按键检测的基本思路。另外读者还可通过条件判断语句if来检测按键的状态。下面介绍一种具有软件防抖动功能,能检测按键释放、闭合的程序。其程序在结构上可分为两部分:主函数、防抖动延时函数。
主函数通过switch语句检测出被按下的按键,并执行被按下按键的任务。当检测到按键按下后并没有马上执行按键的任务而是延时10ms躲开按键机械抖动(如果此时立即执行按键功能,可能是误动作,因为有可能是外界干扰引起瞬间起与按键相连的i/o口线为低电平)。然后再检测按键是否还处在闭合状态,如果仍然处在闭合状态,则执行按键的任务。反之则退出。其程序代码如下:
sbit sw1=p2^0; //定义sw1为p2.0口sbit sw2=p2^1; //定义sw1为p2.1口sbit sw3=p2^2; //定义sw1为p2.2口sbit sw4=p2^3; //定义sw1为p2.3口sbit sw5=p2^4; //定义sw1为p2.4口sbit led0=p1^0; //定义led0为p1.0口sbit led1=p1^1; //定义led1为p1.1口sbit led2=p1^2; //定义led2为p1.2口sbit led3=p1^3; //定义led3为p1.3口sbit led4=p1^4; //定义led4为p1.4口void main(void) { unsigned char sw; while(1) { sw=p2&0x1f; //屏蔽p2口高3位 switch(sw) { case 0x1e: //判断是不是sw1闭合 delay(10); //延时去抖动 if(!sw1) //再次确认sw1闭合 { led0=!led0 ; //执行sw1按下的功能 while(!sw1); //等待按键释放 delay(5); //延时去抖动 } break; case 0x1d: //判断是不是sw2闭合 delay(10); //延时去抖动 if(!sw2) //再次确认sw2是否闭合 { led1=!led1 ; //执行sw2按下的功能 while(!sw2); //等待按键释放 delay(5); //延时去抖动 } break; case 0x1b: //判断是不是sw3闭合 delay(10); //延时去抖动 if(!sw3) //再次确认sw3是否闭合 { led2=!led2 ; //执行sw3按下的功能 while(!sw3); //等待按键释放 delay(5); //延时去抖动 } break; case 0x17: //判断是不是sw4闭合 delay(10); //延时去抖动 if(!sw4) //再次确认sw4是否闭合 { led3=!led3 ; //执行sw4按下的功能 while(!sw4); //等待按键释放 delay(5); //延时去抖动 } break; case 0x0f: //判断是不是sw5闭合 delay(10); //延时去抖动 if(!sw5) //再次确认sw5是否闭合 { led4=!led4 ; //执行sw5按下的功能 while(!sw5) //等待按键释放 delay(5); //延时去抖动 } break; default: //没键按下 退出 break; } }}

恩智浦全新MCUXpresso工具集为嵌入式应用简化软件开发
能耗监测系统属于消防还是智能化
工业和信息化部与国际电信联盟高级别研讨会在深圳举行
2019世界机器人博览会观众“分类”,看看你是什么观众?
Precision constant-current sin
独立按键检测技术讲解
Realtime Robotics 定制运动规划芯片,帮助自动驾驶汽车做出更好的决策
RFID 中间件的特征及作用介绍
小型室外气象站以及自动气象站的技术参数介绍
8051内部ROM
亚马逊新智能音箱Echo Show发布众人欢喜 却被指抄袭这家公司?
荣耀8青春版跑分曝光 单核和多核跑分成绩逆天!
智能家居市场大战,四大科技巨头智能家居PK战!
OmniVision新款图像传感器为智能手机提供高质量视频拍摄
一文看懂焊接机器人使用说明书
土壤含水率测定仪的功能及技术参数
化肥成分检测仪的仪器特点的详细介绍
自动控制系统的组成
ZLG:这篇推文,我们准备了一年
华为全光Wi-Fi改造800平别墅的过程