针对avr-libc框架,代码如下:
void set_register_bits(volatile uint8_t *mcu_register, int n, ...)
{
uint8_t i = 0, temp = 0x00;
va_list pointer;
va_start(pointer, n);
for( i = 0; i < n; i++)
{
temp |= _BV( va_arg(pointer, int) );
}
*mcu_register |= temp;
}
void clear_register_bits(volatile uint8_t *mcu_register, int n, ...)
{
uint8_t i = 0, temp = 0xff;
va_list pointer;
va_start(pointer, n);
for( i = 0; i < n; i++)
{
temp &= ~_BV( va_arg(pointer, int) );
}
*mcu_register &= temp;
}
代码中的n表示要置位或清零的位个数。
例如,设置寄存器PORTB的bit5为1:
set_register_bits(&PORTB, 1, PB5);
设置PORTB寄存器的bit5、bit4为1:
set_register_bits(&PORTB, 2, PB4, PB5);
清零寄存器的某些位clear_register_bits()函数用法类似。
这种方法的优点是直观,缺点是增加了代码开销。
|