按键处理c语言源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按键处理c语言源程序
//一般短按键处理程序
//占用定时器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; //按键标志没有处理
}
}
//区分支持短击和长击的按键处理程序
//占用定时器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
#define AN_XD_NUM 2 //按键消抖常量,消抖时间大约2*10ms
#define AN_CA_NUM 100 //常按计数器,如果持续按键时间大于100*10MS,判断为长按
unsigned char Key_Num = 0x00; //本次键码
unsigned char Key_Backup = 0x00; //备份键码
unsigned char Key_Cjnum = 0; //长按计数器
bit Key_Dis_F = 0; //按键禁止响应
bit Key_Scan_F = 0; //按键检测使能,中断每10MS置有效
//-----------------------------
//
//测试程序用的全局变量,对于主功能没有影响
//
//-----------------------------
unsigned char Font[16];
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)
{
SentAData(Key_Backup);
i++;
if(i>32)
{
i = 0;
SentAIns (0x01);
SentAIns (0x80);
}
}
/-----------------------------
//
// 临时测试长击效果函数,实际应用修改为散转函数
//
//-----------------------------
void LongKeyAction (void)
{
SentAIns (0x01);
SentAIns (0x80);
for(i=0;i<16;i++) SentAData ('A'+i);
}
//-----------------------------
//
// 按键扫描控制函数
//
//-----------------------------
void KeyDeal (void)
{
Key_Scan_F = 0; //表示10ms周期内扫描完成,等待新的周期
Key_Num = KeyCodeConvert (GetKeyCode()); //获得最新键盘编码 根据实际情况,使用不同的扫描程序
if((Key_Num!=0x00)&&(Key_Num == Key_Backup)) //如果有按键并且与上次相同(按键没有松开)
{
if(!Key_Dis_F) //并且按键没有处理
{
Key_Cjnum++; //长击计数器自加
if(Key_Cjnum>=AN_CA_NUM) //当大于设定长击时间时判断为长击按键类型
{
LongKeyAction (); //长击散转函数
Key_Cjnum = 0; //计数器清零
Key_Dis_F = 1; //按键处理标志为处
理完成
}
Key_Backup = Key_Num; //记录新键码
}
}
else //如
果按键已经变化或者松开
{
if((!Key_Dis_F)&&(Key_Cjnum >= AN_XD_NUM)&&(Key_Cjnum < AN_CA_NUM)) //如果按键没有处理而且按键时长大于防抖时间且小于长击时长
{
ShortKeyAction (); //判断为短击,执行短击散转函数 根据旧按键码
Key_Cjnum = 0; //计数器清零
Key_Dis_F = 1; //按键处理标志为处理完成,防止
}
Key_Backup = Key_Num; //记录新键码
Key_Dis_F = 0; //标志可以接受新的按键指令
}
}
//区分支持短击,长按按键处理程序
//占用定时器0,闪烁时间10ms
//有效仿抖,时时性较高只能处理单击按键,目前和4*4键盘扫描程序一起使用
//------------------------------------
// 区分支持短击,长按按键处理程序
// 作者:张子墨
// 最后更新时间:2006/11/22
// 当前版本: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
#define AN_XD_NUM 2 //按键消抖常量,消抖时间大约2*10ms
#define AN_CA_NUM 100 //常按计数器,如果持续按键时间大于10*10MS,判断为长按
#define AN_XH_NUM 25 //长按循环执行时间间隔 时间越短,选换执行越快
unsigned char Key_Num = 0x00; //本次键码
unsigned char Key_Backup = 0x00; //备份键码
unsigned char Key_Cjnum = 0; //长按计数器
bit Key_Dis_F = 0; //按键禁止响应
bit Key_Scan_F = 0; //按键检测使能,中断每10MS置有效
bit Key_Xh_F = 0; //按键循环执行标志,置一表示循环执行
//--------------------------------------
//
// 测试用数组、计数器,实际程序可以删除
//
//--------------------------------------
unsigned char Font[16];
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;
}
//--------------------------------------
//
// 定时器中断服务程序
// 每10ms允许扫描按键标志有效
//
//--------------------------------------
void Timer0SRV (void) interrupt 1 using 2
{
TH0 = TIMER0VALUE_H;
TL0 = TIMER0VALUE_L;
TR0 = 1;
Key_Scan_F = 1;
}
//--------------------------------------
//
// 测试用短击按键处理函数,实际应用应修改为散转函数
//
//--------------------------------------
void ShortKeyAction (void)
{
i++;
SentAData(Key_Backup);
if(i>32)
{
i = 0;
Sen
tAIns (0x01);
SentAIns (0x80);
}
}
//--------------------------------------
//
// 测试用长按循环处理函数,实际应用应
修改为散转函数
//
//--------------------------------------
void CycKeyAction (void)
{
SentAData('a');
}
//--------------------------------------
//
// 核心处理函数,根据不同情况,确定按键种类
//
//--------------------------------------
void KeyDeal (void)
{
Key_Scan_F = 0; //允许扫描标志置“无效”
Key_Num = KeyCodeConvert (GetKeyCode()); //获取按键码,实际可以使用其它键盘扫描程序
if((Key_Num!=0x00)&&(Key_Num == Key_Backup)) //如果按键有效,不是空键而user31/ZZMHAS/upload/210283440.rar