版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_877667836/article/details/82868544
在嵌入式开发中常常要对寄存器或者变量的位进行读和写,以下有几个常用的tips。
开始之前,先复习一下C语言的位与(&)位或(|)运算。
# 假设 A 为寄存器上的某一位
A | 0 = A
A & 1 = A
A | 1 = 1
A & 0 = 0
有没有发现,如果我们想要读出A ,可以使用前两组运算,想要把A设置(写)成高电平或低电平,可以使用后两组运算。
操作1位
假设有一个寄存器或变量a(最低位记为第0位)
Tips1.将第n位设置为高电平1
a |= (1<<n)
Tips2.将第n位设置为低电平0
a &= ~(1<<n)
Tips3.读出第n位
(a>>n)&1
拓展:操作多位
在串行通信中数据是按bit接收或发送的,我们需要将若干个字节拆成一位一位的发送到数据线上,或从数据线上一位一位的接收并保存。有了Tips1~3我们似乎有点思路了,不过还要注意是先发送或接收高位还是低位。
Tips4. 从高到低逐位发送
for(i=7; i>=0; i--)
{
printf("%d", (data>>i)&1);
}
Tips5. 从低到高逐位发送
for(i=0; i<8; i++)
{
printf("%d", (data>>i)&1);
}
Tips6. 从高到低逐位接收
Tips7. 从低到高逐位接收
#include <stdio.h>
int main()
{
//data_line:模拟数据线依次发来的高低电平
unsigned char data_line[] = {0,1,1,0, 0,0,1,0};
//将接受的数据保存到data中 ,记得初始化为0
unsigned char data = 0;
int i;
//先接受的数据作为低位
for(i=0; i<8; i++)
{
data |= (data_line[i]<<i);
}
printf("0x%x\n",data);
//先接受的数据作为高位
data =0;
for(i=7; i>=0; i--)
{
data |= (data_line[7-i]<<i);
}
printf("0x%x\n",data);
return 0;
}