【单片机】位运算示例二,用stc89c52单片机实现流水灯效果

序言

还记得我们之前实现的流水灯吧,点这里查看,通过位运算,我们可以轻易的实现流水灯效果,本篇文章,我们对上次的效果进行升级,将实现LED两边往中间点亮的效果。
注:本文位运算用到了左移、右移、取反,如果对位运算不了解,可以看【信奥赛·算法基础】CSP-J 位运算一文

实现

为了实现LED由两边往中间点亮的效果,我们先来分析每一组的二进制数据:

轮数二进制数
10111 1110
21011 1101
31101 1011
41110 0111
  • 接下来针对第一轮数据进行分析
    1. 先对 0111 1110取反,得到 1000 0001
    2. 将第一步得到的数据右移,得到 0100 0000
    3. 将第一步得到的数据左移,得到 0000 0010
    4. 将第二步第三步得到的数据进行与运算得到 0100 0010
    5. 显然,到了第4步,就已经能正常计算出第二轮的二进制数据了

示例

#include <stc89c5xrc.h>
#define LED P2

void Delay(unsigned int ms) 
{
		unsigned char i, j;
	
		while(ms--) {
			i = 2;
			j = 199;
			do
			{
				while (--j);
			} while (--i);
		}

}

void main()
{
	int i = 0;
	unsigned char x = 0x7e;
	while(1)
	{
		while(++i < 4)
		{
			LED = x;
			unsigned char temp = ~x;
			unsigned char a = temp >> 1;
			unsigned char b =  temp << 1;
			x = a & b;
			Delay(100);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值