尽管用一般的延时函数可以完成按键长按与短按的判别,但是在实践的工程使用和项目开发中并不好用也不灵敏。更多得是凭借守时器的距离守时来核算按键从按下到松开的时刻距离,然后经过判别该时刻值来区别按键长按与短按的状况。
在新大陆国赛设备的黑色Zigbee模块上,或许小蜜蜂制造的XMF09B和XMF09C中,按键SW1短按,切换D5灯的开关状况;按键SW1长按,切换D6灯的开关状况。
按键SW1———-P1_2
D5灯————-P1_3(高电平点亮)
D6灯————-P1_4(高电平点亮)
【完成思路】
《1》 界说一个变量K_Press,标志按键状况。按键在按下状况时,值为1;按键在松开状况时,值为0。
《2》 界说一个变量count_t,核算按键处在按下状况的时刻,也便是K_Press为1时的时刻。
《3》 在按键松开后,经过判别count_t的值来区别按键长按与短按状况。
《4》 每处理完一个按键状况,随行将count_t清0。
【完成代码】
#include “ioCC2530.h”
#define D3 P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW1 P1_2
unsigned char K_Press = 0;
unsigned char count_t = 0;
/*=======================简略的延时函数========================*/
void Delay(unsigned int t)
{
while(t–);
}
/*======================端口初始化函数========================*/
void Init_Port()
{
P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口输出
P1SEL &= ~0x04; //P1_2作为通用I/O端口
P1DIR &= ~0x04; //P1_2端口输入
P1INP &= ~0x04; //P1_2设置为上拉/下拉形式
P2INP &= ~0x40; //P1_2设置为上拉
D3 = 0;
D4 = 0;
D5 = 0;
D6 = 0;
}
/*=======================守时器1初始化========================*/
void Init_TImer1()
{
T1CC0L = 0xd4;
T1CC0H = 0x30; //16MHz时钟,128分频,守时0.1秒
T1CCTL0 |= 0x04; //敞开通道0的输出比较形式
T1IE = 1;
EA = 1;
T1CTL = 0x0e; //分频系数是128,模形式
}
/*====================守时器1服务函数========================*/
#pragma vector = T1_VECTOR
__interrupt void TImer1_int()
{
T1STAT &= ~0x20; //铲除守时器1的溢出中止标志位
if(K_Press != 0) //按键按下
{
count_t++; //核算按下按下的时刻值
}
}
/*====================按键扫描处理函数========================*/
void Scan_Keys()
{
if(SW1 == 0)
{
Delay(100); //去颤动处理
if(SW1 == 0)
{
K_Press = 1; //标志按键正在按下
while(SW1 == 0); //等候按键松开
K_Press = 0; //标志按键现已松开
if(count_t 》 5) //按键长按
{
D6 = ~D6;
}
else //按键短按
{
D5 = ~D5;
}
count_t = 0; //按键计数值清零
}
}
}
/*=========================主函数=============================*/
void main()
{
Init_Port();
Init_TImer1();
while(1)
{
Scan_Keys();
}
}