1.结构体联合体应用简单示例
代码如下(示例):
/*** 8位二进制显示 ***/
void toHex(u8 data)
{
u8 bin = 0;
for(int i=0;i<8;i++)
{
bin = data<<i;
bin = bin >>7;
if(bin)printf("1");
else printf("0");
}
printf("\r\n");
}
typedef union Byte {
struct bit
{
u8 b7 : 1;
u8 b6 : 1;
u8 b5 : 1;
u8 b4 : 1;
u8 b3 : 1;
u8 b2 : 1;
u8 b1 : 1;
u8 b0 : 1;
}bit;
u8 byte;
}Byte;
void UserMain(void)
{
Byte reg;
Byte *pReg;
printf("\n---> user task \n");
printf("sizeof(union Byte):%d\r\n",sizeof(union Byte));
reg.byte = 0b10000001;
toHex(reg.byte);
printf("%d",reg.bit.b0);
printf("%d",reg.bit.b1);
printf("%d",reg.bit.b2);
printf("%d",reg.bit.b3);
printf("%d",reg.bit.b4);
printf("%d",reg.bit.b5);
printf("%d",reg.bit.b6);
printf("%d",reg.bit.b7);
printf("\r\n");
pReg = ®
pReg->byte = 0b10111101;
toHex(pReg->byte);
printf("%d",pReg->bit.b0);
printf("%d",pReg->bit.b1);
printf("%d",pReg->bit.b2);
printf("%d",pReg->bit.b3);
printf("%d",pReg->bit.b4);
printf("%d",pReg->bit.b5);
printf("%d",pReg->bit.b6);
printf("%d",pReg->bit.b7);
printf("\r\n");
pReg->bit.b3 = 0;
pReg->bit.b4 = 0;
toHex(pReg->byte);
}
2.执行结果
如下:
---> user task
sizeof(union Byte):1
10000001
10000001
10111101
10111101
10100101
3.在W800上面测试代码
如下:
typedef union Bytes {
struct bits
{
u32 bit00 : 1;
u32 bit01 : 1;
u32 bit02 : 1;
u32 bit03 : 1;
u32 bit04 : 1;
u32 bit05 : 1;
u32 bit06 : 1;
u32 bit07 : 1;
u32 bit08 : 1;
u32 bit09 : 1;
u32 bit10 : 1;
u32 bit11 : 1;
u32 bit12 : 1;
u32 bit13 : 1;
u32 bit14 : 1;
u32 bit15 : 1;
u32 bit16 : 1;
u32 bit17 : 1;
u32 bit18 : 1;
u32 bit19 : 1;
u32 bit20 : 1;
u32 bit21 : 1;
u32 bit22 : 1;
u32 bit23 : 1;
u32 bit24 : 1;
u32 bit25 : 1;
u32 bit26 : 1;
u32 bit27 : 1;
u32 bit28 : 1;
u32 bit29 : 1;
u32 bit30 : 1;
u32 bit31 : 1;
}bits;
u32 bytes;
u8 byte[4];
}Bytes;// 其中bits、bytes、byte[4]、共用内存 4byte,都可以用于操作数据
// GPIO数据寄存器、数据使能寄存器地址
Bytes *pPaDt = HR_GPIOA_DATA;
Bytes *pPbDt = HR_GPIOB_DATA;
Bytes *pPaEn = HR_GPIOA_DATA_EN;
Bytes *pPbEn = HR_GPIOB_DATA_EN;
void UserMain(void)
{
u8 *VERSION = "\r\n--->Compile "__DATE__", "__TIME__"\r\n";
printf("%s\r\n\r\n",VERSION);
printf("\n---> user task \n");
// 配置GPIO输出模式
tls_gpio_cfg(WM_IO_PB_00, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_01, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(WM_IO_PB_02, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
// 配置GPIOB 数据使能寄存器
pPbEn->bytes = 0xFFFFFFFF;
// 配置GPIOB 数据寄存器对应位的电平
pPbDt->bits.bit00 = 1; // WM_IO_PB_00
pPbDt->bits.bit01 = 1; // WM_IO_PB_01
pPbDt->bits.bit02 = 1; // WM_IO_PB_02
pPbDt->bits.bit00 = 0;
tls_os_time_delay(HZ);
pPbDt->bits.bit00 = 1;
tls_os_time_delay(HZ);
pPbDt->bits.bit01 = 0;
tls_os_time_delay(HZ);
pPbDt->bits.bit01 = 1;
tls_os_time_delay(HZ);
pPbDt->bits.bit02 = 0;
tls_os_time_delay(HZ);
pPbDt->bits.bit02 = 1;
tls_os_time_delay(HZ);
pPbDt->bits.bit00 = 0;
pPbDt->bits.bit01 = 0;
pPbDt->bits.bit02 = 0;
tls_os_time_delay(HZ);
pPbDt->bits.bit00 = 1;
pPbDt->bits.bit01 = 1;
pPbDt->bits.bit02 = 1;
tls_os_time_delay(HZ);
}
4.执行结果
如下:
自行脑...