独立按键根据其击键持续时间可分为短按和长按。在一键多功能技术中,短按和长按所实现的功能是不一样的。如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;
}
}
}
全部0条评论
快来发表一下你的评论吧 !