按键处理的几种方法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

}

}

相关文档
最新文档