【问题标题】:How to create a variable of whose bits are mapped to certain locations?如何创建其位映射到某些位置的变量?
【发布时间】:2014-07-10 11:33:32
【问题描述】:

这是一个针对 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

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

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;

现在,我想要一个名为 _7seg_DATA 的东西,它包含所有 8 个 _7seg_X 位,当我向它写入数据时,它会自动将其放入定义的引脚中。工会能做到吗?

例如,如果我执行_7seg_DATA = 0x00;,它将关闭所有 LED。 如果我这样做_7seg_DATA = 0xFF;,它会点亮所有这些。

【问题讨论】:

  • 正如我在问题中提到的,7段LED显示屏连接到不同端口的不同引脚。
  • 使用更高级的架构,您可以将变量映射到会触发总线错误的地址。然后,您可以捕获总线错误并解码请求的地址并执行操作。这有很多开销,@kkrambo 的答案要简单得多。

标签: c embedded pic


【解决方案1】:

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

【讨论】:

  • 感谢您的否定回答和替代方案:)
【解决方案2】:

只是为了补充 KKrambo 所说的内容,您可以使用 #define 来阐明每个位应该去哪里

#define ledA 0x01
#define ledB 0x02

等等……

然后在函数中(或在调用函数之前)你可以写类似

u_int8 ledS  |= ledA;

等等

【讨论】:

    【解决方案3】:

    最好的解决方案是重新设计您的硬件,将 7 段显示器的所有位组合到一个端口中。如果这不可能,您最好的选择是为您执行映射的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2018-08-16
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多