字节位操作(位域的应用)

一、单片机机 中怎样实现字节位操作:

1、ANSIC中,一般采用“读-修改-写”的方法实现单个位的位操作,通过与0“与”操作,将某一位清0。如使i变量的b0位为0,实现方法为i=i&0xfe。通过与1“或”操作,将某一位置1。如使i变量的b0位为1,实现方法为i=i|0x01。通过与1“异或”操作,将某一位取反。如使i变量的b0位取反,实现方法为i=i^0x01。 

2 、通过位域的方法实现位操作 
标准C提供了一种基于结构体的数据结构--位域(BitField),位域就是把一个存储单元中的二进制划分为几个不同的区域。并说明每个区域的位数。每一个域有一个域名,允许在程序中按域名进行操作,位域的定义格式如下: 
struct位域结构名{ 

位域列表 }; 

位域列表格式为:类型说明符 位域名:位域长度如: 

struct k{ 

unsigned int a:1

unsigned int :2 

unsigned int b:3 

unsigned int :0     //空域 

}k1; 
说明: 
1)各位依次从低位到高位排列,排满一个存储单元,按地址接着排下一单元; 
2)位域可以无域名,但不能被引用,如第二域,这时其只用来填充或调整位置; 
3)第四行称空域,目的是将目前存储单元的剩余部分分为一个域,且填充0。 
位域的引用很简单,如: 
k1.a=1; //置k1的b0位为1 
k1.b=7; //将k1的b3-5位置111 
通过位域定义位变量,是实现单个位位操作的重要途径和方法,采用位域定义位变量,产生的代码紧凑、高效。

 

二、位域的应用:

//   1、位域方式。先定义一个位域
typedefstruct _bit_struct
{
  unsigned char bit0 : 1 ;
  unsigned char bit1 : 1 ;
  unsigned char bit2 : 1 ;
  unsigned char bit3 : 1 ;
  unsigned char bit4 : 1 ;
  unsigned char bit5 : 1 ;
  unsigned char bit7 : 1 ;
  unsigned char bit6 : 1 ;
}bit_field;


//再用一个宏    ,来指向要操作位。
#defineLED            GET_BITFIELD(PORTB).bit0
 
#define BUTTON      GET_BITFIELD(PINB).bit7
//使用时只需要直接赋值即可:如LED =     0 ,LED = 1,  或者直接判断LED==0    ,    LED ==1.
//这种方法类似C51中位操作。直接。

//2、位移宏方式。主要有三个.
#define Set_Bit(val, bitn)    (val |=(1<<(bitn)))
#define Clr_Bit(val, bitn)    (val&=~(1<<(bitn)))
#define Get_Bit(val, bitn)    (val&(1<<(bitn)) )

/*    
3、测试程序.
           说明,假设PORTB.7接按纽,PORTB.0 接LED
           测试程序完成如下操作。
                  当BUTTON == 0时 ,LED输出1 否则输出0,
                  这样是即测试了输入,又测试了输出1和输出0,相对全面一点。 C代码如下.

                   // testled.c     测试AVR位操作.
               // 这是gcc;如是其它编译器,请修改。
               #include

               // 定义一个寄存器(Register)或端口(Port)八个位
*/
typedefstruct _bit_struct
{
   unsigned char bit0 : 1 ;
   unsigned char bit1 : 1 ;
   unsigned char bit2 : 1 ;
   unsigned char bit3 : 1 ;
   unsigned char bit4 : 1 ;
   unsigned char bit5 : 1 ;
   unsigned char bit7 : 1 ;
   unsigned char bit6 : 1 ;
}bit_field;





/*刚看了下GCC位操作请问下面:1是什么意思

typedefstruct _bit_struct  
            {  
               unsigned char bit0 : 1 ;  
               unsigned char bit1 : 1 ;  
               unsigned char bit2 : 1 ;  
               unsigned char bit3 : 1 ;  
               unsigned char bit4 : 1 ;  
               unsigned char bit5 : 1 ;  
               unsigned char bit7 : 1 ;  
               unsigned char bit6 : 1 ;  
            }bit_field; 
 
 
 
//bit 占用位数位;

//bit:2;//占用2位  

*/


//定义一个宏,用来得到每一位
#define GET_BITFIELD(addr) (*((volatile  bit_field *) (addr)))

               //定义每一个位
#define LED        GET_BITFIELD(PORTB).bit0
#define BUTTON      GET_BITFIELD(PINB).bit7




#define Set_Bit(val, bitn)    (val |=(1<<(bitn)))
#define Clr_Bit(val, bitn)    (val&=~(1<<(bitn)))
#define Get_Bit(val, bitn)    (val&(1<<(bitn)))


int main( void )

{
DDRB = 0x41;   //配置PB0为输出,PB7为输入
if ( BUTTON==0 )     LED = 1; else LED = 0;
//if(!Get_Bit(PINB,7) )  Set_Bit(PORTB,0);    elseClr_Bit(PORTB,0);
while(1);
}

你可能感兴趣的:(字节位操作(位域的应用))