跳转到内容

开发示例

使用 Arduino 作为代码示例,为方便阅读,代码中可能出现十六进制和二进制混用的情况

提示

注:示例代码中没有做任何错误处理

一些前置代码

c
#include <Wire.h>

// PCA9536D 的固定地址
uint8_t address = 0x41;

void setup() {
    Wire.begin();
}

bool writeRegister(uint8_t reg, uint8_t value) {
    Wire.beginTransmission(address);
    Wire.write(reg);
    Wire.write(value);
    return Wire.endTransmission() == 0;
}

uint8_t readRegister(uint8_t reg) {
    Wire.beginTransmission(address);
    Wire.write(reg);
    Wire.endTransmission();
    Wire.requestFrom(address, (uint8_t)1);
    return Wire.read();
}

控制4路继电器

c
// 先把 4 个 IO 全部配置为输出模式
// 配置寄存器为 0x03,位值 0 表示输出
writeRegister(0x03, 0b00000000);

// 输出寄存器为 0x01,只使用低 4 位
// 例:打开第 0 路和第 2 路继电器,关闭第 1 路和第 3 路
writeRegister(0x01, 0b00000101);

// 如果只想改其中一路,建议先读取当前状态,再修改对应的 bit
uint8_t state = readRegister(0x01) & 0x0F;
state |= (1 << pin);   // 打开 pin 路继电器
// state &= ~(1 << pin); // 关闭 pin 路继电器
writeRegister(0x01, state);

读取当前状态

c
// 读取输出寄存器,可以拿到当前保存的继电器开关状态
uint8_t state = readRegister(0x01) & 0x0F;

// 读取其中一路状态
uint8_t relay2 = (state >> 2) & 0x01;

输入极性反转

PCA9536D 也支持输入极性反转,但 4 路继电器模块默认将 4 个 IO 都作为输出使用,因此通常不需要改动 0x02 极性反转寄存器。