245 lines
5.6 KiB
C
Executable File
245 lines
5.6 KiB
C
Executable File
#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
|
||
|