要想實作這樣的流水燈,很簡單,通過移位運算就可以很簡單的寫出來
- 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;
}