51单片机---流水灯独立按键之控制速度


前言

对于某些实验室的初级考核内容,以下是代码实例

一、问题

流水灯独立按键之控制速度
用按键控制led的流水灯的流速。
要求:LED从左开始,然后左右来回流水。
定义三个独立按键,按下按键,改变流速,要求实现为0.5s,1s,3s三个档位,程序刚开启为1s档位

二、代码

代码如下(示例):

# include "reg52.h"
 #include<intrins.h>
 
 sbit k1=P3^1;
 sbit k2=P3^0;
 sbit k3=P3^2;
 
 # define led P2
 
int flag1=0; 
int flag2=0; 
int flag3=0; 
 
 void delay_ms(int i)
{
   while(i--)
   {														    
     int a=111;
	 while(a--);
   }


}

void saomiao()     //扫描按键, 
{
  
	if(flag1==0) 
		{
		    if(k1!=1)
		    delay_ms(10);
	    	if(k1==0)
			{flag1=1;flag2=0;flag3=0;/*执行函数*/}
		 	 while(!k1);                            //真的很牛逼,防止按键时直接往下走。写独立按键的时候一定不要忘记。 
	    }
	
//88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
   if(flag2==0) 
		{
		    if(k2!=1)
		    delay_ms(10);
	    	if(k2==0)
			{flag2=1;flag1=0;flag3=0;/*执行函数*/}
		 	 while(!k2);                            //真的很牛逼,防止按键时直接往下走。写独立按键的时候一定不要忘记。 
	    }

//888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
   if(flag3==0) 
		{
		    if(k3!=1)
		    delay_ms(10);
	    	if(k3==0)
			{flag3=1;flag1=0;flag2=0;/*执行函数*/}
		 	 while(!k3);                            //真的很牛逼,防止按键时直接往下走。写独立按键的时候一定不要忘记。 
	    }

 
}
/*扫描函数的想法是:第一:按下一个键后让flag1=1,之后让他一直停留在这里然后再按键的时候居胥循环直到再按下一个键使flag1=0;
 第二:不影响其他程序的进行也就是程序不会陷入该函数中一直循环! 
				*/						 
void liushuideng()
{	int i;
    led=0xfe;
    delay_ms(100);
    
	while(1)
	{ 
		//*****************
				 saomiao();
				 if(flag2==~flag2)
				  {
				  	flag2=1;
				  
				  }
			//****************
				 saomiao();
				  if(flag3==~flag3)
				  {
				  	flag3=1;
				  
				  }
		//****************
				 saomiao();
				  if(flag1==~flag1)
				  {
				  	flag1=1;
				
				  }
	    for(i=0;i<8;i++)	 
		{
			
				 
			if(flag1==1)
			  {
			  	led=_crol_(led,1);
			     delay_ms(200);
				 saomiao();
				
		
			  }
			if(flag2==1)
			  {
			  	led=_crol_(led,1);
			     delay_ms(80);
				    saomiao();
				 
			  }
			if(flag3==1)
			  {
			  	led=_crol_(led,1);
			     delay_ms(20);
				  saomiao(); 
				 
			  }
			
		}
    }
 }
 
 
void main()
{
	while(1)
	{
		saomiao();
		 if(flag1==1||flag2==1||flag3==1)
		 {
		 liushuideng();
		 }
	}
}  

版权声明:本文为m0_51788349原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。