矩阵键盘控制6位数码管动态显示的C51
时间: 2024-02-11 08:05:32 浏览: 78
单片机基础实例30例
好的,以下是一个使用C51单片机控制矩阵键盘和6位数码管动态显示的示例代码:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
// 数码管查表
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
// 数码管位选端口
sbit LED_COM1 = P2^2;
sbit LED_COM2 = P2^3;
sbit LED_COM3 = P2^4;
sbit LED_COM4 = P2^5;
sbit LED_COM5 = P2^6;
sbit LED_COM6 = P2^7;
// 矩阵键盘端口
sbit KEY_ROW1 = P3^0;
sbit KEY_ROW2 = P3^1;
sbit KEY_ROW3 = P3^2;
sbit KEY_ROW4 = P3^3;
sbit KEY_COL1 = P3^4;
sbit KEY_COL2 = P3^5;
sbit KEY_COL3 = P3^6;
sbit KEY_COL4 = P3^7;
// 延时函数
void delay(uint i)
{
while(i--);
}
// 数码管显示函数
void LED_Display(uchar *dat)
{
uchar i;
for(i=0; i<6; i++)
{
switch(i)
{
case 0:
LED_COM1 = 0; break;
case 1:
LED_COM2 = 0; break;
case 2:
LED_COM3 = 0; break;
case 3:
LED_COM4 = 0; break;
case 4:
LED_COM5 = 0; break;
case 5:
LED_COM6 = 0; break;
}
P0 = table[dat[i]]; // 显示数字
delay(100); // 延时一段时间
P0 = 0x00; // 关闭数码管
LED_COM1 = 1;
LED_COM2 = 1;
LED_COM3 = 1;
LED_COM4 = 1;
LED_COM5 = 1;
LED_COM6 = 1;
}
}
// 矩阵键盘扫描函数
uchar Key_Scan()
{
uchar key_value = 0xff;
KEY_ROW1 = 0; // 第一行输出低电平
if(KEY_COL1 == 0) key_value = 1;
if(KEY_COL2 == 0) key_value = 2;
if(KEY_COL3 == 0) key_value = 3;
if(KEY_COL4 == 0) key_value = 4;
KEY_ROW1 = 1;
KEY_ROW2 = 0; // 第二行输出低电平
if(KEY_COL1 == 0) key_value = 5;
if(KEY_COL2 == 0) key_value = 6;
if(KEY_COL3 == 0) key_value = 7;
if(KEY_COL4 == 0) key_value = 8;
KEY_ROW2 = 1;
KEY_ROW3 = 0; // 第三行输出低电平
if(KEY_COL1 == 0) key_value = 9;
if(KEY_COL2 == 0) key_value = 10;
if(KEY_COL3 == 0) key_value = 11;
if(KEY_COL4 == 0) key_value = 12;
KEY_ROW3 = 1;
KEY_ROW4 = 0; // 第四行输出低电平
if(KEY_COL1 == 0) key_value = 13;
if(KEY_COL2 == 0) key_value = 14;
if(KEY_COL3 == 0) key_value = 15;
if(KEY_COL4 == 0) key_value = 16;
KEY_ROW4 = 1;
return key_value; // 返回键值
}
void main()
{
uchar key_value, i;
uchar data_buf[6] = {0, 0, 0, 0, 0, 0}; // 显示缓存
while(1)
{
key_value = Key_Scan(); // 扫描矩阵键盘
if(key_value != 0xff) // 如果有按键按下
{
for(i=0; i<5; i++) // 将数字向左移动一位
{
data_buf[i] = data_buf[i+1];
}
data_buf[5] = key_value; // 将新按键的值存入最后一位
}
LED_Display(data_buf); // 显示数字
}
}
```
这个示例代码中,使用P0口控制6位数码管的显示,使用P2口控制6位数码管的位选,使用P3口控制矩阵键盘的输入和输出。程序中采用了延时函数来控制数码管的动态显示,可以根据具体需求进行调整。同时,程序使用了缓存数组来存储要显示的数字,可以在按下矩阵键盘时将新的数字加入缓存数组中。
阅读全文