📄 keyscan.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 + -