📄 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 ShowChinese(Uchar addr,Uchar chinese[],Uchar count); //显示汉字函数
extern void ShowEnglish(Uchar addr,Uchar *english,Uchar count); //显示英文函数
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};
//根据字型码定义英文、汉字
//"F1--English"
const Uchar F1English[]={0x46,0x31,0x2d,0x2d,0x45,0x6e,0x67,0x6c,0x69,0x73,0x68};
const Uchar lengthF1=11; //字符串长度
//"F2--汉字"
const Uchar F2English[]={0x46,0x32,0x2d,0x2d};
const Uchar lengthEF2=4;
const Uchar F2Chinese[]={0xba,0xba,0xd7,0xd6};
const Uchar lengthCF2=2;
//"Welcome"
const Uchar Welcome[]={0x57,0x65,0x6C,0x63,0x6F,0x6D,0x65};
const Uchar lengthW=7;
//"串行方式"
const Uchar Hanzi[]={0xB4,0xAE,0xD0,0xD0,0xB7,0xBD,0xCA,0xBD};
const Uchar lengthD=4;
//"Enter-回主菜单"
const Uchar MenuE[]={0x45,0x6E,0x74,0x65,0x72,0x2d};
const Uchar lengthEM=6;
const Uchar MenuC[]={0xbb,0xd8,0xd6,0xf7,0xB2,0xcb,0xb5,0xa5};
const Uchar lengthCM=4;
/*键盘初始化*/
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; //返回键值
}
//主菜单显示函数
void menu(){
LCDInit();
ShowEnglish(0x80,F1English,lengthF1);
ShowEnglish(0x90,F2English,lengthEF2);
ShowChinese(0x92,F2Chinese,lengthCF2);
}
/*键盘中断子程序*/
@interrupt void KeyISR(void){
Uchar KeyValue; //键值
Uchar OutValue; //键值的输出值
Uchar k;
INTKBSCR|=0x02; //将键盘状态和控制寄存器设置为屏蔽键盘中断请求
KeyValue=ReadKey(); //读键值
//将键值转换成输出值
for(k=0;k<16;k++){
if(KeyValue==KeyTable[k]){
OutValue=k;
}
}
//根据键值完成相应操作
switch(OutValue){
case 0: //"F1"显示英文
LCDInit();
ShowEnglish(0x80,Welcome,lengthW);
ShowEnglish(0x90,MenuE,lengthEM);
ShowChinese(0x93,MenuC,lengthCM);
break;
case 4: //"F2"显示汉字
LCDInit();
ShowChinese(0x80,Hanzi,lengthD);
ShowEnglish(0x90,MenuE,lengthEM);
ShowChinese(0x93,MenuC,lengthCM);
break;
case 15: //“回主菜单”
menu();
break;
}
KeyInit();
INTKBSCR|=0x04;
INTKBSCR&=~0x02;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -