51单片机流水灯4按键
时间: 2023-12-10 09:06:15 浏览: 88
以下是51单片机流水灯4按键的代码:
```c
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
void delay(unsigned int t) // 延时函数
{
while(t--);
}
void main()
{
unsigned char state = 0; // 初始状态为0
unsigned char i = 0;
while(1) // 循环执行
{
if(KEY1 == 0) // 检测按键1是否按下
{
delay(1000); // 延时消抖
if(KEY1 == 0) // 再次检测按键1是否按下
{
state = 1; // 状态切换到1
}
while(!KEY1); // 等待按键1释放
}
else if(KEY2 == 0) // 检测按键2是否按下
{
delay(1000); // 延时消抖
if(KEY2 == 0) // 再次检测按键2是否按下
{
state = 2; // 状态切换到2
}
while(!KEY2); // 等待按键2释放
}
else if(KEY3 == 0) // 检测按键3是否按下
{
delay(1000); // 延时消抖
if(KEY3 == 0) // 再次检测按键3是否按下
{
state = 3; // 状态切换到3
}
while(!KEY3); // 等待按键3释放
}
else if(KEY4 == 0) // 检测按键4是否按下
{
delay(1000); // 延时消抖
if(KEY4 == 0) // 再次检测按键4是否按下
{
state = 4; // 状态切换到4
}
while(!KEY4); // 等待按键4释放
}
switch(state) // 根据不同状态执行不同程序
{
case 1: // 状态1,从左到右流水灯
for(i = 0; i < 4; i++) // 循环4次,控制4个LED灯的亮灭
{
LED1 = 1; // 亮LED1
delay(50000); // 延时
LED1 = 0; // 灭LED1
LED2 = 1; // 亮LED2
delay(50000); // 延时
LED2 = 0; // 灭LED2
LED3 = 1; // 亮LED3
delay(50000); // 延时
LED3 = 0; // 灭LED3
LED4 = 1; // 亮LED4
delay(50000); // 延时
LED4 = 0; // 灭LED4
}
break;
case 2: // 状态2,从右到左流水灯
for(i = 0; i < 4; i++) // 循环4次,控制4个LED灯的亮灭
{
LED4 = 1; // 亮LED4
delay(50000); // 延时
LED4 = 0; // 灭LED4
LED3 = 1; // 亮LED3
delay(50000); // 延时
LED3 = 0; // 灭LED3
LED2 = 1; // 亮LED2
delay(50000); // 延时
LED2 = 0; // 灭LED2
LED1 = 1; // 亮LED1
delay(50000); // 延时
LED1 = 0; // 灭LED1
}
break;
case 3: // 状态3,跑马灯
LED1 = 1; // 亮LED1
delay(50000); // 延时
LED1 = 0; // 灭LED1
LED3 = 1; // 亮LED3
delay(50000); // 延时
LED3 = 0; // 灭LED3
LED2 = 1; // 亮LED2
delay(50000); // 延时
LED2 = 0; // 灭LED2
LED4 = 1; // 亮LED4
delay(50000); // 延时
LED4 = 0; // 灭LED4
break;
case 4: // 状态4,全部灯亮
LED1 = 1; // 亮LED1
LED2 = 1; // 亮LED2
LED3 = 1; // 亮LED3
LED4 = 1; // 亮LED4
break;
default: // 初始状态0,所有灯都灭
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
break;
}
}
}
```
代码解释:
1. 定义4个LED灯和4个按键的IO口。
2. 定义一个延时函数。
3. 主函数中定义状态变量state和循环计数器i。
4. 循环执行,检测按键是否按下,如果按下则进行状态切换。
5. 根据不同状态执行不同的程序。
6. 状态1为从左到右流水灯,状态2为从右到左流水灯,状态3为跑马灯,状态4为全部灯亮,初始状态0为所有灯都灭。
注意事项:
1. 在检测按键时需要加上延时消抖,避免误触发。
2. 在等待按键释放时需要加上while循环,否则会造成程序一直卡在这里无法执行下去。
3. 延时函数中的t值可以根据实际情况进行调整。
阅读全文