按键处理的几种方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
新型的按键扫描程序
核心算法:
unsigned char Trg;
unsigned char Release;
unsigned char Cont;
void KeyRead( void )
{
unsigned char ReadData = PINB^0xff; 这里具个简单例子,为了只是说明原理,PB0是模式按键,短按则切换模式,PB1就是加,如果长按的话则连加(玩过电子表吧?没错,就是那个!)
#define KEY_MODE 0x01 .......
while
{
if (time_10ms_ok) ..................//点亮C_LED,关闭A_LED 和B_LED
}
}
}
=================================================
单个按键复用:单击,长按,双击。
2011-09-16 11:13
闲着无事在网上逛,产生按键复用的想法。前些天找按键复用程序,在网上很难找到,有些收费的代码是我们不会买的。所以借鉴了一位老师的代码,自己改了改。
刚开始调试不成功,后来成了。
/****************************************************************************** **
实验目的:按键的长按,短按,双击检测
******************************************************************************* */
#include <>
#define uint unsigned int
#define uchar unsigned char
uchar key_num; //按键计数变量
bit key_long_flag,key_short_flag,key_double_flag; //长按标志位,短按标志位,双击标志位
sbit key=P1^0; //独立按键接P1^0
/************************ms延时函数**************************/
void delay_ms(uint ms)
{
uchar x;
while(ms--)
for(x=0;x<123;x++);
}
/***************************按键扫描*************************/
void key_scan()
{
uchar key_down_time,key_up_time; //”按下“时长
key_down_time=0; //“按下”时长计数器清零
key_up_tim e=0; //“释放”时长计数器清零
if(key==0) //如按键key按下
{
delay_ms(20); //延时消抖
if(key==0)
{ //如按键key按下
do{ //“按下”计数器开始计数
key_down_time++;
delay_ms(10);
}while(key==0);
if(key_down_time<50) //如“按下”计数小于设定值(短击的最大限制值)
{
delay_ms(20); //延时消抖
do { //“释放”计数器开始计数
key_up_time++;
delay_ms(10);
}while((key_up_time<40)&&(key==1));//当超出设定值或再次有“按下”事件发生,结束计数
delay_ms(20); //延时(消抖)
do { //待到第二次的“按下”事件结束
}while(key==0);
if(key_up_time<40) key_double_flag=1;
else key_short_flag=1; //在释放期间提前结束的为双击,否则为短击
}
else
{
key_long_flag=1; //长击标志位置“1”
}
}
}
}
/******************************主函数**********************************/
void main()
{
while(1) //不断循环,检测按键
{
key_scan();
if(key_short_flag==1)
{
P0=0xfe; //单击亮1个灯
key_short_flag=0; //清零标志位 }
if(key_long_flag==1)
{
P0=0x00; //长按全亮
key_long_flag=0;
}
if(key_double_flag==1)
{
P0=0xf0; //双击亮4个灯
key_double_flag=0;
}
}
}