c51单片机用一位八段共阴数码管显示4×4矩阵键盘的输入数。其中数码管是10个管脚,4×4矩阵键盘是8个管脚。请给出接线说明和c程序
时间: 2024-06-09 09:10:54 浏览: 192
以下是接线说明和C程序:
1. 接线说明
数码管的8个共阴管脚连接到P0口的低4位(P0.0~P0.3)和高4位(P0.4~P0.7);
4×4矩阵键盘的4行连接到P1口的低4位(P1.0~P1.3),4列连接到P3口的高4位(P3.4~P3.7);
2. C程序
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg_tab[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar code key_tab[] = { // 矩阵键盘键值表
0xee, 0xde, 0xbe, 0x7e,
0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b,
0xe7, 0xd7, 0xb7, 0x77
};
void delay(uint i) { // 延时函数
while(i--);
}
void main() {
uchar i, j, key, num, cnt;
P0 = 0xff; // 数码管初始显示全灭
P1 = 0x0f; // 矩阵键盘行初始化为高电平
P3 = 0xf0; // 矩阵键盘列初始化为低电平
while(1) {
cnt = 0;
for(i=0; i<4; i++) { // 扫描行
P1 = ~(0x01<<i); // 按位取反后,第i行为低电平,其它行为高电平
for(j=4; j<8; j++) { // 检测列
if((P3 & (0x01<<j)) == 0) { // 判断是否有键按下
key = key_tab[i*4+(j-4)]; // 获取键值
if(key == 0x77) { // 按下的是确认键
if(cnt == 0) continue; // 如果没有输入数,则继续等待
num = cnt; // 否则将输入数保存
cnt = 0; // 清空计数器
} else if(key >= 0x70 && key <= 0x79 && cnt < 3) { // 按下的是数字键
cnt++;
P0 = seg_tab[key-0x70]; // 数码管显示键值
delay(30000); // 延时消抖
P0 = 0xff; // 数码管清空
num = num*10 + key-0x70; // 保存输入数
}
while((P3 & (0x01<<j)) == 0); // 等待键释放
}
}
}
if(cnt != 0) continue; // 如果扫描完一遍后有未确认的键,则继续等待
P0 = seg_tab[num/1000]; // 数码管显示千位
delay(30000);
P0 = 0xff;
P0 = seg_tab[num/100%10]; // 数码管显示百位
delay(30000);
P0 = 0xff;
P0 = seg_tab[num/10%10]; // 数码管显示十位
delay(30000);
P0 = 0xff;
P0 = seg_tab[num%10]; // 数码管显示个位
delay(30000);
P0 = 0xff;
}
}
```
程序逻辑:
1. 数码管和矩阵键盘的初始化;
2. 循环扫描矩阵键盘;
3. 检测到有键按下后,获取键值;
4. 如果是数字键,数码管显示键值并保存输入数;
5. 如果是确认键,将输入数保存并清空计数器;
6. 扫描完一遍后,如果还有未确认的键,则继续等待;
7. 数码管依次显示输入数的千位、百位、十位、个位。
阅读全文