文章目录
一、MDK下C语言基础
1.位操作
简而言之,位操作就是对基本类型变量可以在位级别进行操作。C 语言支持如下 6 种位操作:
运算符 | 含义 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
下面介绍位操作在单片机开发中的一些实用技巧。
-
不改变其他位的值的状况下,对某几个位进行设值。
方法就是先对需要设置的位用&
操作符进行清零操作,然后用|
操作符设值。比如:要改变GPIOA->ODR
的状态,可以先对寄存器的值进行&
清零操作GPIOA->ODR &=0XFF0F; //将第 4-7 位清 0
然后再与需要设置的值进行
|
或运算GPIOA->ODR |=0X0040; //设置相应位的值,不改变其他位的值
-
移位操作提高代码的可读性
移位操作在单片机开发中也非常重要。比如:将ODR
寄存器的第 5 位设置为 1GPIOA->ODR| = 1 << 5;
如果写成
GPIOA->ODR =0x0020;
这样的代码可读性非常差同时也不好重用。
-
~
取反操作使用技巧
例如:GPIOA->ODR
寄存器的每一位都用来设置一个IO
口的输出状态,某个时刻我们希望去设置某一位的值为 0,同时其他位都为 1,简单的作法是直接给寄存器设置一个值:GPIOA->ODR =0xFFF7;
这样的作法设置第 3 位为 0,但是这样的写法可读性很差。使用取反操作实现如下:
GPIOA->ODR= (uint16_t)~(1<<3);