写下面的程序:矩阵键盘上有16个按键S1-S16,按键按下在对应的数码管上显示对应的键值,要求有键盘扫描函数以及数码管显示函数。共阴数码管编码: u8 code [] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; 共阳数码管编码: u8 code []={0xc0,0xf9,0xA4,0xB0,0x99,0X92,0x82,0xF8,0x80,0x90,0x88,0X83,0XC6,0X A1,0X86,0X8E,0XFF};
时间: 2023-07-27 18:20:19 浏览: 92
单片机键盘扫描实验
以下是基于51单片机的程序示例:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
// 共阴数码管编码
uchar code com_cathode[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
// 共阳数码管编码
uchar code com_anode[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xff};
// 键盘扫描函数
uchar key_scan() {
uchar key_value = 0xff;
uchar key_code[] = {0xfe, 0xfd, 0xfb, 0xf7}; // 这里假设使用4行4列的矩阵键盘
uchar i, j;
for (i = 0; i < 4; i++) { // 接收行扫描码
P1 = key_code[i];
for (j = 0; j < 4; j++) {
if ((P1 & (1 << j)) == 0) { // 检测列扫描码
key_value = i * 4 + j + 1; // 计算键值
while ((P1 & (1 << j)) == 0); // 等待按键释放
}
}
}
return key_value;
}
// 数码管显示函数
void display(uchar value, bit is_com_cathode) {
uchar i;
if (is_com_cathode) {
P2 = com_cathode[value];
} else {
P2 = com_anode[value];
}
for (i = 0; i < 200; i++); // 延时一段时间,防止闪烁
}
void main() {
uchar key_value = 0xff;
bit is_com_cathode = 1; // 选择使用共阴还是共阳数码管
while (1) {
key_value = key_scan(); // 扫描键盘
if (key_value != 0xff) { // 按键按下
display(key_value - 1, is_com_cathode); // 显示键值
}
}
}
```
注意:由于不知道您使用的是哪种数码管,所以上述程序中使用了两个数组分别对应共阴和共阳数码管编码。如果您使用的是其他类型的数码管,请自行修改编码数组。
阅读全文