我一直在使用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编译器一起使用。
我正在寻求建议。你会怎么做?有没有比创建自己的列表类更快,更简单的方法?
答案 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
然后添加一些位掩码以写入我想要的引脚。 抱歉,这个初学者的错误!