结构体后缀 :1

typedef struct
{
    u8 LCD_COM0 :1;
    u8 LCD_COM1 :1;
    u8 LCD_COM2 :1;
    u8 LCD_COM3 :1;
    u8 LCD_COM4 :1;
    u8 LCD_COM5 :1;
    u8 LCD_COM6 :1; 
    u8 LCD_COM7 :1;   
}LcdCom;

typedef union 
{
    LcdCom Lcd_Com;
    u8 LcdSegCom;
}LcdSeg;

:1
位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度

u8 LCD_COM6 :1; 

union
定义一个联合体LcdSeg类型,包含一个char变量和一个结构体
在RAM中,联合体(union)只占用一个字节
也就是说u8 LcdSegCom和 LcdCom Lcd_Com在单片机的内存中,共用一个字节,改变了Lcd_Com的值, LcdSegCom的值也被改变了

LCD_COM0~ LCD_COM8都只占用一个bit位,所以它们的值只能是0或1,这用来做标志位是足够了,如果改变了它们的值,相应的,char Flg的值也被改变了,

比如改变了 LCD_COM4的值,那么u8 LcdSegCom的第4位也被改了,这是对应的,因为他们共享同一个字节的RMA.

更多内容
传送门
摘录:
1、一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
2、由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3、位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。

你可能感兴趣的:(c语言编程相关)