c51怎么通过数组实现按键一控制正向流水灯(按一下动一下) 按键二控制反向流水灯(按一下动一下) 按键三控制流水灯的数量(1-3个)
时间: 2023-05-28 17:03:22 浏览: 119
c51中的流水灯控制
以下是c51程序实现:
```c
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code LED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水灯的8种状态
uchar count=1; //流水灯的数量,初始为1
uchar dir=1; //流水灯方向,初始为正向
sbit K1=P3^2; //按键1
sbit K2=P3^3; //按键2
sbit K3=P3^4; //按键3
void delay(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
uchar i=0;
while(1)
{
if(K1==0) //按键1按下
{
delay(10); //延时去抖
if(K1==0) //再次判断按键是否按下
{
dir=1; //设置流水灯方向为正向
i++; //选择下一个流水灯状态
if(i>=8*count) i=0; //循环选择流水灯状态
}
while(!K1); //等待按键1释放
}
if(K2==0) //按键2按下
{
delay(10); //延时去抖
if(K2==0) //再次判断按键是否按下
{
dir=-1; //设置流水灯方向为反向
i--; //选择上一个流水灯状态
if(i<0) i=8*count-1; //循环选择流水灯状态
}
while(!K2); //等待按键2释放
}
if(K3==0) //按键3按下
{
delay(10); //延时去抖
if(K3==0) //再次判断按键是否按下
{
count++; //增加流水灯数量
if(count>3) count=1; //循环设置流水灯数量
i=0; //重新从第一个流水灯状态开始
}
while(!K3); //等待按键3释放
}
P0=LED[i%8]; //显示当前流水灯状态
i+=dir; //根据方向选择下一个流水灯状态
if(i>=8*count) i=0; //循环选择流水灯状态
if(i<0) i=8*count-1; //循环选择流水灯状态
delay(200); //延时一段时间
}
}
```
其中,LED数组存储了流水灯的8种状态,count变量表示流水灯的数量,dir变量表示流水灯的方向,K1、K2、K3分别表示按键1、按键2、按键3。在主函数中,通过判断按键状态选择流水灯状态、流水灯数量以及流水灯方向,并根据流水灯数量和方向循环选择下一个流水灯状态进行显示。同时,通过延时函数延时一段时间来控制流水灯的运行速度。
阅读全文