|
发表于 2009-3-17 12:44:51
|
显示全部楼层
#ifndef __BITFIELD_H__
#define __BITFIELD_H__
#define GET_BITFIELD(addr) (*((volatile bitfield *)(addr)))
#define __GET_BIT(addr,b) GET_BITFIELD(addr).bit##b
#define GET_BIT(addr,b) __GET_BIT(addr,b)
#define GET_Bitfield(addr) (*(( bitfield *)(addr)))
#define __GET_Bit(addr,b) GET_Bitfield(addr).bit##b
#define GET_Bit(addr,b) __GET_Bit(addr,b)
#define BIT_Alias(A,B) GET_Bit(A,B)
#define BIT_ALIAS(A,B) GET_BIT(A,B)
#define GET_BITFIELD8(addr) (*((volatile bitfield8 *)(addr)))
#define __GET_BIT8(addr,b) GET_BITFIELD8(addr).bit##b
#define GET_BIT8(addr,b) __GET_BIT8(addr,b)
#define GET_Bitfield8(addr) (*(( bitfield8 *)(addr)))
#define __GET_Bit8(addr,b) GET_Bitfield8(addr).bit##b
#define GET_Bit8(addr,b) __GET_Bit8(addr,b)
#define BIT8_Alias(A,B) GET_Bit8(A,B)
#define BIT8_ALIAS(A,B) GET_BIT8(A,B)
#define GET_BITFIELD16(addr) (*((volatile bitfield16 *)(addr)))
#define __GET_BIT16(addr,b) GET_BITFIELD16(addr).bit##b
#define GET_BIT16(addr,b) __GET_BIT16(addr,b)
#define GET_Bitfield16(addr) (*(( bitfield16 *)(addr)))
#define __GET_Bit16(addr,b) GET_Bitfield16(addr).bit##b
#define GET_Bit16(addr,b) __GET_Bit16(addr,b)
#define BIT16_Alias(A,B) GET_Bit16(A,B)
#define BIT16_ALIAS(A,B) GET_BIT16(A,B)
#define GET_BITFIELD32(addr) (*((volatile bitfield32 *)(addr)))
#define __GET_BIT32(addr,b) GET_BITFIELD32(addr).bit##b
#define GET_BIT32(addr,b) __GET_BIT32(addr,b)
#define GET_Bitfield32(addr) (*(( bitfield32 *)(addr)))
#define __GET_Bit32(addr,b) GET_Bitfield32(addr).bit##b
#define GET_Bit32(addr,b) __GET_Bit32(addr,b)
#define BIT32_Alias(A,B) GET_Bit32(A,B)
#define BIT32_ALIAS(A,B) GET_BIT32(A,B)
#define IO_BIT_ALIAS(A,B) GET_BIT(A,B)
#define IO_BIT8_ALIAS(A,B) GET_BIT8(A,B)
#define IO_BIT16_ALIAS(A,B) GET_BIT16(A,B)
#define IO_BIT32_ALIAS(A,B) GET_BIT32(A,B)
#ifdef __IAR_AVR__ //IARAVR需要宏定义 __IAR_AVR__
#undef GET_IO_BITFIELD
#undef GET_IO_BIT
#undef GET_IO_BITFIELD8
#undef GET_IO_BIT8
#define GET_IO_BITFIELD(A) (*(( __io volatile bitfield *)(A)))
#define GET_IO_BIT(A,B) GET_IO_BITFIELD(A).bit##B
#define GET_IO_BITFIELD8(A) (*(( __io volatile bitfield8 *)(A)))
#define GET_IO_BIT8(A,B) GET_IO_BITFIELD8(A).bit##B
#endif
typedef union
{
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 bit6:1;
unsigned char bit7:1;
};
unsigned char Byte;
}bitfield8;
#define bitfield bitfield8
typedef union{
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 bit6:1;
unsigned char bit7:1;
unsigned char bit8:1;
unsigned char bit9:1;
unsigned char bit10:1;
unsigned char bit11:1;
unsigned char bit12:1;
unsigned char bit13:1;
unsigned char bit14:1;
unsigned char bit15:1;
} ;
unsigned short Word;
}bitfield16;
typedef union{
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 bit6:1;
unsigned char bit7:1;
unsigned char bit8:1;
unsigned char bit9:1;
unsigned char bit10:1;
unsigned char bit11:1;
unsigned char bit12:1;
unsigned char bit13:1;
unsigned char bit14:1;
unsigned char bit15:1;
unsigned char bit16:1;
unsigned char bit17:1;
unsigned char bit18:1;
unsigned char bit19:1;
unsigned char bit20:1;
unsigned char bit21:1;
unsigned char bit22:1;
unsigned char bit23:1;
unsigned char bit24:1;
unsigned char bit25:1;
unsigned char bit26:1;
unsigned char bit27:1;
unsigned char bit28:1;
unsigned char bit29:1;
unsigned char bit30:1;
unsigned char bit31:1;
};
unsigned long Dword;
} bitfield32;
#endif
IAR AVR:
#define __IAR_AVR__
#include "bitfield.h"
#define LED IO_BIT_ALIAS(&PORTA,0)
LED =0;
LED =1;
GCC AVR:
#include "bitfield.h"
#define LED IO_BIT_ALIAS(&PORTA,0)
LED =0;
LED =1;
其他如IAR ARM,IAR MSP430都可使用。 |
|