用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 08:07:35 浏览: 135
以下是AT89C51的按键检测显示程序:
```c
#include <reg51.h>
// 定义数码管共阳码表
unsigned char code segTable[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};
void delay(unsigned int t)
{
while (t--);
}
void scan_key()
{
unsigned char i, j;
unsigned char keyVal = 0xff; // 初始化键值为0xff,表示无按键按下
// 依次扫描4列,检测是否有按键按下
for (i = 0; i < 4; i++) {
P2 = ~(0x01 << i); // 选中第i列
delay(100); // 延时一段时间,等待按键稳定
if ((P1 & 0x0f) != 0x0f) { // 检测到按键按下
for (j = 0; j < 4; j++) { // 依次扫描4行,确定按下的键值
P2 = 0x0f;
P2 |= (0x01 << j);
if ((P1 & 0x0f) != 0x0f) { // 检测到按键按下
keyVal = i * 4 + j; // 计算键值
break; // 跳出循环
}
}
break; // 跳出循环
}
}
if (keyVal == 0xff) { // 无按键按下,数码管熄灭
P1 = 0xff;
} else { // 有按键按下,显示对应按键值
P1 = segTable[keyVal]; // 显示数码管
}
}
void main()
{
while (1) {
scan_key();
}
}
```
程序的主要思路是依次扫描4列,确定是否有按键按下,如果有按键按下则依次扫描4行,确定按下的键值。最后根据键值显示对应的数码管。如果没有按键按下,则数码管熄灭。为了防止按键抖动,程序在扫描每个按键时都会延时一段时间等待按键稳定。程序中使用了一个延时函数`delay()`,可以自行实现。
阅读全文