采用行列扫描法获取键值,在通过数码管显示。 符号&,只有1&1时为1,其他情况均为0。
矩阵键盘理解图:
代码1:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
char code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F数码
//毫秒延迟函数
void delay(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<123;i++);
}
//数码管显示函数
void Digdisplay()
{
char i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0: LSC=1;LSB=1;LSA=1; break; //显示第1位数码管
case 1: LSC=1;LSB=1;LSA=0; break; //显示第2位数码管
case 2: LSC=1;LSB=0;LSA=1; break; //显示第3位数码管
case 3: LSC=1;LSB=0;LSA=0; break; //显示第4位数码管
case 4: LSC=0;LSB=1;LSA=1; break; //显示第5位数码管
case 5: LSC=0;LSB=1;LSA=0; break; //显示第6位数码管
case 6: LSC=0;LSB=0;LSA=1; break; //显示第7位数码管
case 7: LSC=0;LSB=0;LSA=0; break; //显示第8位数码管
}
P0=smgduan[i+1]; //显示1~8的数值
delay(1); //延时1ms,让数码管不断显示
P0=0x00; //数码管消遣
}
}
void main()
{
while(1)
{
Digdisplay();
}
}
代码2:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
char code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~F数码
//毫秒级延迟函数
void delay(uint ms)
{
char i;
while(ms--)
for(i=0;i<123;i++);
}
//行列扫描法
int keycan() //获取键值
{
uchar key,x,y;
P1=0xf0;
if(P1!=0xf0)
{
delay(10); //消抖
if(P1!=0xf0)
{
x=P1&0xf0; //行值 & 只有1&1时为1,其余情况为0
P1=0x0f;
y=P1&0x0f; //列值
}
while((P1&0x0f)!=0x0f); //判断按键是否抬起
}
switch(x+y)
{
case 0x77: key=0; break; //第一行
case 0x7b: key=1; break;
case 0x7d: key=2; break;
case 0x7e: key=3; break;
case 0xb7: key=4; break; //第二行
case 0xbb: key=5; break;
case 0xbd: key=6; break;
case 0xbe: key=7; break;
case 0xd7: key=8; break; //第三行
case 0xdb: key=9; break;
case 0xdd: key=10; break;
case 0xde: key=11; break;
case 0xe7: key=12; break; //第四行
case 0xeb: key=13; break;
case 0xed: key=14; break;
case 0xee: key=15; break;
default: key=0; break;
}
return key;
}
//数码管显示函数(显示键值)
void Digdisplay()
{
LSC=0;LSB=0;LSA=0; //显示第1位数码管
P0=smgduan[keycan()]; //根据键值显示
delay(1); //延时1ms,让数码管不断显示
P0=0x00; //数码管消遣
}
void main()
{
while(1)
{
Digdisplay();
}
}
运行结果