用at89c51来采用4*4的矩阵按键,做按键检测显示,用P1口从低位到高位分别接a、b、c、d、e、f、g、dp的一位共阳数码管,P1.0、P1.1、P1.2、P1.3分别接第一到第4行按键,P2.0、P2.1、P2.2、P2.3分别接第一列到第四列。 请实现当无按键按下时,数码管熄灭。当有按键按下时,分别显示对应按键值,矩阵按键从左到右,从上到下,分别为k0~k15,键值也分别为0~15。
时间: 2023-07-04 15:07:32 浏览: 129
以下是基于AT89C51单片机的程序代码实现:
```c
#include <reg51.h>
#define delay_time 5 //延时时间,可根据实际情况调整
unsigned char KeyScan(void);
void Display(unsigned char num);
void main()
{
unsigned char key_val = 0; //按键值
while(1)
{
key_val = KeyScan(); //检测按键
if(key_val != 0xff) //有按键按下
{
Display(key_val); //显示按键值
}
else //无按键按下
{
P1 = 0xff; //数码管熄灭
}
}
}
//按键扫描函数
unsigned char KeyScan(void)
{
unsigned char row, col;
P2 = 0x0f; //将第一列到第四列设置为低电平,用于检测行
for(col = 0; col < 4; col++)
{
P2 = ~(0x01 << col); //将当前列设置为高电平,用于检测列
for(row = 0; row < 4; row++)
{
if((P1 & (0x01 << row)) == 0) //判断当前行是否被按下
{
//返回按键值,按键从左到右,从上到下分别为k0~k15,键值为0~15
return col * 4 + row;
}
delay(delay_time);
}
}
//无按键按下
return 0xff;
}
//数码管显示函数
void Display(unsigned char num)
{
//数码管从低位到高位分别接a、b、c、d、e、f、g、dp的一位共阳数码管
unsigned char code tab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
P1 = tab[num]; //根据按键值在数码管上显示对应数字
}
```
在程序中,按键扫描函数`KeyScan()`会从第一行到第四行依次检测每个按键是否被按下,如果有按键被按下,则返回按键值,否则返回0xff表示无按键按下。数码管显示函数`Display()`会根据按键值在数码管上显示对应数字。程序中用到了一个延时函数`delay()`,可以自行实现或使用定时器产生延时。在主函数中,不断循环检测按键并显示。
阅读全文