按键程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <rLeabharlann Baidug52.h> #include "xwj_hlkey.h"
// P1口行列式键盘 //
#define KEYDELAY 25 /*首键延迟次数*/ #define KEYLOOP 10 /*连续键间隔次数,需小于KEYDELAY*/ unsigned char key_bak; unsigned char key_temp; unsigned char key_old; unsigned char key_data; bit key_ok; // P1口行列式键盘 // #define KEYPIN_L P1 #define KEYPIN_H P1 // 定义键扫描列端口为 P1 低四位输入 // // 定义键扫描行端口为 P1高四位扫描输出 // // 根据键盘映射表输出顺序键值 //
有键?
N
和上次相同?
Keyold++
退出
N Keyold=首键延时 KEYDELAY?
Keyok=1 保存键值到Keydata Keyold=KEYDELAY-KEYLOOP (按住不放的延时)
Y
Y
N Keyold=0? N
Y Y
Keyold=0
Keyok=1 保存键值到Keydata Keyold=0
unsigned char KeyGetCode(void) { key_ok=0; return(key_data); } bit KeyTest(void) { KeyScan(); return(key_ok); }
//返回按键码
//检查有无按键 //键扫描
// 内部私有函数 // unsigned char fnKeyCode(unsigned char key);
// P1口行列式键盘 // //---------------------------------------------------------------------------// void KeyScan(void) // 键扫描 { unsigned char sccode,recode; KEYPIN_L = KEYPIN_L|0x0f; // P1低四位为列线输入 // KEYPIN_H = KEYPIN_H&0x0f; // P1高四位为行线发全零扫描码 // if ((KEYPIN_L&0x0f) != 0x0f) //有键按下 { key_temp = 键值 ; //键扫描,获得键值 if (key_temp == key_bak) { key_old++; if (key_old==KEYDELAY) //连续键, 不要则把此if屏蔽 { key_ok=1; key_data=fnKeyCode(key_temp); //键解码 key_old=KEYDELAY-KEYLOOP; } } else { key_old=0; key_bak=key_temp; } } else // 键抬起 { if (key_old) { key_ok=1; key_data=fnKeyCode(key_temp); // 键解码 /* if (key_old==100) //加上时间,不同时间不同功能, 与连续键冲突 { bp(1); key_data += 0x10; } if (key_old==200) { bp(2); key_data += 0x20; } */ } key_old=0; } KEYPIN_H = KEYPIN_H|0xf0; } //---------------------------------------------------------------------------//