📄 key.c
字号:
// 本例程中采用4*4键盘
// 0xEE,"F1",0xDE,"1", 0xBE,"2",0x7E,"3",
// 0xED,"F2",0xDD,"4", 0xBD,"5",0x7D,"6",
// 0xEB,"F3",0xDB,"7", 0xBB,"8",0x7B,"9",
// 0xE7,"F4",0xD7,"Clear",0xB7,"0",0x77,"Enter"
// 由于GP32的PTA口兼有键盘中断功能,因此将键盘的行、列共8条线连接到PTA口上,
// 其中行1-4连接到PTA0-3上,列1-4连接到PTA4-7上。
// 这里提供一个键盘编程实例,涉及如何扫描键盘获得键值,中断获取键值,键盘编码等问题。
// 在编程时将PTA0-3定义为输出,将PTA4-7定义为输入并具有内部上拉电阻,
// 那么"F1"键对应于PTA7~PTA0=11101110,即0xEE;
// "1"键对应于PTA7~PTA0=11011110,即0xDE;
// "Enter"键对应于PTA7~PTA0=01110111,即0x77。
#include "gp32.h"
typedef unsigned int Uint;
typedef unsigned char Uchar;
extern void DisplayEnglish(void); //F1显示英文字符
extern void DisplayChinese(void); //F2显示汉字字符
extern void ComCurScroll(void); //F3光标滚动
extern void ComScrScroll(void); //F4屏幕滚动
extern void LCDInit(void); //LCD初始化函数
const Uchar KeyValue[]={0xfe,0xfd,0xfb,0xf7}; /*逐行扫描的PTA口值*/
const Uchar KeyTable[16]={0xEE,0xDE,0xBE,0x7E, //4X4键盘的键值
0xED,0xDD,0xBD,0x7D,
0xEB,0xDB,0xBB,0x7B,
0xE7,0xD7,0xB7,0x77};
/*键盘初始化*/
void KeyInit(void){
PTA=0x00;
DDRA=0x0f; //定义PTA的高4位输入,低4位输出
PTAPUE=0xf0;
INTKBIER=0xf0; //定义PTA的高4位具有内部上拉电阻
}
/*读按键值*/
Uchar ReadKey(void){
Uchar temp,tempdata,key;
Uint k;
for(k=0;k<4;k++){ //依次扫描四行
temp=KeyValue[k]; //使第k根行扫描线为低电平
tempdata=PTA; //
tempdata|=0x0F; //PTA4-7保留原态,令PTA0-3为1
tempdata&=temp;
PTA=tempdata;
tempdata=PTA;
tempdata&=0xF0;
if (tempdata!=0xf0) {
key=PTA;
goto readkey1;
}
}
readkey1: return key;
}
/*键盘中断*/
@interrupt void KeyISR(void){
Uchar KeyValue;
Uint OutValue;
Uchar k;
INTKBSCR|=0x02;
KeyValue=ReadKey();
for(k=0;k<16;k++){
if(KeyValue==KeyTable[k]){
OutValue=k;
}
}
switch(OutValue){
case 0: //F1显示英文字符
DisplayEnglish();
break;
case 4: //F2显示汉字字符
DisplayChinese();
break;
case 8: //F3光标滚动
ComCurScroll();
break;
case 12: //F4屏幕滚动
ComScrScroll();
break;
case 13: //"Clear"
WRCommand(0x01); //清屏
}
KeyInit();
INTKBSCR|=0x04; //将键盘状态和控制寄存器设置为清键盘中断请求
INTKBSCR&=~0x02; //将键盘状态和控制寄存器设置为开键盘中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -