gpt4 book ai didi

c - 如何定义指向端口地址的指针

转载 作者:行者123 更新时间:2023-12-04 04:40:35 25 4
gpt4 key购买 nike

我在结构方面遇到了一些问题,并从 atmega328p 定义。

我有以下代码:

typedef struct {
char port;
unsigned char pin;
unsigned long timestamp;
} BUTTONS;

BUTTONS button_1;
BUTTONS button_2;
BUTTONS button_3;

BUTTONS* button[BUTTONS_ID_COUNT] = {&button_1,&button_2,&button_3};

void Button_init(void){

button[BUTTONS_ID_1]->port = PINB;
button[BUTTONS_ID_1]->pin = PINB4;
button[BUTTONS_ID_1]->timestamp = 0;
}

unsigned char Button_instantRead(int id){
//return PINB & (1 << PINB4);
return button[id]->port & (1 << button[id]->pin);
}

我想用我的 Button_instantRead()仅通过给它一个 ID 号就可以读取任何端口。我使用我的 init 函数来设置哪个引脚与哪个端口相关联。但是出于某种原因,当我调用我的 Button_instantRead() 时功能 即使按下开关,我也没有得到 1。

我使用注释行在我的主文件中尝试了我的配置,一切正常。

我做错了什么 return线?

经过一番谷歌搜索后,我发现 char可能不是引用端口的正确类型。我想我会更适合指向端口地址的第一个元素的指针,但我又不知道该怎么做,也找不到答案。

最佳答案

我建议先查找 PINB 的定义。我发现 this link 是一个 power point 演示文稿,它似乎引用了正确的头文件。

值得注意的文件是:

  • sfr_defs.h
  • iom328p.h

  • 定义您自己的 PINB 指针所需的所有信息都存放在其中。

    以下应该按照您的意愿工作:
    typedef struct {
    volatile uint8_t * port;
    uint8_t pin;
    unsigned long timestamp;
    } BUTTONS;

    BUTTONS button_1;
    BUTTONS button_2;
    BUTTONS button_3;

    BUTTONS* button[BUTTONS_ID_COUNT] = {&button_1,&button_2,&button_3};

    void Button_init(void){
    button[BUTTONS_ID_1]->port = &PINB;
    button[BUTTONS_ID_1]->pin = PINB4;
    button[BUTTONS_ID_1]->timestamp = 0;
    }

    unsigned char Button_instantRead(int id){
    //return PINB & (1 << PINB4);
    return *(button[id]->port) & (1 << button[id]->pin);
    }

    请注意,端口是一个指针。

    编辑:

    我不得不检查自己是否使用了 volatile 结构成员,发现 this SO questionthis other SO question 非常有趣。

    编辑 2:

    如果您使用的是 gcc(我认为您不是,因为它是 AVR 但我可能是错的)您可以跳过找出 PINB 的确切类型的步骤,并按如下方式声明您的结构:
    typedef struct {
    typeof(PINB)* port;
    uint8_t pin;
    unsigned long timestamp;
    };

    typeof operator 是 C 语言的 gcc 扩展,因此您可能无法使用它,但了解它会很好。

    关于c - 如何定义指向端口地址的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18972237/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com