采用P0口设计一个4*4行列式按键,采用P1 P2口设计8个8段数码管,P1作公共的段选线,送出显示数字的编码;P2口作为数码管的位选线,负责数码管的分时显示,每位数码管显示2ms。通过按键,可以输入0-9 A-F 不同的值,在数码管上显示最高8位的值。给我写代码
时间: 2024-04-21 07:28:48 浏览: 6
下面是一个简单的基于51单片机的程序,实现了上述功能。本程序使用定时器中断实现了分时显示,使用了一个16*8的编码表将要显示的数字转换为了段选编码值。
```
#include <reg51.h>
// 定义IO口
sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;
sbit P2_6 = P2^6;
sbit P2_7 = P2^7;
// 定义变量
unsigned char key = 0; // 按键值
unsigned char disp[8] = {0}; // 要显示的数字(BCD码)
unsigned char code seg_table[16][8] = { // 编码表
{1,1,1,1,1,1,0,0}, // 0
{0,1,1,0,0,0,0,0}, // 1
{1,1,0,1,1,0,1,0}, // 2
{1,1,1,1,0,0,1,0}, // 3
{0,1,1,0,0,1,1,0}, // 4
{1,0,1,1,0,1,1,0}, // 5
{1,0,1,1,1,1,1,0}, // 6
{1,1,1,0,0,0,0,0}, // 7
{1,1,1,1,1,1,1,0}, // 8
{1,1,1,1,0,1,1,0}, // 9
{1,1,1,0,1,1,1,0}, // A
{0,0,1,1,1,1,1,0}, // B
{1,0,0,1,1,1,0,0}, // C
{0,1,1,1,1,0,1,0}, // D
{1,0,0,1,1,1,1,0}, // E
{1,0,0,0,1,1,1,0}, // F
};
// 定时器中断
void timer0_isr(void) interrupt 1 {
static unsigned char cnt = 0; // 计数器
static unsigned char pos = 0; // 当前显示的数码管位置
// 分时显示
P2_0 = (pos == 0);
P2_1 = (pos == 1);
P2_2 = (pos == 2);
P2_3 = (pos == 3);
P2_4 = (pos == 4);
P2_5 = (pos == 5);
P2_6 = (pos == 6);
P2_7 = (pos == 7);
// 显示数字
P1 = seg_table[disp[pos]][cnt];
// 更新计数器和位置
cnt++;
if (cnt == 8) {
cnt = 0;
pos++;
if (pos == 8) {
pos = 0;
}
}
}
// 读取按键
unsigned char read_key(void) {
unsigned char key_value = 0;
P0_0 = 0;
if (P0_4 == 0) key_value = 1;
if (P0_5 == 0) key_value = 2;
if (P0_6 == 0) key_value = 3;
if (P0_7 == 0) key_value = 0;
P0_0 = 1;
P0_1 = 0;
if (P0_4 == 0) key_value = 4;
if (P0_5 == 0) key_value = 5;
if (P0_6 == 0) key_value = 6;
if (P0_7 == 0) key_value = 0;
P0_1 = 1;
P0_2 = 0;
if (P0_4 == 0) key_value = 7;
if (P0_5 == 0) key_value = 8;
if (P0_6 == 0) key_value = 9;
if (P0_7 == 0) key_value = 0;
P0_2 = 1;
P0_3 = 0;
if (P0_4 == 0) key_value = 0;
if (P0_5 == 0) key_value = 0;
if (P0_6 == 0) key_value = 0;
if (P0_7 == 0) key_value = 0;
P0_3 = 1;
return key_value;
}
// 延时函数
void delay(unsigned int t) {
while (t--);
}
// 主函数
void main() {
// 初始化端口
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x66;
TR0 = 1;
ET0 = 1;
EA = 1;
while (1) {
// 读取按键
key = read_key();
// 处理按键
if (key != 0) {
delay(1000); // 消抖
if (key != 0) {
// 显示按键值
if (key <= 9) {
disp[7] = key;
} else {
disp[7] = key - 7;
}
}
}
// 更新显示
delay(1000); // 延时
}
}
```