矩阵键盘上有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 11:20:23 浏览: 212
好的,我可以帮你解答这个问题。首先,你需要了解矩阵键盘的原理和数码管的显示方式。矩阵键盘是将按键排列成矩阵形式,每个按键对应矩阵的一个行和一列。通过扫描每个行和每个列,就可以判断哪个按键被按下。
下面是一个简单的矩阵键盘扫描函数的实现:
```c
#include <reg52.h>
#define KEY_PORT P1 // 定义键盘端口
#define LED_PORT P2 // 定义数码管端口
unsigned char code[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xff}; // 定义共阳数码管编码
unsigned char key_scan(void)
{
unsigned char val, i;
KEY_PORT = 0xf0; // 将列设为高电平,行设为低电平
val = KEY_PORT; // 读取键值
if (val != 0xf0) // 判断是否有按键按下
{
for (i = 0; i < 4; i++) // 扫描行
{
KEY_PORT = ~(0x10 << i); // 将行设为高电平,列设为低电平
val = KEY_PORT; // 读取键值
if (val != ~(0x10 << i)) // 判断是否有按键按下
{
switch (val)
{
case 0xee: return i * 4 + 1; // 第一列
case 0xde: return i * 4 + 2; // 第二列
case 0xbe: return i * 4 + 3; // 第三列
case 0x7e: return i * 4 + 4; // 第四列
}
}
}
}
return 0; // 没有按键按下
}
```
上面的代码中,首先将列设为高电平,行设为低电平,然后读取键值。如果键值不是 0xf0,说明有按键按下。接着扫描每一行,将行设为高电平,列设为低电平,再次读取键值。如果键值不等于预期值,说明该行有按键按下,根据列和行的位置计算出键值并返回。
接下来是数码管显示函数的实现:
```c
void led_display(unsigned char val)
{
LED_PORT = code[val]; // 将数码管编码写入端口
}
```
数码管显示函数根据传入的参数 val,从共阳数码管编码中查找对应的编码值,然后将其写入数码管端口。
综上,你需要在主函数中不断调用键盘扫描函数获取键值,然后将键值传入数码管显示函数进行显示。
阅读全文