单片机寄存器按bit处理方法


前言

现在主流单片机STM32或者EFM32等性能较为强大的单片机官方都提供了库文件和函数,具有较高的封装程序,配置寄存器的时候直接只用库文件中的宏即可,但是对于一些C8051内核的单片机,没有教好的封装库,仍然需要使用最原始的寄存器配置方式,此时常常遇到这样的问题:
1、一个寄存器有的bit位代表功能需要配置,有的位则不用配置(甚至大多数时候,剩余位可能我都还不清楚它的功能,我们就是不想去操作,让它保持原有状态),我们如何操作?
2、修改功能的时候,我们能快速的修改指定位,而不是重新把寄存器整个功能看一遍

一、方法

比较好实现上述的方法就是寄存器配置的时候能够按bit配置并且不影响其他bit位原有值。

二、具体实例

我先贴一段配置C8051F单片机定时器功能的实例,再做细节讲解。

void Timer0_Init(void)
{
	TH0 = TIMER0_RELOAD_HIGH;
	TL0 = TIMER0_RELOAD_LOW;
	
	TMOD &= ~((1<<3) | (1<<2) | (1<<1));
	TMOD |= (1<<0);
	
	CKCON &= ~((1<<2) | (1<<1));                
	CKCON |= (1<<0);
	
	IE |= (1<<1);                      
	TCON |= (1<<4);                   
}

实例中需要配置到TMOD的bit3,bit2,bit1,bit0位,高4位保持默认,配置CKCON的bit2,bit1,bit0,配置IE的bit1,配置TCON的bit4位,(这些寄存器剩下的位可能是复位值,可能是配置其他功能时才需要配置,反正我这里不关心)

上述实例实现了两个功能:
1、基本功能:配置了需要配置的bit位;
2、配置了需要的bit位并且不影响同一寄存器的其他bit位
其中,第二点尤为重要。
实例中需要注意的细节就是对于bit“置1”和“置0”的配置区别。

1: 寄存器 |= 1<<(第几位)
eg:
TMOD |= (1<<0)  //给TMOD寄存器的bit0置10:寄存器 &= ~1<<(第几位))
eg:
TMOD &= ~((1<<3) | (1<<2) | (1<<1));//给TMOD寄存器的bit3,bit2,bit1三个位置0.

如果不理解,可以亲自用例子来试试。
对于初学者,多个bit位置0还容易犯错写成下面的形式:

寄存器 &= ~1<<(第x位)|  ~1<<(第y位)

这样的配置是错误的,仍然可以自己实例验证一下。
多个bit位置0的正确表达方式如下:

寄存器 &= ~((1<<(第x位)|1<<(第y位)//取反符号放在最前面,先各位取“或”,然后最后统一取“非”。

总结

博文仅个人总结,如有错误,可留言反馈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值