在51单片机实验板上,用C语言编程实现独立按键对LED流水灯显示的控制。 1.最多使用单片机实验板上3个独立按键,控制由8个LED组成的流水灯的显示。 2.通过独立按键控制流水灯实现4种不同样式的循环显示。 3.当流水灯显示某一种样式时,可通过独立按键实现暂停和重新开始显示,
时间: 2023-05-22 16:04:38 浏览: 98
51单片机---C语言代码,流水灯控制
同时也可通过另一个独立按键实现流水灯方向的改变。
以下是一个可能的代码实现:
```c
#include <reg51.h>
// LED灯数目
#define LED_NUM 8
// 流水灯的四种循环模式
#define MODE_NORMAL 0
#define MODE_BLINK 1
#define MODE_FOREVER 2
#define MODE_RANDOM 3
// 定义四个独立按键
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
// 定义8个LED
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
// 记录当前流水灯的状态
int current_led = 0;
// 记录当前流水灯的模式
int current_mode = MODE_NORMAL;
// 记录当前流水灯是否在运行中
int is_running = 1;
// 记录当前流水灯是向前还是向后运行
int is_forward = 1;
// 定义延迟函数
void delay(int ms)
{
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 120; j++);
}
// 移动流水灯的位置
void move_led()
{
switch(current_mode)
{
case MODE_NORMAL:
if (is_forward)
current_led = (current_led + 1) % LED_NUM;
else
current_led = (current_led + LED_NUM - 1) % LED_NUM;
break;
case MODE_BLINK:
if (is_running)
LED1 = !LED1;
break;
case MODE_FOREVER:
// do nothing
break;
case MODE_RANDOM:
if (is_running)
current_led = rand() % LED_NUM;
break;
}
}
// 控制LED灯亮灭的函数
void control_led()
{
int i;
for (i = 0; i < LED_NUM; i++)
{
if (i == current_led)
*(int*)(&LED1 + i) = 1;
else
*(int*)(&LED1 + i) = 0;
}
}
// 主函数
void main()
{
// 初始化随机数发生器
srand(0);
// 循环处理
while(1)
{
// 移动流水灯的位置
move_led();
// 控制LED灯的亮灭
control_led();
// 延迟一段时间
delay(50);
// 处理按键事件
if (!KEY1)
{
// 切换流水灯的模式
current_mode = (current_mode + 1) % 4;
// 暂停或重新开始流水灯
is_running = !is_running;
}
if (!KEY2)
{
// 改变流水灯的方向
is_forward = !is_forward;
}
if (!KEY3)
{
// 重置流水灯的位置
current_led = 0;
}
if (!KEY4)
{
// do nothing
}
}
}
```
阅读全文