【发布时间】:2013-09-24 02:56:10
【问题描述】:
我在使用 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 可能不是引用端口的正确类型。我想我会更适合指向端口地址的第一个元素的指针,但我不知道该怎么做,也找不到答案。
【问题讨论】:
-
猜测:确保要读取 pin,您传递的是 ID=0,而不是 ID=1。仔细检查强制性嵌入头文件中 PINB4 和 PINB 的大小和类型,确保它们匹配。
-
糟糕,我应该说假设 BUTTONS_ID_1=0 这可能是。
-
怀疑
PINB4不在0到31的范围内。如果是这样,1 << PINB4不是你想要的。 -
初始化时只读取端口的值。
标签: c microcontroller avr-gcc