节日彩灯控制器

不辜负每个朝阳,不荒废每个深夜,因平凡而奋斗,因奋斗而不平凡
                                                  ----------夜色的繁星
QQ:
1207868880

 

#include <reg52.h>	//51头文件
#include <intrins.h>//包含循环右移函数_cror头文件

#define uchar unsigned char	 //宏定义
#define uint  unsigned int	 //宏定义
sbit kai_shi = P1^0;//S0开始
sbit guan_bi = P1^1;//S1关闭
sbit zuo_yi_key = P1^2;//下移
sbit you_yi_key = P1^3;//上移
sbit flag = P3^2; //外部中断信号产生脚
unsigned char temp;//P1口状态暂存变量
unsigned char k;
void key();
//毫秒级延时函数
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 120; y > 0 ; y--);
}
//主函数
void main()
{
		while(1)
		{
			key();
			switch(k) //判断那一列被按下
			{
				
				case 1:	temp = 0xfe; //定义LED灯初始状态,从LED8开始亮
								while(1)
								{
									P2 = temp;	 //赋值给P1,点亮LED8
									delay(250); //延时250毫秒,延时不易过长,最好不要超过300
									temp = _crol_(temp,1);//循环右移,LED从左至右点亮
									key();
									if(k!=1) break;
								}
							 ;	break;//第一列被按下
				case 2:								temp = 0xfe; //定义LED灯初始状态,从LED8开始亮
							while(1)
							{
								P2 = temp;	 //赋值给P1,点亮LED8
								delay(250); //延时1000毫秒
								temp = _crol_(temp,1);//循环右移,LED从左至右点亮
								key();
								if(k!=2) break;
							}
							 ;	break;//第二列被按下
				case 3:			temp = 0x7f  ; //定义LED灯初始状态,从LED8开始亮
							while(1)
							{
									P2 = temp;	 //赋值给P1,点亮LED8
									delay(250); //延时1000毫秒
									temp = _cror_(temp,1);//循环右移,LED从左至右点亮
								key();
							if(k!=3) break;
							}
							 ;	break;//第三列被按下
								
				case 4:	 P2=0xff;	break;//第四列被按下 
			}
		}
}
void key()
{
	if(kai_shi == 0)//判断S2是否被按下
		{
			delay(5);//按键消抖
			if(kai_shi == 0)
			{
				
							k=1;
		
				while(!kai_shi);//松手检测
			}	
		}
		
		if(zuo_yi_key == 0)//判断S2是否被按下
		{
			delay(5);//按键消抖
			if(zuo_yi_key == 0)
			{
			
					k=2;
				while(!zuo_yi_key);//松手检测
			}	
		}

	if(you_yi_key == 0)//判断S2是否被按下
		{
			delay(5);//按键消抖
			if(you_yi_key == 0)
			{
			
					k=3;
		
				while(!you_yi_key);//松手检测
			}	
		}
			if(guan_bi == 0)//判断S2是否被按下
		{
			delay(5);//按键消抖
			if(guan_bi == 0)
			{
				
					k=4;
				while(!guan_bi);//松手检测
			}	
		}

}

第二版本

 

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void san();
void wu();
void delay(uint);
sbit key2=P1^0;//关闭彩灯的开关
sbit key1=P1^1;//启动彩灯的开关
sbit key3=P1^2;//控制彩灯右移的开关
sbit key4=P1^3;//控制彩灯左移的开关
uchar temp;//定义一个无符号字符型数据变量
uchar temp1;//定义一个无符号字符型数据变量
uchar temp2;//定义一个无符号字符型数据变量
uint a;
int c;
void main()//主程序
{  
while(1)//判断哪个开关被按下
  {
	   
 	if(key1==0)
   {  
	  san();
	 } 

	if(key2==0)
	{  
	  P2=0xff;   		 
	 }   	
 	if(key3==0)
	{
	    san(); 
	 }
		
	if(key4==0)
	{
	 wu();
	 }
  }
 }
void san()
{ 
uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义一个数组
for(a=0;a<8;a++)
{
	  temp=table[a];//将数组赋值给变量temp
	  P2=temp;
	  delay(300);//延时
}  
}
void delay(uint z)//延时程序
{
  uint x,y;
  for(x=100;x>0;x--)
     for(y=z;y>0;y--);
}
 void wu()
{
uchar table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义一个数组
	for(c=7;c>-1;c--)
	{
	 temp1=table1[c];//将数组赋值给变量temp1
	 P2=temp1; 
	 delay(300);//延时
	}
       
 }

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值