一、前言
对于玩过单片机的人来说,寄存器多多少少都是有接触过的。只是有的同学喜欢用现成的函数库进行开发,包括我自己也是喜欢用库函数来进行开发的。毕竟调用库函数相对于直接操作寄存器来说,库函数还是比较方便的,同时代码重用性高,可移植程度高。而直接操作寄存器,虽然说芯片执行速度较快,但对于大部分开发使用场景来说感知不大。而且操作寄存器要翻阅大量数据手册,查看每位寄存器的用处,这无疑有点糟心。
其实,调用库函数终归还是对寄存器的操作。所以单片机中经常会用到“位操作”,比如说“清除指定为”即置0,又或者说“设置指定位”即置1。就可以打开某些指定的功能,关闭某些指定的功能。这就要用到“按位或”,“按位与”了。
二、“按位或”和“按位与”的使用
关于“按位或”“按位与”与“移位”在我有一篇博客说到一篇讲明白单片机里的>>&0xFF,而“按位取反”~就是0取反变成1,1取反变成0。为了更直观的看出“清除”与“设置”,下面用两个不同的数值举例说明。
2.1清除指定位
#define BIT2 (0x01 << 2) //清除第2位
int Flag = 39;
Flag &= ~BIT2; //等价于Flag = Flag & (~BIT2);
图例说明:
2.1设置指定位
#define BIT2 (0x01 << 2) //设置第2位
int Flag1 = 35;
Flag1 |= BIT2; //等价于Flag1 = Flag1 | BIT2;
图例说明:
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);
}