开发示例
使用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