用keil当无键按下时,上下各4只LED交替闪烁,当K1按下再松开时,LED呈流水灯显示(从下到上依次点亮,每次只点亮一个)2次,然后再回到交替闪烁。当K2按下再松开时,(从上到上依次点亮,每次只点亮一个)2次,然后再回到交替闪烁。两个按键不会出现同时按下的情况
时间: 2024-03-26 10:35:16 浏览: 197
以下是基于Keil C51环境的代码实现:
```
#include <reg52.h>
#define LED P1
sbit K1 = P3^1;
sbit K2 = P3^0;
void delay(unsigned int i) // 延时函数
{
while(i--);
}
void main()
{
unsigned char mode = 0; // mode = 0: 交替闪烁; mode = 1: 从下到上流水灯; mode = 2: 从上到下流水灯
unsigned char i = 0;
unsigned char j = 0;
unsigned char k = 0;
unsigned char flag = 0;
LED = 0xff; // 初始化所有LED为熄灭状态
while(1)
{
if(K1 == 0) // K1按下
{
delay(2000); // 延时消抖
if(K1 == 0)
{
mode = 1; // 切换至从下到上流水灯模式
for(i = 0; i < 2; i++)
{
for(j = 0; j < 8; j++)
{
LED = ~(1 << j);
delay(50000);
}
}
}
}
if(K2 == 0) // K2按下
{
delay(2000); // 延时消抖
if(K2 == 0)
{
mode = 2; // 切换至从上到下流水灯模式
for(i = 0; i < 2; i++)
{
for(j = 7; j >= 0; j--)
{
LED = ~(1 << j);
delay(50000);
}
}
}
}
if(mode == 0) // 交替闪烁模式
{
if(flag == 0) // 上四个LED亮
{
for(k = 0; k < 4; k++)
{
LED = ~(0x0f << k);
}
flag = 1;
}
else // 下四个LED亮
{
for(k = 0; k < 4; k++)
{
LED = ~(0xf0 >> k);
}
flag = 0;
}
delay(50000);
}
}
}
```
在上述代码中,我们使用了一个mode变量来表示当前LED的工作模式,0代表交替闪烁模式,1代表从下到上流水灯模式,2代表从上到下流水灯模式。在每次循环中,首先检测K1和K2是否按下,如果按下则先切换到对应的流水灯模式,并且在流水灯模式中循环两次(每次点亮一个LED)。如果没有按键按下,则根据当前模式选择相应的LED显示方式(交替闪烁或流水灯)。其中,交替闪烁模式中我们使用了一个flag变量来切换上下两组LED的状态。最后,延时函数用来控制LED的亮灭时间,可以根据需要进行修改。
阅读全文
相关推荐


















