写一个下面的程序:矩阵键盘上有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 10:20:20 浏览: 129
矩阵键盘键值在数码管上显示
以下是基于Arduino的程序示例:
```c++
// 定义共阳数码管编码
const uint8_t com_anode[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xff};
// 定义共阴数码管编码
const uint8_t com_cathode[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};
// 定义键盘扫描函数
uint8_t key_scan() {
uint8_t key_value = 0xff;
const uint8_t key_code[] = {0xfe, 0xfd, 0xfb, 0xf7}; // 假设使用4行4列的矩阵键盘
uint8_t i, j;
for (i = 0; i < 4; i++) { // 接收行扫描码
digitalWrite(i + 3, LOW);
for (j = 0; j < 4; j++) {
if (digitalRead(j + 7) == LOW) { // 检测列扫描码
key_value = i * 4 + j + 1; // 计算键值
while (digitalRead(j + 7) == LOW); // 等待按键释放
}
}
digitalWrite(i + 3, HIGH);
}
return key_value;
}
// 定义数码管显示函数
void display(uint8_t value, bool is_com_cathode) {
uint8_t i;
if (is_com_cathode) {
PORTD = com_cathode[value];
} else {
PORTD = com_anode[value];
}
for (i = 0; i < 200; i++); // 延时一段时间,防止闪烁
}
void setup() {
uint8_t i;
DDRD = 0xff; // 数码管的7个引脚设置为输出
DDRB = 0xf0; // 键盘的8个引脚设置为输入或输出
for (i = 3; i < 7; i++) {
pinMode(i, OUTPUT); // 用于行扫描的引脚设置为输出
digitalWrite(i, HIGH); // 初始值为高电平
}
for (i = 7; i < 11; i++) {
pinMode(i, INPUT_PULLUP); // 用于列扫描的引脚设置为输入,并开启上拉电阻
}
}
void loop() {
uint8_t key_value = 0xff;
bool is_com_cathode = true; // 选择使用共阴还是共阳数码管
while (1) {
key_value = key_scan(); // 扫描键盘
if (key_value != 0xff) { // 按键按下
display(key_value - 1, is_com_cathode); // 显示键值
}
}
}
```
注意:由于不知道您使用的是哪种数码管,所以上述程序中使用了两个数组分别对应共阴和共阳数码管编码。如果您使用的是其他类型的数码管,请自行修改编码数组。此外,由于Arduino的引脚与51单片机的引脚定义方式不同,所以程序中的引脚定义可能需要根据您的具体硬件进行修改。
阅读全文