单片机常用的“位操作”

一、前言

对于玩过单片机的人来说,寄存器多多少少都是有接触过的。只是有的同学喜欢用现成的函数库进行开发,包括我自己也是喜欢用库函数来进行开发的。毕竟调用库函数相对于直接操作寄存器来说,库函数还是比较方便的,同时代码重用性高,可移植程度高。而直接操作寄存器,虽然说芯片执行速度较快,但对于大部分开发使用场景来说感知不大。而且操作寄存器要翻阅大量数据手册,查看每位寄存器的用处,这无疑有点糟心。
其实,调用库函数终归还是对寄存器的操作。所以单片机中经常会用到“位操作”,比如说“清除指定为”即置0,又或者说“设置指定位”即置1。就可以打开某些指定的功能,关闭某些指定的功能。这就要用到“按位或”,“按位与”了。

二、“按位或”和“按位与”的使用

关于“按位或”“按位与”与“移位”在我有一篇博客说到一篇讲明白单片机里的>>&0xFF,而“按位取反”~就是0取反变成1,1取反变成0。为了更直观的看出“清除”与“设置”,下面用两个不同的数值举例说明。

2.1清除指定位
#define BIT2 (0x01 << 2)	//清除第2位

int Flag = 39;
Flag &= ~BIT2;		//等价于Flag = Flag & (~BIT2);

图例说明:
image.png

2.1设置指定位
#define BIT2 (0x01 << 2)	//设置第2位

int Flag1 = 35;
Flag1 |= BIT2;		//等价于Flag1 = Flag1 | BIT2;

图例说明:
image.png

2.3示例代码

对于不是很熟练如何转换计算的,下面提供了代码。我们可以使用代码检验出计算的到底对不对,是不是我们想要的值。

#include <stdio.h>

void FuncOutputBin(int Value)
{
	char Buf[33];
	itoa(Value, Buf, 2);
	printf("二进制为:%s\r\n", Buf);
}

#define BIT2 (0x01 << 2)
void main(void)
{
	int Flag = 39;
	int Flag1 = 35;

	Flag &= ~BIT2;		//等价于Flag = Flag & (~BIT2);
	Flag1 |= BIT2;		//等价于Flag1 = Flag1 | BIT2;

    //使用库函数itoa()打印出二进制。
	FuncOutputBin(Flag);	
	FuncOutputBin(Flag1);
}

代码运行结果:

image.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值