You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:15:34