单个按键控制多种流水灯状态

在这里插入图片描述
更新一个单个按键控制多种流水灯状态的教程,希望能帮助到大家~

所需元器件如下:
STC89C52RC芯片 *1
10K电阻 *2
100Ω电阻 *8
10uF 电解电容 *1
22pF 瓷片电容 *2
12MHz晶振 *1
按键 *2
LED灯 *8

代码如下:
在这里插入图片描述

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define LED P1
sbit KEY=P3^0;

unsigned char code led_1[8]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义第一种流水灯状态
unsigned char code led_2[8]=
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//定义第二种流水灯状态
unsigned char code led_3[5]=
{0x7e,0xbd,0xdb,0xe7,0xff};//定义第三种流水灯状态
unsigned char code led_4[5]=
{0xe7,0xc3,0x81,0x00,0xff};//定义第四种流水灯状态

unsigned int k,z;   //定义两个无符号整型变量

void delayms(uint ms)  //延时
{
	uint i,j;
	for(i=ms;i>0;i--)
	for(j=110;j>0;j--);
}
void key()
{
  if(KEY==0)
	{
		delayms(5);
		if(KEY==0)
		{
			k++;
			delayms(5);
			if(k>4)
			k=1;
		}
	}
}
void main()
{
	k=1;    //初始化为开机第一种流水灯状态
	while(1)
	{
		switch(k)
		{
			case 1:   //第一种流水灯状态
				for(z=0;z<8;z++)
				{
					LED=led_1[z];
					delayms(300);
					key();
					if(KEY==0)break;
				}
				break;
			case 2:   //第二种流水灯状态
				for(z=0;z<8;z++)
				{
					LED=led_2[z];
					delayms(300);
					key();
					if(KEY==0)break;
				}
				break;
			case 3:   //第三种流水灯状态
				for(z=0;z<5;z++)
				{
					LED=led_3[z];
					delayms(300);
					key();
					if(KEY==0)break;
				}
				break;
			case 4:   //第四种流水灯状态
				for(z=0;z<5;z++)
				{
					LED=led_4[z];
					delayms(300);
					key();
					if(KEY==0)break;
				}
				break;
		}
	}
}

仿真电路图如下:

在这里插入图片描述
大家可以思考一下,如果再给电路加一个按键,用这个按键来让流水灯的状态暂停/开始,那该怎样做呢?大家有兴趣的话可以做一看看。
下面贴上我以上面程序基础上稍加修改而写好的代码~

#include"reg52.h"

#define uchar unsigned char
#define uint unsigned int
#define LED P2

sbit KEY1=P1^0;
sbit KEY2=P1^1;

unsigned char code led_1[8]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义第一种流水灯状态
unsigned char code led_2[8]=
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//定义第二种流水灯状态
unsigned char code led_3[5]=
{0x7e,0xbd,0xdb,0xe7,0xff};//定义第三种流水灯状态
unsigned char code led_4[5]=
{0xe7,0xc3,0x81,0x00,0xff};//定义第四种流水灯状态

unsigned int k,z,fla=1;   //定义两个无符号整型变量

void delayms(uint ms);  //延时
void key();    //按键检测函数

void main()
{
	k=1;    //初始化为开机第一种流水灯状态
	while(1)
	{
		key();
		switch(k)
		{
			case 1:   //第一种流水灯状态
				if(fla){LED=led_1[z];z++;z%=8;}	
					break;
			case 2:   //第二种流水灯状态
				if(fla){LED=led_2[z];z++;z%=8;}
					break;
			case 3:   //第三种流水灯状态
				if(fla){LED=led_3[z];z++;z%=5;}
					break;
			case 4:   //第四种流水灯状态
				if(fla){LED=led_4[z];z++;z%=5;}
					break;
		}
		delayms(100);
	}
}

void delayms(uint ms)  //延时
{
	uint i,j;
	for(i=ms;i>0;i--)
	for(j=110;j>0;j--);
}
void key()
{
  if(KEY1==0)
	{
		delayms(5);
		if(KEY1==0)
		{
			z=0;k++;
			if(k>4)k=1;
			while(KEY1==0);
		}
	}
	else if(KEY2==0)
	{
		delayms(5);
		if(KEY2==0)
		{
			fla++;
			fla%=2;
			while(KEY2==0);
		}
	}
}

在这里插入图片描述

  • 135
    点赞
  • 661
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 118
    评论
评论 118
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朽木自雕i

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值