如何创建一个位映射到某些位置的变量?

abd*_*man 1 c embedded pic

这是8位PIC单片机的嵌入式C问题.

假设有一个7段LED显示屏连接到不同端口的不同引脚,假设它们的定义如下:

#define _7seg_A         PORTCbits.RC6
#define TRIS_7seg_A     TRISCbits.TRISC6
#define _7seg_B         PORTCbits.RC5
#define TRIS_7seg_B     TRISCbits.TRISC5
#define _7seg_C         PORTAbits.RA5
#define TRIS_7seg_C     TRISAbits.TRISA5
#define _7seg_D         PORTBbits.RB6
#define TRIS_7seg_D     TRISBbits.TRISB6
#define _7seg_E         PORTBbits.RB5
#define TRIS_7seg_E     TRISBbits.TRISB5
#define _7seg_F         PORTBbits.RB7
#define TRIS_7seg_F     TRISBbits.TRISB7
#define _7seg_G         PORTCbits.RC7
#define TRIS_7seg_G     TRISCbits.TRISC7
#define _7seg_DP        PORTAbits.RA4
#define TRIS_7seg_DP    TRISAbits.TRISA4
Run Code Online (Sandbox Code Playgroud)

此外,这是来自编译器的微控制器定义头文件的端口定义:

typedef union {
    struct {
        unsigned RA0                    :1;
        unsigned RA1                    :1;
        unsigned RA2                    :1;
        unsigned RA3                    :1;
        unsigned RA4                    :1;
        unsigned RA5                    :1;
    };
} PORTAbits_t;
extern volatile PORTAbits_t PORTAbits @ 0x005;
Run Code Online (Sandbox Code Playgroud)

现在,我希望有一个_7seg_DATA包含所有8个_7seg_X位的调用,当我向它写入数据时,它会自动将它放入定义的引脚中.这可以由工会来完成吗?

例如,如果我这样做_7seg_DATA = 0x00;将关闭所有LED ..如果我这样做_7seg_DATA = 0xFF;将点亮所有LED .

kkr*_*mbo 5

不,您不能使用联合或结构将单个字节的各个位映射到多个内存映射的寄存器地址.但是,您可以创建一个函数接收8位字节作为参数,那么函数到相应的端口的寄存器每个位映射.