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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在嵌入式C中创建可迭代的寄存器列表相关的知识,希望对你有一定的参考价值。

我一直在用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嵌入式的经验,我认为谷歌可以帮助我,但似乎我发现的所有解决方案都需要对结构和真正复杂功能的制作有很好的理解。

原因是我可能有100个引脚而且我不想为每个引脚制作“if”语句,我想在整个列表中进行迭代。我正在使用PIC18F和XC8编译器。

我在征求意见。你会怎么做?有没有比制作自己的列表类更快,更简单的方法?

答案

很难理解这里需要什么。我知道您希望在程序中读取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) {
        ...
    }
}

希望这对你有所帮助!

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

另一答案

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

#define KP_ROW LATB

然后添加一些位掩码来编写我想要的引脚。对不起这个初学者的错误!

以上是关于在嵌入式C中创建可迭代的寄存器列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中创建可编辑的树列表视图?

如何在颤动中创建可滚动的行

如何在 vuetify 中创建可滚动的 v-list?

如何在 HTML/Javascript 中创建可编辑的组合框?

如何在HTML / Javascript中创建可编辑的组合框?

如何在 WPF 中创建可折叠面板