前言
现在主流单片机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置1
置0:寄存器 &= ~(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位)) //取反符号放在最前面,先各位取“或”,然后最后统一取“非”。
总结
博文仅个人总结,如有错误,可留言反馈。