c51用2*3的矩阵按键控制八个led灯和一个数码管。第一个按键按下时,八个led灯呈现一种不断变化的花样(花样自己拟定),数码管显示1;第二个按键按下时,八个led灯呈现第二种花样,数码管显示2;第三个和第四个按键也是同样功能;第五个按键控制速度,按下时流水灯的速度会变快;第六个按键为系统复位键,按下后系统复位,所有的led灯熄灭,数码管显示0。
时间: 2023-05-12 14:05:47 浏览: 80
项目名称:彩灯数控音乐盒 项目内容: 基于proteus 8用数码管显示当前被按下的按键 ;LED 流水灯;通过按键实现歌曲切换
以下是 C51 控制八个 LED 灯和一个数码管的代码:
```
#include <reg52.h>
sbit KEY1 = P1^0; // 第一个按键
sbit KEY2 = P1^1; // 第二个按键
sbit KEY3 = P1^2; // 第三个按键
sbit KEY4 = P1^3; // 第四个按键
sbit KEY5 = P1^4; // 第五个按键
sbit KEY6 = P1^5; // 第六个按键
sbit LED1 = P2^0; // 第一个 LED 灯
sbit LED2 = P2^1; // 第二个 LED 灯
sbit LED3 = P2^2; // 第三个 LED 灯
sbit LED4 = P2^3; // 第四个 LED 灯
sbit LED5 = P2^4; // 第五个 LED 灯
sbit LED6 = P2^5; // 第六个 LED 灯
sbit LED7 = P2^6; // 第七个 LED 灯
sbit LED8 = P2^7; // 第八个 LED 灯
sbit DIGIT = P3^0; // 数码管控制引脚
sbit SEG_A = P3^1; // 数码管 A 段
sbit SEG_B = P3^2; // 数码管 B 段
sbit SEG_C = P3^3; // 数码管 C 段
sbit SEG_D = P3^4; // 数码管 D 段
sbit SEG_E = P3^5; // 数码管 E 段
sbit SEG_F = P3^6; // 数码管 F 段
sbit SEG_G = P3^7; // 数码管 G 段
unsigned char led_pattern[4][8] = {
{0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81}, // 花样 1
{0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81}, // 花样 2
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 熄灭
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} // 全亮
};
unsigned char digit_pattern[10] = {
0xC0, // 数码 0
0xF9, // 数码 1
0xA4, // 数码 2
0xB0, // 数码 3
0x99, // 数码 4
0x92, // 数码 5
0x82, // 数码 6
0xF8, // 数码 7
0x80, // 数码 8
0x90 // 数码 9
};
unsigned char current_pattern = 0; // 当前花样
unsigned char current_digit = 0; // 当前数码
unsigned char speed = 1; // 速度
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++);
}
}
void display_led(unsigned char pattern) {
LED1 = pattern & 0x01;
LED2 = pattern & 0x02;
LED3 = pattern & 0x04;
LED4 = pattern & 0x08;
LED5 = pattern & 0x10;
LED6 = pattern & 0x20;
LED7 = pattern & 0x40;
LED8 = pattern & 0x80;
}
void display_digit(unsigned char digit) {
DIGIT = 0;
SEG_A = digit_pattern[digit] & 0x01;
SEG_B = digit_pattern[digit] & 0x02;
SEG_C = digit_pattern[digit] & 0x04;
SEG_D = digit_pattern[digit] & 0x08;
SEG_E = digit_pattern[digit] & 0x10;
SEG_F = digit_pattern[digit] & 0x20;
SEG_G = digit_pattern[digit] & 0x40;
delay(speed * 10);
}
void main() {
while (1) {
if (KEY1 == 0) {
current_pattern = 0;
current_digit = 1;
}
if (KEY2 == 0) {
current_pattern = 1;
current_digit = 2;
}
if (KEY3 == 0) {
current_pattern = 2;
current_digit = 3;
}
if (KEY4 == 0) {
current_pattern = 3;
current_digit = 4;
}
if (KEY5 == 0) {
speed++;
if (speed > 10) {
speed = 1;
}
while (KEY5 == 0);
}
if (KEY6 == 0) {
current_pattern = 2;
current_digit = 0;
}
display_led(led_pattern[current_pattern][current_digit]);
display_digit(current_digit);
}
}
```
其中,`led_pattern` 数组存储了四种 LED 灯的花样,`digit_pattern` 数组存储了数码管显示数字的模式。`display_led` 函数用于控制 LED 灯的显示,`display_digit` 函数用于控制数码管的显示。在 `main` 函数中,通过检测按键状态来切换 LED 灯和数码管的显示模式,以及控制速度和复位。
阅读全文