跳转到内容

开发示例

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

提示

注:示例代码中没有做任何的错误处理 (∪.∪ )...zzz

一些前置代码

C++
#include <Wire.h>

// 地址
uint8_t address = 0x27;

void setup() {
    // 初始化I²C
    Wire.begin();
}
// 写一个寄存器
bool write(uint8_t command, uint8_t value) {
    Wire.beginTransmission(address);
    Wire.write(command);
    Wire.write(value);
    return Wire.endTransmission() == 0;
}
// 读取一个寄存器的值
uint8_t read(uint8_t command) {
    Wire.beginTransmission(address);
    Wire.write(command);
    Wire.endTransmission();
    Wire.requestFrom(address,  1);
    return Wire.read();
}

控制继电器状态

C++
// 8路继电器全部连接到了端口0,我们先把端口0全部配置为输出模式
// 端口0配置由寄存器6控制,值为0时引脚为输出模式
write(0x06, 0b00000000); // 端口0全部引脚设置为输出模式

// 控制继电器状态 (低电平吸合),这由寄存器2控制
write(0x02, 0b11111011); // 3号继电器吸合,其他全部松开

// 正常来说我们不能直接只控制每一路的状态,我们需要先获取当前的状态,再更改对应的Bit,才能精准的控制其中一路而不影响其他路的状态
uint8_t state = read(0x02);  // 读取当前的状态
state |= (1 << pin);  // 置位输出高电平(松开),pin为控制的引脚号
// state &= ~(1 << pin); // 清零输出低电平(吸合)
write(0x02, state); // 写入新的状态

// 当然,选择本地维护继电器状态也是没问题的,这省去了每次都需要读取状态的操作

控制自定义的输入输出引脚

C++
// 我们8路可自定义的引脚全部连接到了端口1
// 我们可以自由的配置为输出或输入模式
// 端口1配置由寄存器7控制,值为1时引脚为输入模式;值为0时引脚为输出模式
write(0x07, 0b00001111); // 例:4~7为输出模式(0),0~3为输入模式(1)

// 获取输入模式引脚的状态,端口1的引脚状态反映在寄存器1
uint8_t state = read(0x01);  // 读取端口1的引脚状态
uint8_t pinState = (state >> pin) & 0x01; // 获取对应引脚(pin)的状态,仅在引脚配置为输入模式时这值才会有效

// 控制输出的话可以也参考上面控制继电器的方法

输入的极性反转

这功能貌似用处不大,我写不动了 ༼ つ ◕_◕ ༽つ 可以研究研究芯片的数据手册pca9555