我正在从事一个嵌入式系统项目,正在读取多个开关,然后根据结果进行操作。我试图保持这种模块化和抽象性,因此我的每个功能都看不到任何低级引脚号或引脚读取功能。
一次可能有多个开关关闭,因此我使用位或|
存储数字,然后使用位进行比较。我目前只是冗余地将读取的引脚转换为可以与按位运算符进行比较的开关值。
是一种更有效或更有效的方法吗?
// physical pins on microcontroller
#define pin_sw_green 5
#define pin_sw_yellow 6
#define pin_sw_blue 7
#define pin_sw_red 8
// switch numbers, allowing bitwise operators to work
#define switch_green 0x01
#define switch_yellow 0x02
#define switch_blue 0x04
#define switch_red 0x08
// store switch press to val
uint8_t button_pressed()
{
uint8_t data;
if (pin_read(pin_sw_red))
data |= switch_red;
//...
if (pin_read(pin_sw_green))
data |= switch_green;
return data;
}
//...
uint8_t button_data = button_pressed();
if (button_data & switch_red)
{
// do things..
最佳答案
如果它们是同一内存映射端口寄存器的引脚,则可以一次性读取它们。然后,您可以简单地创建一个新的蒙版:
#define SWITCH_ALL (switch_green | switch_yellow | switch_blue | switch_red)
或更难阅读,但等效:
#define SWITCH_ALL 0x0F
然后,假设您可以摆脱看似多余的
pin_read
函数:uint8_t button_pressed (void)
{
return (uint8_t) (PORTX & SWITCH_ALL);
}
其中,
PORTX
是端口数据寄存器的名称。除了速度更快之外,这还具有您所有引脚将同时同步读取的优势。
但是,您自然需要在某处添加一些按钮的反跳功能,否则读取将不可靠。
关于c - 尝试压缩代码,同时保持按位运算符的模块化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52376906/