- #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显示内容
- }
- }