当前位置: 代码迷 >> 单片机 >> 单片机中共用体的使用有关问题
  详细解决方案

单片机中共用体的使用有关问题

热度:59   发布时间:2016-04-28 15:15:57.0
单片机中共用体的使用问题
在做旋转时钟,今天看了一上午代码,参看的大神程序匠人的程序,对大神深厚而规范的编程功底膜拜一下。
一个地方很不懂,他首先定义了一个结构体。
typedef struct  { 
 unsigned b0 : 1;      //结构元素表 
        unsigned b1 : 1; 
        unsigned b2 : 1; 
        unsigned b3 : 1; 
        unsigned b4 : 1; 
        unsigned b5 : 1; 
        unsigned b6 : 1; 
        unsigned b7 : 1; 
} BIT_F; 

然后定义了一个联合体,结构体BIT_F为其成员。
typedef union { 
  BIT_F   oneBit;   //按位寻址 
  tU08  allBits;  //按字节寻址 
}FLAG_union;      //定义一个既能按位寻址,也可按字节寻址的联合
在后续,匠人进行了一系列的宏定义:
EXT_ FLAG_union PORTA_TEMP;     //PORTA 口输出临时缓冲区 
EXT_ FLAG_union PORTB_TEMP;     //PORTB 口输出临时缓冲区 
EXT_ FLAG_union PORTC_TEMP;     //PORTC 口输出临时缓冲区 
EXT_ FLAG_union DISP_BUF;     //字码缓冲区 
#define PORTA_TMP PORTA_TEMP.allBits 
#define PORTB_TMP PORTB_TEMP.allBits 
#define PORTC_TMP PORTC_TEMP.allBits 
#define LED01_TMP PORTC_TEMP.oneBit.b4      //外框
#define LED02_TMP PORTB_TEMP.oneBit.b1      //行 1 
#define LED03_TMP PORTB_TEMP.oneBit.b2      //行 2 
#define LED04_TMP PORTB_TEMP.oneBit.b3      //行 3 
#define LED05_TMP PORTB_TEMP.oneBit.b4      //行 4 
#define LED06_TMP PORTB_TEMP.oneBit.b5      //行 5 
#define LED07_TMP PORTB_TEMP.oneBit.b6      //行 6 
#define LED08_TMP PORTB_TEMP.oneBit.b7      //行 7 
#define LED09_TMP PORTA_TEMP.oneBit.b1      //行 8 
#define LED10_TMP PORTA_TEMP.oneBit.b2      //行 9 
#define LED11_TMP PORTA_TEMP.oneBit.b3      //行 10 
#define LED12_TMP PORTA_TEMP.oneBit.b4      //行 11 
#define LED13_TMP PORTA_TEMP.oneBit.b5      //行 12 
#define LED14_TMP PORTC_TEMP.oneBit.b0      //行 13 
#define LED15_TMP PORTC_TEMP.oneBit.b1      //行 14 
#define LED16_TMP PORTC_TEMP.oneBit.b2      //行 15 
#define LED17_TMP PORTC_TEMP.oneBit.b3      //表针 
//(特别注意:该口与其他口的控制电平相反.其他口 0=亮,1=灭;该口 0=灭,1=亮) 
#define LED29_TMP PORTC_TEMP.oneBit.b5      //内框 
#define DISP_BF DISP_BUF.allBits 
#define DISP_BF_0 DISP_BUF.oneBit.b0      //bit_0 
#define DISP_BF_1 DISP_BUF.oneBit.b1      //bit_1 
#define DISP_BF_2 DISP_BUF.oneBit.b2      //bit_2 
#define DISP_BF_3 DISP_BUF.oneBit.b3      //bit_3 
#define DISP_BF_4 DISP_BUF.oneBit.b4      //bit_4 
#define DISP_BF_5 DISP_BUF.oneBit.b5      //bit_5 
#define DISP_BF_6 DISP_BUF.oneBit.b6      //bit_6 
#define DISP_BF_7 DISP_BUF.oneBit.b7      //bit_7 
程序匠人的基本思路我还是清楚,就是通过操作共用体中的成员来达到控制端口电平的作用,我疑惑的是,他只是简单的定义了一下共用体名称,并没有定义共用体成员对应的端口。比如说LED12_TMP对应的是A端口的4位,通过宏定义可以找到
LED12_TMP PORTA_TEMP.oneBit.b4
但是PORTA_TEMP.oneBit.b4只是作了如下定义:
EXT_ FLAG_union PORTA_TEMP;     //PORTA 口输出临时缓冲区 
并没有指定PORTA_TEMP就是对应的端口A,那给共用体赋值怎么能映射到端口哦上去呢?
单片机 共用体

------解决方案--------------------
你编译一下然后启动debug看看变量“PORTA_TEMP”是不是放在了PORTA的数据寄存器的地址上?一般会在h文件里吧这些变量放在一些特殊的地址上,用来方便用户直接操作寄存器。比如PORTA的寄存器物理地址是0x00000010,那么变量“PORTA_TEMP”就会被放在这个地址上,那么用户操作“PORTA_TEMP”就相当于在操作寄存器了,至于怎么放到这个地址上的,每家的编译器有不同的命令,建议你在project内搜索关键字“PORTA_TEMP”,看看其他地方有木有这方面的定义
  相关解决方案