按键控制流水灯方向,用while语句do-while语句实现
不知道你这个问题是否已经解决, 如果还没有解决的话:while循环
while(condition) //循环条件
{
statement(s);//循环体
}
do-while循环
do{
statement(s); //循环体
}
while(condition); //循环条件
for循环
for(init;condition;increment)
//init初始化参数,condition参数循环条件,increment改变参数,退出循环
{
statement(s); //循环体
}
我可以为您提供代码示例来实现按键控制流水灯方向,具体的代码如下所示:
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define LED P1
u8 direction = 1; // 默认正向流动
u8 num_of_led = 6; // 流水灯的灯光数量,默认为6
u16 light_time = 500; // 亮灯时间,默认为500ms
u8 n; //循环变量,用作LED总线的位索引index
void InitTimer0(void); //定时器0,初始化
void control_direction(void); // 通过按键控制流水灯的运动方向
void main()
{
LED = 0x00; // 先初始化LED全灭
InitTimer0();
while(1)
{
control_direction(); // 通过按键控制流水灯的运动方向
LED = ~(0x01 << n); // 将LED点亮,注意为 ~,因为电路中采用的是共阴极
delay(light_time); // 延时led_time后再处理下一个灯
LED = 0xff; // 灭掉LED
delay(light_time); // 延时led_time后再处理下一个灯
if (direction == 1)
{
if (++n == num_of_led) // 到达最后一颗灯时,将索引重置,从头开始流动
{
n = 0;
}
}
else
{
if (--n == 0xff) // 到达第一颗灯时,将索引重置,从尾部开始流动
{
n = num_of_led - 1;
}
}
}
}
void InitTimer0(void)
{
TMOD |= 0x01; //用|=防止配置冲突
TH0 = (65536 - 50000)/256; //定时50ms
TL0 = (65536 - 50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0() interrupt 1 //定时器0,中断服务函数
{
static u16 i;
TH0 = (65536 - 50000)/256; //定时50ms
TL0 = (65536 - 50000)%256;
i++;
if (i == light_time) // 定时到了亮灯时间后,将定时器计数器清零
{
i = 0;
LED_flag = 1;
}
}
void control_direction(void)
{
if (P3 == 0xfe) // 检测 P3.0 是否被按下,P3.0 按下时,流水灯反向流动
{
direction = 0;
}
else if (P3 == 0xfd) // 检测 P3.1 是否被按下,P3.1 按下时,流水灯正向流动
{
direction = 1;
}
// 如果没有按键被按下,保持原先的运动方向
}
对于代码中的注释,我会详细地介绍一下: 1. 第 11 行,定义了流水灯的方向,默认为正向流动(1),可以通过按键控制其方向; 2. 第 12 行,定义了流水灯的灯光数量,默认为6个; 3. 第 13 行,定义了LED亮灯时间,默认为500ms; 4. 第 16 行,定义了定时器中断服务函数; 5. 第 32 行,定义了控制流水灯运动方向的函数; 6. 第 42 行,初始化 P1 口,LED全部熄灭; 7. 第 44 行,初始化定时器; 8. 第 48 行,开始进入主循环; 9. 第 49 行,改变流水灯的方向; 10. 第 50 行,将LED点亮,并延时led_time长; 11. 第 51 行,将LED灭掉,并延时led_time长; 12. 第 53~58 行,当正向流动时,到达最后一颗灯时,将索引重置,从头开始流动;当反向流动时,到达第一颗灯时,将索引重置,从尾部开始流动; 13. 第 63 行,将定时器计数器清零。
注意,在上述代码中,我未提供 delay 函数的实现,您可以根据自己的需要来实现该函数,例如使用定时器来进行延时。同时,您也需要根据自己的电路情况来详细地调整代码。