📄 按键处理 处理一键多能.c
字号:
/*[原创]按键处理 处理一键多能
受到21IC程序匠人的《多种击键类型的处理流程图》启发,自己重新整理,编写了这几个按键处理程序,经过AT89S51和4*4键盘的配合测试,发现效果良好,达到了较好的实时性。
这里只给出简单单击处理源程序*/
//一般短按键处理程序
//占用定时器0,闪烁时间10ms
//有效仿抖,时时性较高只能处理单击按键,目前和4*4键盘扫描程序一起使用
//------------------------------------
// 单击键盘控制程序
// 作者:张子墨
// 最后更新时间:2006/11/21
// 当前版本:0.90
// 测试MCU:AT89S51
//------------------------------------
#include <at89s53.h>
#include "4_4KeyScan.c" //配套键盘扫描程序,获得键码
#include "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; //按键标志没有处理
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -