51单片机按键数码管显示0-15代码
时间: 2024-01-12 12:02:23 浏览: 349
以下是一个简单的示例代码,实现了使用4x4矩阵按键和4位数码管来显示0-15的数字:
```c
#include <reg51.h>
#define KEY_PORT P1 // 按键接口
#define DIG_PORT P0 // 数码管接口
unsigned char KeyScan(void); // 扫描矩阵按键
void Display(unsigned char num); // 数码管显示数字
void main()
{
unsigned char key, num;
while (1)
{
key = KeyScan(); // 扫描矩阵按键
if (key != 0xFF) // 按键被按下
{
num = key; // 将按键编号作为显示数字
Display(num); // 数码管显示数字
}
}
}
// 扫描矩阵按键函数
unsigned char KeyScan(void)
{
unsigned char i, j, k;
unsigned char key_code = 0xFF;
// 逐行扫描矩阵按键
for (i = 0; i < 4; i++)
{
KEY_PORT = ~(0x01 << i); // 输出行扫描码
k = KEY_PORT; // 读取列扫描码
k &= 0x0F; // 只保留低4位,即4个列扫描码
if (k != 0x0F) // 判断是否有按键被按下
{
for (j = 0; j < 4; j++) // 逐列判断按键
{
if ((k & (0x01 << j)) == 0) // 判断该列是否有按键被按下
{
key_code = i * 4 + j; // 计算按键编号
break;
}
}
break;
}
}
return key_code;
}
// 数码管显示数字函数
void Display(unsigned char num)
{
unsigned char code[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
// 数码管段码表,从0-9、A-F依次对应
unsigned char i, j;
unsigned char dig[4] = {0xFF, 0xFF, 0xFF, 0xFF}; // 数码管的4个数字,默认不显示
if (num > 15) return; // 输入数字超出范围,直接返回
// 将输入数字转换成4位二进制数值
for (i = 0; i < 4; i++)
{
dig[i] = num % 2;
num /= 2;
}
// 数码管显示
for (i = 0; i < 4; i++)
{
DIG_PORT = code[dig[i] * 8 + i]; // 输出段码
for (j = 0; j < 100; j++) // 延时
{
}
DIG_PORT = 0xFF; // 清除显示
}
}
```
在上述代码中,使用了一个数字数组code来存储数码管的段码表,从0-9、A-F依次对应。在扫描矩阵按键时,根据行列信息计算出按键编号,并将该编号作为显示数字。在实现数码管显示时,将输入数字转换成4位二进制数值,然后根据数值查表得到对应的段码,并将该段码输出到数码管上,实现数字的显示。
阅读全文