如何精简C语言代码实现PCA9575 GPIO电平设置的相同功能?
精简版PCA9575 GPIO电平设置函数
当然可以用更精简的代码实现完全相同的功能,以下是优化后的版本,同时严格保留原函数的所有逻辑(包括原代码中仅读取OUT0寄存器状态的特殊处理):
void PCA9575_set_gpio_level(uint8_t gpio_num, uint8_t level) { // 仅处理有效引脚:30-35 或 38-43(原函数中28、29、36、37直接返回) if (!((gpio_num >= 30 && gpio_num <= 35) || (gpio_num >= 38 && gpio_num <= 43)) || (level != 0 && level != 1)) { return; } uint8_t reg = (gpio_num <= 35) ? OUT0 : OUT1; // 计算对应引脚的位掩码,替代原函数中一堆if-else判断 uint8_t pin_mask = (gpio_num <= 35) ? (1 << (gpio_num - 28)) : (1 << (gpio_num - 36)); uint8_t current_state = PCA9575_read_register(OUT0); // 原函数固定读取OUT0,此处保留 uint8_t data; if (level == 1) { data = (current_state == 0xFF) ? 0xFF : (current_state ^ pin_mask); } else { data = (current_state == 0) ? 0 : (current_state ^ pin_mask); } PCA9575_write_to_register(reg, data); }
优化点说明
- 移除冗余分支:将原函数中重复的OUT0/OUT1处理逻辑合并,用三元运算符简化寄存器和位掩码的计算
- 简化位掩码生成:通过位运算直接计算引脚对应的掩码,替代原函数中大量的
if-else判断 - 合并条件判断:将无效引脚和无效电平的判断合并为一个入口检查,减少嵌套层级
- 保留原逻辑细节:严格复刻原函数中仅读取OUT0寄存器状态的行为,确保功能完全一致
内容的提问来源于stack exchange,提问作者Greg Pike
相关产品推荐
相关产品推荐

