1 位操作
转换一个位到一个字节值中
_BV()
(1)将寄存器某位置一
sfr |= _BV(bit)
例如:
PORTB |= _BV(PB1);//将PB1置一
(2)将寄存器某位清零
sfr &= ~(_BV(bit));
例如:
PORTB &= ~(_BV(PB1));//将PB1清零
这个移位操作由编译器完成将最后的结果插入到代码中,不会产生额外的代码.
只是为了提高程序代码的可读性.
宏定义:
#define _BV(bit) (1 << (bit))
包含在<avr/sfr_defs.h>头文件中,不要直接调用
使用 #include <avr/io.h>就可以了
2 IO寄存器位操作
===========================================================
测试IO寄存器sfr的位bit是否被置1.
bit被清0则返回0,否则返回一个非零的数
bit_is_set(sfr, bit)
例如:
if (bit_is_set(PINA,PINA0))//判断PINA0引脚是否为高电平
{
//为高电平执行这里的代码
}
//这样的程序可读性非常强
宏定义:
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
================================================================
测试IO寄存器sfr的位bit是否被清0.
bit被清0则返回一个非零的数,否则返回0
bit_is_clear(sfr, bit)
宏定义:
#define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit)))
=============================================================
等待直到IO寄存器sfr的位bit被置1.
loop_until_bit_is_set(sfr, bit)
宏定义:
#define loop_until_bit_is_set(sfr, bit) do { } while (bit_is_clear(sfr, bit))
=============================================================
等待直到IO寄存器sfr的位bit被清0.
loop_until_bit_is_clear(sfr, bit)
宏定义:
#define loop_until_bit_is_clear(sfr, bit) do { } while (bit_is_set(sfr, bit))
原文:http://hi.baidu.com/avr_tutorial/item/92058fcfd0d7df2ca1b50ada