gpt4 book ai didi

c - 尝试压缩代码,同时使用按位运算符保持模块化

转载 作者:行者123 更新时间:2023-11-30 16:28:26 25 4
gpt4 key购买 nike

我正在开发一个嵌入式系统项目,正在读取多个开关,然后根据结果执行操作。我试图保持这种模块化和抽象性,因此我的每个函数都看不到任何低级引脚号或引脚读取函数。

一次可能有多个开关关闭,因此我使用按位或|存储数字,然后使用按位进行比较。我目前只是将读取的引脚冗余地转换为可以与按位运算符进行比较的开关值。

是否有更有效或更好的方法来做到这一点?

// 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/

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