⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 单片机与液晶控制器为ST7920液晶显示C语言程序设计
💻 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 + -