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

📄 keyscan.c

📁 用中断实现的一个四*四的键盘程序。在Keil C下开发的。程序通过。
💻 C
字号:
/*
0x18   0x14    0x12    0x11
0x28   0x24    0x22    0x21
0x48   0x44    0x42    0x41
0x88   0x84    0x82    0x81
*/




#include<at89x52.h>

#define uint unsigned int
#define uchar unsigned char


void init();
void key_scan();

bit int1_flag;
uchar key=0;

void main(){
	init();
	while(1){
	if(int1_flag){
		switch(key){
			case 0x11: P0=0xfe; break;
			case 0x12: P0=0xfd; break;
			case 0x14: P0=0xfb; break;
			case 0x18: P0=0xf7; break;

			case 0x21: P0=0xef; break;
			case 0x22: P0=0xdf; break;
			case 0x24: P0=0xbf; break;
			case 0x28: P0=0x7f; break;
			
			case 0x41: P0=0xfe; break;
			case 0x42: P0=0xfc; break;
			case 0x44: P0=0xf8; break;
			case 0x48: P0=0xf0; break;

			case 0x81: P0=0xe0; break;
			case 0x82: P0=0xc0; break;
			case 0x84: P0=0x80; break;
			case 0x88: P0=0x00; break;
		}
		int1_flag=0;	
	}
}
}
void init(){
	//IE=0x84;//中断总控制位EA、外中断1开中断
	IE=0xff;
	IP=0x04;//外中断1为高中断优先级
	TCON=0x05;
	int1_flag=0;
	P2=0x0f;
	}

void key_scan() interrupt 2
{   
	uint t;
	uchar keycode,scancode,flag=0xff;
	int1_flag=1;
	t=5000;
	while(t--);
	if(INT1==1) return ; //如果此时键盘中断为高电平,则是拌动
	EX1=0;//关键盘中断
	scancode=0xef;
	while(scancode!=0xff){
		P2=scancode;//输入扫描码,行,1110 1111
		keycode=P2;//读出数据,看是否再些行上的某列键盘按下
		if((keycode&0x0f)!=0x0f) break;//扫描到按上的键,则退出
		scancode=(keycode<<1)|0x0f;//否刚,更新扫描码,下一行,继续扫描
		}

    keycode=~keycode;//方便读数
	key=keycode;//传给全局变量KEY
//	if(keycode==0x11) 
//	else ;
	P2=0x0f;
	while(1){//看按键是否被释放
		if(INT1==0){
			flag=~flag;
			if(flag==0) break;
			}
		 t=10000;
		 while(t--);
		 }
	EX1=1;
	return ;
	}








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -