|
按键处理 处理一键多能
相关连接:《匠人手记》21《多种击键类型的处理流程图》
受到21IC程序匠人的《多种击键类型的处理流程图》启发,自己重新整理,编写了这几个按键处理程序,经过AT89S51和4*4键盘的配合测试,发现效果良好,达到了较好的实时性。
这里只给出简单单击处理源程序
//一般短按键处理程序 //占用定时器0,闪烁时间10ms //有效仿抖,时时性较高只能处理单击按键,目前和4*4键盘扫描程序一起使用
//------------------------------------ // 单击键盘控制程序 // 作者:张子墨 // 最后更新时间:2006/11/21 // 当前版本:0.90 // 测试MCU:AT89S51 //------------------------------------
#i nclude <at89s53.h> #i nclude "4_4KeyScan.c" //配套键盘扫描程序,获得键码 #i nclude "12864_Driver.c" //临时显示效果使用
#define TIMER0VALUE_H 0xDC //定时器0高位 #define TIMER0VALUE_L 0x00 //定时器0低位 //11.0592晶振定时10ms
unsigned char Key_Num = 0x00; //本次键码 unsigned char Key_Backup = 0x00; //备份键码
bit Key_Dis_F = 0; //按键禁止响应 bit Key_Scan_F = 0; //按键检测使能,中断每10MS置有效
//----------------------------- // //测试程序用的全局变量,对于主功能没有影响 // //----------------------------- unsigned char i = 0;
//----------------------------- // // 定时器0初始化函数 // //-----------------------------
void Timer0Init (void) { TMOD |= 0x01; //定时器0工作模式1 IE |= 0x82; //EA = 1;ET0 = 1; TH0 = TIMER0VALUE_H; TL0 = TIMER0VALUE_L; TR0 = 1; }
//----------------------------- // // 定时器0中断服务函数 // //-----------------------------
void Timer0SRV (void) interrupt 1 using 2 { TH0 = TIMER0VALUE_H; //重装初值 TL0 = TIMER0VALUE_L; TR0 = 1; Key_Scan_F = 1; //允许扫描键盘 }
//----------------------------- // // 临时测试按键效果函数,实际应用修改为散转函数 // //-----------------------------
void ShortKeyAction (void) { Font[i++] = Key_Num; SentAData(Key_Num); if(i>32) { i = 0; SentAIns (0x01); SentAIns (0x80); } }
//----------------------------- // // 按键扫描控制函数 // //-----------------------------
void KeyDeal (void) { Key_Scan_F = 0; //表示10ms周期内扫描完成,等待新的周期 Key_Num = KeyCodeConvert (GetKeyCode()); //获得最新键盘编码 根据实际情况,使用不同的扫描程序 if((Key_Num!=0x00)&&(Key_Num == Key_Backup)) //如果有按键并且与上次相同 { if(!Key_Dis_F) //如果当前按键没有操作 { ShortKeyAction(); //进入处理散转 Key_Dis_F = 1; //表示按键处理完成 } } else //否则没有按键或者按键变化 { Key_Backup = Key_Num; //重新记录按键码 Key_Dis_F = 0; //按键标志没有处理 } }
|