要想实现这样的流水灯,很简单,通过移位运算就可以很简单的写出来
- 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;
}