// 发送SSD1306命令的辅助函数
void send_ssd1306_cmd(uint8_t cmd) {
uint8_t data[] = {0x00, cmd}; // 0x00表示命令模式
if (write(g_i2c_fd, data, 2) != 2) {
std::cerr << "发送SSD1306命令失败" << std::endl;
}
}
// SSD1306滚动控制函数
void setup_horizontal_scroll(bool left_scroll, uint8_t start_page, uint8_t end_page, uint8_t scroll_speed) {
// 设置I2C地址
if (ioctl(g_i2c_fd, I2C_SLAVE, SSD1306_ADDRESS) < 0) {
std::cerr << "无法设置I2C地址" << std::endl;
return;
}
send_ssd1306_cmd(0x2E); // 停止滚动
usleep(1000); // 等待1ms
// 设置水平滚动
send_ssd1306_cmd(left_scroll ? 0x27 : 0x26); // 0x27左滚动,0x26右滚动
send_ssd1306_cmd(0x00); // 空指令(必须)
send_ssd1306_cmd(start_page); // 起始页(0~7)
send_ssd1306_cmd(scroll_speed); // 滚动速度/时间间隔
send_ssd1306_cmd(end_page); // 结束页(0~7)
send_ssd1306_cmd(0x00); // 起始列(通常为0)
send_ssd1306_cmd(0xFF); // 结束列(通常为127)
}
// 启动滚动
void start_scroll() {
if (ioctl(g_i2c_fd, I2C_SLAVE, SSD1306_ADDRESS) < 0) {
std::cerr << "无法设置I2C地址" << std::endl;
return;
}
send_ssd1306_cmd(0x2F); // 启动滚动
}
// 停止滚动
void stop_scroll() {
if (ioctl(g_i2c_fd, I2C_SLAVE, SSD1306_ADDRESS) < 0) {
std::cerr << "无法设置I2C地址" << std::endl;
return;
}
send_ssd1306_cmd(0x2E); // 停止滚动
}