打印

联合体,结构体求解

[复制链接]
1873|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
poorhack|  楼主 | 2014-8-13 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是PIC单片机头文件中一个寄存器的代码:

typedef union {
    struct {
        unsigned IOCIF                  :1;
        unsigned INTF                   :1;
        unsigned TMR0IF                 :1;
        unsigned IOCIE                  :1;
        unsigned INTE                   :1;
        unsigned TMR0IE                 :1;
        unsigned PEIE                   :1;
        unsigned GIE                    :1;
    };
    struct {
        unsigned                        :2;
        unsigned T0IF                   :1;
        unsigned                        :2;
        unsigned T0IE                   :1;
    };
} INTCONbits_t;
extern volatile INTCONbits_t INTCONbits @ 0x00B;
如果我想只对IOCIF置1其余不动,是不是可以写成
INTCONbits_t.IOCIF=1;  ?
我编译了一下,提示出错“no identifier in declaration”
但是写成
INTCONbits.IOCIF=1;
就编译成功
可是仿真时SFR对应数值并不是我设置的那样(我仿真时用的不是这个寄存器,这里只是个示例)。
C语言结构体,联合体对我来说完全是空白,只想求大神告诉我这个应该怎么用,分几种种情况,第一只对某一位赋值,第二对整个INTCON赋值。当然如果写下读取的C语言形式,也不胜感激!

相关帖子

沙发
wangch_sh| | 2014-8-13 17:46 | 只看该作者
看看C语言书吧

使用特权

评论回复
板凳
deayfkkk| | 2014-8-13 20:24 | 只看该作者
本帖最后由 deayfkkk 于 2014-8-13 20:26 编辑

INTCONbits_t 这个是名字,
INTCONbits这个是变量,
例如:      int a;
   int = 1;//错误
   a=1;//正确。
把extern volatile INTCONbits_t INTCONbits @ 0x00B 和 int a 比较一下。

使用特权

评论回复
地板
xjjspace| | 2014-8-13 21:56 | 只看该作者
本帖最后由 xjjspace 于 2014-8-13 21:58 编辑

第一,typedef 的作用就是“起绰号”:用来为复杂的声明定义简单的别名。
typedef unsigned char uchar;
uchar a;  
就相当于是 unsigned char a;
同理,typedef union {...} INTCONbits_t;   
INTCONbits_t  INTCONbits;  
就相当于union {...}INTCONbits;
无非就是你起的这个绰号 前面加了 extern volatile,后面加了@0x00B而已,类型修饰符 和 地址 这你应该懂的。
第二,这种定义方式你一层层看就明白了。
联合体:就是“鸠占鹊巢,有你没我”。INTCONbits_t现在就是这样一个数据类型,它的两个成员比较特殊,是两个结构体。两个结构体又分别有各自的结构体成员变量。
把问题简单化,你就明白了。你这个例子可以类比为
typedef union{
    struct{
          xxx c1;
    }B1;
    struct{
         xxx c2;
    }B2;
}A;
extern volatile A a @0x00;怎么访问c1呢,一层层往里进咯。

使用特权

评论回复
5
sevenjul| | 2014-8-14 13:28 | 只看该作者
标志!

使用特权

评论回复
6
poorhack|  楼主 | 2014-8-21 08:51 | 只看该作者
deayfkkk 发表于 2014-8-13 20:24
INTCONbits_t 这个是名字,
INTCONbits这个是变量,
例如:      int a;

谢谢,这个解释好形象,一看就懂了。

使用特权

评论回复
7
poorhack|  楼主 | 2014-8-21 08:52 | 只看该作者
xjjspace 发表于 2014-8-13 21:56
第一,typedef 的作用就是“起绰号”:用来为复杂的声明定义简单的别名。
typedef unsigned char uchar;
u ...

好专业,你的解释也看懂了,谢谢!

使用特权

评论回复
8
MR4| | 2014-9-20 20:29 | 只看该作者
驱动。。。只是片节

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

198

帖子

6

粉丝