在嵌入式C中创建寄存器的可迭代列表

时间:2018-07-16 01:20:38

标签: c list struct embedded

我一直在使用python java和c ++进行编程,它们都已预定义了列表对象。我现在正在使用C嵌入式微控制器进行开发,但是根本不存在诸如列表之类的对象以及诸如printf之类的功能。

我想做的是以下几点。我有多个附加到定义的寄存器。我想将所有定义都放在可以访问的列表中。

#include <stdlib.h>
#include <stdio.h>
#include <xc.h>

#define KP_ROW1     LATBbits.LATB0
#define KP_ROW2     LATBbits.LATB1
#define KP_ROW3     LATBbits.LATB2
#define KP_ROW4     LATBbits.LATB3
#define KP_COL1     LATBbits.LATB4
#define KP_COL2     LATBbits.LATB5
#define KP_COL3     LATBbits.LATB6
#define KP_COL4     LATBbits.LATB7

KP_ROW = [KP_ROW1, KP_ROW2, KP_ROW3, KP_ROW4]; //error on this line
KP_COL = [KP_COL1, KP_COL2, KP_COL3, KP_COL4]; //error

for(int i=0;i<4;i++)
    {
        if (KP_COL[i] == 1){return 1;}
    }

由于我以前没有使用C进行嵌入式的经验,因此我认为google可以为我提供帮助,但是似乎所有找到的解决方案都需要对struct以及真正复杂的函数的构造有很好的了解。

这样做的原因是,我可能有100个图钉,并且我不想为每个图钉都写“ if”语句,所以我想遍历整个列表。我正在将PIC18F与XC8编译器一起使用。

我正在寻求建议。你会怎么做?有没有比创建自己的列表类更快,更简单的方法?

2 个答案:

答案 0 :(得分:0)

很难理解这里需要什么。我了解您希望在程序中读取100寄存器的值。您必须知道他们的地址。然后,您可以创建一系列宏:

#define REG1 0xabcd
#define REG2 0x1234
...

或以任何地址为准。然后,创建更多宏以直接访问值:

#define REG1_VAL (*(volatile uint8_t *) REG1)
#define REG2_VAL (*(volatile uint8_t *) REG2)
...

然后,您可以编写诸如REG1_VAL = 1之类的赋值或诸如REG1_VAL == 1之类的测试。否则,您可以创建通过其地址访问其值的宏:

#define READ(reg) (*(volatile uint8_t *) reg)

使用上述方法获取寄存器值的方法是:

READ(REG1);

然后您可以分配100个元素的数组:

volatile uint8_t regs[100] = {REG1, REG2, ..., REG100};

并遍历该数组:

for (i = 0; i < 100; i ++) {
    if (READ(regs[i]) == 1) {
        ...
    }
}

希望这对您有帮助!

注意:这些宏需要进行微调,以避免细微的错误,但是我希望它们对说明我的意思仍然有用。

答案 1 :(得分:0)

我找到了答案! 它没有用,因为我试图获取位的地址,而不是寄存器。它应该是:

#define KP_ROW LATB

然后添加一些位掩码以写入我想要的引脚。 抱歉,这个初学者的错误!