[应用方案] 如何使用HC89S105A系列的I2C接口驱动OLED显示屏?

[复制链接]
 楼主| 回复就哭哭 发表于 2025-2-27 06:01 | 显示全部楼层 |阅读模式
如何使用HC89S105A系列的I2C接口驱动OLED显示屏?

如何初始化OLED显示屏并显示文本和图形?

如何处理I2C通信中的错误?

xinpian101 发表于 2025-2-27 10:35 | 显示全部楼层
这就要移植了,如果用IO模拟很简单的。卖这个芯片的店家一般都会提供资料,里面有
xinpian101 发表于 2025-2-27 10:36 | 显示全部楼层
  1. #include "HC89S105A.h"
  2. #include "oled.h"  // 假设有一个OLED驱动库

  3. void I2C_Init(void) {
  4.     // 设置I2C时钟频率
  5.     I2C_CK = 0x03;  // 设置时钟分频
  6.     I2C_CR = 0x01;  // 使能I2C
  7. }

  8. void I2C_Write(uint8_t addr, uint8_t reg, uint8_t data) {
  9.     // 发送起始条件
  10.     I2C_CR |= 0x02;  // 发送起始条件
  11.     while (!(I2C_SR & 0x01));  // 等待起始条件发送完成

  12.     // 发送设备地址
  13.     I2C_DR = addr << 1;  // 发送设备地址(写模式)
  14.     while (!(I2C_SR & 0x02));  // 等待地址发送完成

  15.     // 发送寄存器地址
  16.     I2C_DR = reg;  // 发送寄存器地址
  17.     while (!(I2C_SR & 0x02));  // 等待寄存器地址发送完成

  18.     // 发送数据
  19.     I2C_DR = data;  // 发送数据
  20.     while (!(I2C_SR & 0x02));  // 等待数据发送完成

  21.     // 发送停止条件
  22.     I2C_CR |= 0x04;  // 发送停止条件
  23.     while (!(I2C_SR & 0x04));  // 等待停止条件发送完成
  24. }

  25. void OLED_Init(void) {
  26.     // 初始化OLED显示屏
  27.     I2C_Write(0x3C, 0x00, 0xAE);  // 关闭显示
  28.     I2C_Write(0x3C, 0x00, 0xD5);  // 设置显示时钟分频
  29.     I2C_Write(0x3C, 0x00, 0x80);
  30.     I2C_Write(0x3C, 0x00, 0xA8);  // 设置多路复用率
  31.     I2C_Write(0x3C, 0x00, 0x3F);
  32.     I2C_Write(0x3C, 0x00, 0xD3);  // 设置显示偏移
  33.     I2C_Write(0x3C, 0x00, 0x00);
  34.     I2C_Write(0x3C, 0x00, 0x40);  // 设置显示起始行
  35.     I2C_Write(0x3C, 0x00, 0x8D);  // 电荷泵设置
  36.     I2C_Write(0x3C, 0x00, 0x14);
  37.     I2C_Write(0x3C, 0x00, 0x20);  // 设置内存地址模式
  38.     I2C_Write(0x3C, 0x00, 0x00);
  39.     I2C_Write(0x3C, 0x00, 0xA1);  // 设置段重映射
  40.     I2C_Write(0x3C, 0x00, 0xC8);  // 设置COM输出扫描方向
  41.     I2C_Write(0x3C, 0x00, 0xDA);  // 设置COM引脚硬件配置
  42.     I2C_Write(0x3C, 0x00, 0x12);
  43.     I2C_Write(0x3C, 0x00, 0x81);  // 设置对比度控制
  44.     I2C_Write(0x3C, 0x00, 0xCF);
  45.     I2C_Write(0x3C, 0x00, 0xD9);  // 设置预充电周期
  46.     I2C_Write(0x3C, 0x00, 0xF1);
  47.     I2C_Write(0x3C, 0x00, 0xDB);  // 设置VCOMH取消选择级别
  48.     I2C_Write(0x3C, 0x00, 0x40);
  49.     I2C_Write(0x3C, 0x00, 0xA4);  // 禁用整个显示开启
  50.     I2C_Write(0x3C, 0x00, 0xA6);  // 设置正常显示
  51.     I2C_Write(0x3C, 0x00, 0xAF);  // 开启显示
  52. }

  53. void main(void) {
  54.     I2C_Init();  // 初始化I2C
  55.     OLED_Init();  // 初始化OLED显示屏

  56.     while (1) {
  57.         // 在这里添加代码以更新OLED显示内容
  58.     }
  59. }
xinpian101 发表于 2025-2-27 10:40 | 显示全部楼层
  1. void OLED_Set_Pixel(uint8_t x, uint8_t y, uint8_t color) {
  2.     uint8_t page = y / 8;
  3.     uint8_t bit_mask = 1 << (y % 8);

  4.     // 设置页地址
  5.     I2C_Write(0x3C, 0x00, 0xB0 + page);
  6.     // 设置列地址低位
  7.     I2C_Write(0x3C, 0x00, 0x00 + (x & 0x0F));
  8.     // 设置列地址高位
  9.     I2C_Write(0x3C, 0x00, 0x10 + ((x >> 4) & 0x0F));

  10.     // 读取当前显示数据
  11.     uint8_t data;
  12.     I2C_Start();
  13.     I2C_Write(0x3C << 1, 0, 1);  // 发送设备地址(读模式)
  14.     data = I2C_Read(0);  // 读取数据
  15.     I2C_Stop();

  16.     // 更新显示数据
  17.     if (color) {
  18.         data |= bit_mask;  // 设置像素点为亮
  19.     } else {
  20.         data &= ~bit_mask;  // 设置像素点为暗
  21.     }

  22.     // 设置页地址
  23.     I2C_Write(0x3C, 0x00, 0xB0 + page);
  24.     // 设置列地址低位
  25.     I2C_Write(0x3C, 0x00, 0x00 + (x & 0x0F));
  26.     // 设置列地址高位
  27.     I2C_Write(0x3C, 0x00, 0x10 + ((x >> 4) & 0x0F));
  28.     // 写入更新后的显示数据
  29.     I2C_Write(0x3C, 0x40, data);
  30. }
xinpian101 发表于 2025-2-27 10:40 | 显示全部楼层
绘制横线
  1. void OLED_Draw_HLine(uint8_t x0, uint8_t x1, uint8_t y) {
  2.     uint8_t i;
  3.     for (i = x0; i <= x1; i++) {
  4.         OLED_Set_Pixel(i, y, 1);  // 设置像素点为亮
  5.     }
  6. }
xinpian101 发表于 2025-2-27 10:40 | 显示全部楼层
绘制竖线函数
  1. void OLED_Draw_VLine(uint8_t x, uint8_t y0, uint8_t y1) {
  2.     uint8_t i;
  3.     for (i = y0; i <= y1; i++) {
  4.         OLED_Set_Pixel(x, i, 1);  // 设置像素点为亮
  5.     }
  6. }
xinpian101 发表于 2025-2-27 10:41 | 显示全部楼层
  1. void main(void) {
  2.     I2C_Init();  // 初始化I2C
  3.     OLED_Init();  // 初始化OLED显示屏

  4.     OLED_Draw_HLine(10, 50, 20);  // 在(10,20)到(50,20)之间绘制横线
  5.     OLED_Draw_VLine(30, 10, 40);  // 在(30,10)到(30,40)之间绘制竖线

  6.     while (1) {
  7.         // 在这里添加代码以更新OLED显示内容
  8.     }
  9. }
sj8zw8 发表于 2025-3-25 16:27 | 显示全部楼层
该过程包括 I2C 接口的初始化、OLED 显示屏的配置以及如何显示文本和图形,同时也需要处理 I2C 通信中的错误。
shenxiaolin 发表于 2025-3-28 20:55 | 显示全部楼层
学习一下
地瓜patch 发表于 2025-3-28 21:18 来自手机 | 显示全部楼层
iic接口的OLED显示屏很好用
地瓜patch 发表于 2025-3-28 21:20 来自手机 | 显示全部楼层
xinpian101 发表于 2025-2-27 10:36

搞个完整的文件发来是不是更好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

434

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

27

主题

434

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部