Files
CHJ/user/Device/oled.h
2026-03-20 21:19:53 +08:00

245 lines
5.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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.0SCL
// D1 P1.4SDA
// RES P1.6SPI模块改成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