/按下矩阵按键在数码管上显示对应数值/
#include “reg52.h”
#define u8 unsigned char
#define u16 unsigned int
#define dig P0 //数码管对应IO口
#define key P1 //矩阵对应IO口
u8 num;//用来存放读取到的键值
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//138译码
delay(u16);//延时函数声明
u8 keyscan();//矩阵键盘扫描函数声明
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/code表示将数据从RAM改存进ROM区,节省内存/
void main()
{
LSA=0;
LSB=0;
LSC=0;//给第一个数码管提供位选
while(1)
{
num=keyscan(); //按键扫描函数
dig=smgduan[num];
}
}
u8 keyscan()
{
u8 a;
key=0x0f;//高四位为行,低四位为列
if(key!=0x0f)//检测按键是否按下
{
delay(10);//消抖
if(key!=0x0f)
{
key=0x0f;//检测列
switch(key)
{
case(0x07):num=0;break;
case(0x0b):num=1;break;
case(0x0d):num=2;break;
case(0x0e):num=3;break;
}
key=0xf0;//检测行
switch(key)
{
case(0x70):num=num;break;
case(0xb0):num=num+4;break;
case(0xd0):num=num+8;break;
case(0xe0):num=num+12;break;
}
while((a<50)&&(key!=0xf0))
{
delay(10);
a++; //检测按键松手检测
}
}
}
return num;//返回num作为函数值
}
delay(u16 x)//延时ms函数
{
u8 i,j;
for(i=x;i>0;i–)
{
for(j=120;j>0;j–);
}
return x;
}
谢谢观看,本人初学,如有错误之处,希望各位前辈指出。