#ifndef __OLED_H #define __OLED_H #include "stdlib.h" #include "stdint.h" // ////////////////////////////////////////////////////////////////////////////////// // // 文 件 名 : oled.c // 版 本 号 : v1.0 // 作 者 : // 生成日期 : 2025-11-14 // 最近修改 : // 功能描述 : OLED I2C接口演示例程 // 说明: // ---------------------------------------------------------------- // GND 电源地 // VCC 3.3v电源 // D0 P2.0(SCL) // D1 P1.4(SDA) // RES P1.6(SPI模块改成IIC模块需要接此引脚,IIC模块用户请忽略) // ---------------------------------------------------------------- //-----------------OLED端口定义---------------- #define OLED_SCL_Clr() LHL_GPIO_WritePin(I2C_SCL_GPIO, GPIO_PIN_0,GPIO_PIN_RESET)//SCL #define OLED_SCL_Set() LHL_GPIO_WritePin(I2C_SCL_GPIO, GPIO_PIN_0, GPIO_PIN_SET) #define OLED_SDA_Clr() LHL_GPIO_WritePin(I2C_SDA_GPIO, I2C_SDA, GPIO_PIN_RESET)//DIN #define OLED_SDA_Set() LHL_GPIO_WritePin(I2C_SDA_GPIO, I2C_SDA, GPIO_PIN_SET) #define OLED_RES_Clr() LHL_GPIO_WritePin(I2C_RES_GPIO, I2C_RES, GPIO_PIN_RESET)//RES #define OLED_RES_Set() LHL_GPIO_WritePin(I2C_RES_GPIO, I2C_RES, GPIO_PIN_SET) #define OLED_CMD 0 //写命令 #define OLED_DATA 1 //写数据 #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t // --- 1. 显存定义 --- // 前台缓冲区:用于写入新的图形数据 extern u8 OLED_GRAM[144][8]; // 后台缓冲区:用于存储当前屏幕上实际显示的内容,用于对比差异 extern u8 OLED_GRAM_Back[144][8]; // --- 2. 硬件底层驱动函数 (I2C/GPIO) --- /** * @brief I2C 起始信号 */ void I2C_Start(void); /** * @brief I2C 结束信号 */ void I2C_Stop(void); /** * @brief I2C 等待应答 */ void I2C_WaitAck(void); /** * @brief I2C 写入一个字节 * @param dat 要写入的数据 */ void Send_Byte(u8 dat); /** * @brief 向OLED写入命令或数据 * @param dat 要写入的数据 * @param mode 模式选择: 0表示命令, 1表示数据 */ void OLED_WR_Byte(u8 dat, u8 mode); /** * @brief OLED 引脚及外设初始化 */ void OLED_Init(void); // --- 3. 屏幕控制函数 --- /** * @brief 开启OLED显示 */ void OLED_DisPlay_On(void); /** * @brief 关闭OLED显示 */ void OLED_DisPlay_Off(void); /** * @brief 屏幕反色显示设置 * @param i 0:正常显示, 1:反色显示 */ void OLED_ColorTurn(u8 i); /** * @brief 屏幕旋转180度 * @param i 0:正常显示, 1:旋转180度 */ void OLED_DisplayTurn(u8 i); /** * @brief 清空显存缓冲区 (OLED_GRAM) * @note 此函数只清空内存,不自动刷新到硬件 */ void OLED_Clear(void); /** * @brief 在内存缓冲区中填充一个矩形区域(用于局部擦除) * @param x1 起始x坐标 * @param y1 起始y坐标 * @param x2 结束x坐标 * @param y2 结束y坐标 * @note 此函数只修改内存中的OLED_GRAM,不直接操作硬件 */ void OLED_FillArea(u8 x1, u8 y1, u8 x2, u8 y2); // --- 4. 屏幕刷新函数 --- /** * @brief 兼容旧接口的全屏刷新 * @note 将 OLED_GRAM 内容全部发送到屏幕,并同步后台缓冲区 */ void OLED_Refresh(void); /** * @brief 差异刷新全屏(高效) * @note 对比 OLED_GRAM 和 OLED_GRAM_Back,仅刷新变化的字节 */ void OLED_Refresh_Diff(void); /** * @brief 兼容旧接口的单行刷新 * @param line 行号 (0-7) */ void OLED_Refresh_Line(u8 line); /** * @brief 差异刷新指定行(高效) * @param line 行号 (0-7) * @note 如果该行数据无变化,则不进行 I2C 传输 */ void OLED_Refresh_Line_Diff(u8 line); // --- 5. 基础绘图函数 --- /** * @brief 画点 * @param x 0~127 * @param y 0~63 * @param t 1:填充, 0:清空 */ void OLED_DrawPoint(u8 x, u8 y, u8 t); /** * @brief 画线 * @param x1,y1 起点坐标 * @param x2,y2 结束坐标 * @param mode 1:填充, 0:清空 */ void OLED_DrawLine(u8 x1, u8 y1, u8 x2, u8 y2, u8 mode); /** * @brief 画圆 * @param x,y 圆心坐标 * @param r 圆的半径 */ void OLED_DrawCircle(u8 x, u8 y, u8 r); // --- 6. 字符与字符串显示 --- /** * @brief 在指定位置显示一个字符 * @param x,y 起点坐标 * @param chr 要显示的字符 * @param size1 选择字体 6x8 / 12x12 / 16x16 / 24x24 (此处传入8,12,16,24) * @param mode 0:反色显示, 1:正常显示 */ void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 size1, u8 mode); /** * @brief 显示字符串 * @param x,y 起点坐标 * @param chr 字符串起始地址 * @param size1 字体大小 * @param mode 0:反色显示, 1:正常显示 */ void OLED_ShowString(u8 x, u8 y, u8 *chr, u8 size1, u8 mode); /** * @brief 显示数字 * @param x,y 起点坐标 * @param num 要显示的数字 * @param len 数字的位数 * @param size1 字体大小 * @param mode 0:反色显示, 1:正常显示 */ void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size1, u8 mode); // --- 7. 高级显示功能 (汉字/图片/滚动) --- /** * @brief 显示汉字 * @param x,y 起点坐标 * @param num 汉字对应的序号 (在Hzk数组中的索引) * @param size1 字体大小 (16, 24, 32, 64) * @param mode 0:反色显示, 1:正常显示 */ void OLED_ShowChinese(u8 x, u8 y, u8 num, u8 size1, u8 mode); /** * @brief 显示图片 * @param x,y 起点坐标 * @param sizex,sizey 图片长宽 * @param BMP 要写入的图片数组 * @param mode 0:反色显示, 1:正常显示 */ void OLED_ShowPicture(u8 x, u8 y, u8 sizex, u8 sizey, u8 BMP[], u8 mode); /** * @brief 滚动显示汉字 * @param num 显示汉字的个数 * @param space 每一遍显示的间隔 * @param mode 0:反色显示, 1:正常显示 * @note 此函数包含 while(1) 死循环,用于演示效果 */ void OLED_ScrollDisplay(u8 num, u8 space, u8 mode); void OLED_FillArea(u8 x1, u8 y1, u8 x2, u8 y2); void OLED_FillRect(u8 x1, u8 y1, u8 x2, u8 y2); void OLED_FillRect_White(u8 x1, u8 y1, u8 x2, u8 y2); #endif