天天看點

按鍵控制流水燈轉向

實作按鍵控制流水燈的啟動和轉向

proteus仿真連結:https://pan.baidu.com/s/1On3Sc8_jAtmM8BdRrFcPbw 提取碼:qwer

#include "reg52.h"	 //定義一些特殊寄存器	 
#include<intrins.h>		//調用led移動庫(_CROL_  _CROR_)

typedef unsigned int u16;	  //u16代替unsigned int
typedef unsigned char u8;     //u8代替unsigned char

#define led P2	          //宏定義P2口
	 	 sbit k1=P3^1;     
		 sbit k2=P3^2;    //位定義
		 u16 m=1,n=1;   //定義無符号整型變量
	  
		
			   

/**************延時函數***********/
void delay(u16 i)
{
	while(i--);	
}
/************按鍵函數************/
void keypros()
{  	 while(m)
  if(k1==0)
  {
   delay(1000);
   if(k1==0)
	m--;
  }
}
/******開啟外部中斷******/
 void Int0Init()
 { IT0=1;
  EX0=1;
  EA=1;
 }

/**********主函數部分*******/
void main()
{	u8 i;
	led=0xaa;        //1357位led亮起
	delay(50000);
    keypros();      //調用k1按鍵實作流水燈總開關
	led=0xfe;
	delay(50000); 
	Int0Init();	 	//調用外部中斷開啟函數
 while(1)
 {	
	while(n)
	{
		for(i=0;i<7;i++)	       //流水燈右移
		{  if(n=1){
		led=_crol_(led,1);	  
		delay(50000); }
		else 
		i=7;				   
		}	
	}	 
	 while(!n)
	 {
		for(i=0;i<7;i++)	     //流水燈左移
		{  if(n==0)	{
		led=_cror_(led,1);
		delay(50000);}
		else 
		i=7; 	
	    }
     }	
 }				 
} 
/***********************************	
*函數名: Int0 ()
*作用:通過外部中斷改變n的值實作流水燈轉向
***********************************/								   
   	 void Int0 () interrupt 0	    
   {  
        delay(1000);
        if(k2==0)
   { 
            n=!n;
  }       	  
 }