天天看點

移位運算控制流水燈

移位運算控制流水燈

要想實作這樣的流水燈,很簡單,通過移位運算就可以很簡單的寫出來

- 1移位控制

void Led_buff()
{
		static uchar index = 0;
		uchar left = 0x80,right = 0x01;
	
		left = left>>index;          //從左往右移位
		right = right<<index;        //從右往左移位
		led = left|right;            //進行或運算,得出led的值
				
		index++;
		if(index == 4) index = 0;
}
           

同理:通過設定left和right的初始值,可以實作以下流水燈

移位運算控制流水燈
void Led_buff()
{
		static uchar index = 0;
		uchar left = 0x08,right = 0x10;    //設定起點
	
		left = left>>index;           //從左往右移位
		right = right<<index;         //從右往左移位
		led = left|right;             //進行或運算,得出led的值
				
		index++;
		if(index == 4) index = 0;
}
           

## 遇到此類問題時,記住活用移位運算

代碼

******************************************************************************
* 檔案名:移位運算控制流水燈
* 描  述:
* 作  者:思索與貓
* 日  期:  19/3/10
* 備  注: 
*         
******************************************************************************
#include<stc15f2k60s2.h>
#define uchar unsigned char
#define uint unsigned int

uchar led;
void CloseFucker();
void Timer0Init();
void Led_buff();

void main()
{
		CloseFucker();
		Timer0Init();
		while(1)
		{
				P2 = (P2&0x1f)|0x80;
				P0 = ~led;
				P2 = P2&0x1f;				
		}
}

void Led_buff()
{
		static uchar index = 0;
		uchar left = 0x80,right = 0x01;
	
		left = left>>index;
		right = right<<index;
		led = left|right;
		
		index++;
		if(index == 4) index = 0;
}

void T0_time() interrupt 1
{
		static uchar led_count = 0;
		TL0 = 0x40;		
		TH0 = 0xA2;	
		if(++led_count == 250)        //500ms一次掃描
		{
				led_count = 0;
				Led_buff();
		}
}

void Timer0Init()		  //12Mhz 2ms
{
		AUXR |= 0x80;		
		TMOD &= 0xF0;		
		TL0 = 0x40;		
		TH0 = 0xA2;		
		TF0 = 0;		
		TR0 = 1;	
		ET0 = 1;
		EA = 1;
}

void CloseFucker()
{
		P2 = (P2&0x1f)|0xa0;
		P0 = 0xa0;
		P2 = P2&0x1f;
}
           

繼續閱讀