📄 1keyscan.c
字号:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_3=P1^3;
uchar scanflag=0;
uchar code table[]={0x3f,0x06,0x5b,0x4f, //0-3
0x66,0x6d,0x7d,0x07, //4-7
0x7f,0x6f,0x77,0x7c, //8-B
0x39,0x5e,0x79,0x71,0x40}; //C-F共阴极段码
void delay(void);
uchar keyscan(void);
void display(uchar k);
void main(void)
{
uchar key=16,temp=0;
while(1)
{
temp=keyscan();
if (scanflag==1)
{
scanflag=0;
switch(temp)
{
case 0x82: //键0
key=0;
break;
case 0x11: //键1
key=1;
break;
case 0x12: //键2
key=2;
break;
case 0x14: //键3
key=3;
break;
case 0x21: //键4
key=4;
break;
case 0x22: //键5
key=5;
break;
case 0x24: //键6
key=6;
break;
case 0x41: //键7
key=7;
break;
case 0x42: //键8
key=8;
break;
case 0x44: //键9
key=9;
break;
case 0x18: //键A
key=10;
break;
case 0x28: //键B
key=11;
break;
case 0x48: //键C
key=12;
break;
case 0x88: //键D
key=13;
break;
case 0x81: //键*
key=14;
break;
case 0x84: //键#
key=15;
break;
}
}
//else key=16;
display(key);
}
}
void display(uchar k)
{
P0=table[k];
P1_3=0;
}
void delay(void)
{
uint i;
for(i=300;i>0;i--);
}
uchar keyscan(void)
{
uchar sccode,recode;
P2=0xf0; //发全0行扫描,列线输入
if((P2&0xf0)!=0xf0) //有键按下
{
delay(); //延时消抖
if((P2&0xf0)!=0xf0) //确实有键按下
{
sccode=0xfe; //行扫描初值
while((sccode&0x10)!=0) //是否扫描到最后一行
{
P2=sccode; //行扫描码
if((P2&0xf0)!=0xf0) //本行有键按下
{
recode=(P2&0xf0)|0x0f; //保留P1口高4位,低4位变为1,作为列值
scanflag=1;
return((~sccode)+(~recode)); //键编码=行扫描值+列扫描值
}
else sccode=(sccode<<1)|0x01; //该行无键按下,扫描值左移,扫描下一行
}
}
}
return(0); //无键按下,返回0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -