#include "HC89S105A.h"
#include "oled.h" // 假设有一个OLED驱动库
void I2C_Init(void) {
// 设置I2C时钟频率
I2C_CK = 0x03; // 设置时钟分频
I2C_CR = 0x01; // 使能I2C
}
void I2C_Write(uint8_t addr, uint8_t reg, uint8_t data) {
// 发送起始条件
I2C_CR |= 0x02; // 发送起始条件
while (!(I2C_SR & 0x01)); // 等待起始条件发送完成
// 发送设备地址
I2C_DR = addr << 1; // 发送设备地址(写模式)
while (!(I2C_SR & 0x02)); // 等待地址发送完成
// 发送寄存器地址
I2C_DR = reg; // 发送寄存器地址
while (!(I2C_SR & 0x02)); // 等待寄存器地址发送完成
// 发送数据
I2C_DR = data; // 发送数据
while (!(I2C_SR & 0x02)); // 等待数据发送完成
// 发送停止条件
I2C_CR |= 0x04; // 发送停止条件
while (!(I2C_SR & 0x04)); // 等待停止条件发送完成
}
void OLED_Init(void) {
// 初始化OLED显示屏
I2C_Write(0x3C, 0x00, 0xAE); // 关闭显示
I2C_Write(0x3C, 0x00, 0xD5); // 设置显示时钟分频
I2C_Write(0x3C, 0x00, 0x80);
I2C_Write(0x3C, 0x00, 0xA8); // 设置多路复用率
I2C_Write(0x3C, 0x00, 0x3F);
I2C_Write(0x3C, 0x00, 0xD3); // 设置显示偏移
I2C_Write(0x3C, 0x00, 0x00);
I2C_Write(0x3C, 0x00, 0x40); // 设置显示起始行
I2C_Write(0x3C, 0x00, 0x8D); // 电荷泵设置
I2C_Write(0x3C, 0x00, 0x14);
I2C_Write(0x3C, 0x00, 0x20); // 设置内存地址模式
I2C_Write(0x3C, 0x00, 0x00);
I2C_Write(0x3C, 0x00, 0xA1); // 设置段重映射
I2C_Write(0x3C, 0x00, 0xC8); // 设置COM输出扫描方向
I2C_Write(0x3C, 0x00, 0xDA); // 设置COM引脚硬件配置
I2C_Write(0x3C, 0x00, 0x12);
I2C_Write(0x3C, 0x00, 0x81); // 设置对比度控制
I2C_Write(0x3C, 0x00, 0xCF);
I2C_Write(0x3C, 0x00, 0xD9); // 设置预充电周期
I2C_Write(0x3C, 0x00, 0xF1);
I2C_Write(0x3C, 0x00, 0xDB); // 设置VCOMH取消选择级别
I2C_Write(0x3C, 0x00, 0x40);
I2C_Write(0x3C, 0x00, 0xA4); // 禁用整个显示开启
I2C_Write(0x3C, 0x00, 0xA6); // 设置正常显示
I2C_Write(0x3C, 0x00, 0xAF); // 开启显示
}
void main(void) {
I2C_Init(); // 初始化I2C
OLED_Init(); // 初始化OLED显示屏
while (1) {
// 在这里添加代码以更新OLED显示内容
}
}