移位运算控制流水灯

流水灯模式1
要想实现这样的流水灯,很简单,通过移位运算就可以很简单的写出来

- 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的初始值,可以实现以下流水灯
流水灯模式2

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值