嵌入式开发中对寄存器的位操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_877667836/article/details/82868544