目录
一、创建OLED组件
1、使用ESP-IDF快速创建OLED组件



(1)、按住Ctrl+Shift+p键,在搜索栏中输入ESP-IDF,找到创建组件选项。
(2)、输入创建组件的名字。
(3)、创建组件完成后,在左侧栏点开该组件,该组件包含:include文件夹、CMakeLisits.txt文件和创建的.c文件,include文件夹内是.c文件对应的.h文件。
2、将OLED驱动文件添加至组件文件夹中
创建组建完成后,江科大OLED驱动文件放入组件中。将OLED.C文件和OLED_Data.C文件放入User_OLED_Driver文件夹目录下,将OLED.H文件和OLED_Data.H文件放入include文件见目录下,如下图所示。


组件创建完成后,VScode中左侧栏资源管理器中的User_OLED_Driver文件组成应该与下图一致。

3、修改CMake,构建编译

idf_component_register(SRCS "OLED.c" "OLED_Data.c"
INCLUDE_DIRS "include"
REQUIRES driver)

idf_component_register(SRCS "main.c"
INCLUDE_DIRS "."
REQUIRES driver User_OLED_Driver)
(5)、点击User_OLED_Driver组件中的CMakeLists.txt文件进行编辑,首先 将"OLED_Data.c"和"OLED.c"添加至SRCS后,然后将REQUIRES driver添加INCLUDE_DIRS "include"后。
(6)、点击main文件夹中的CMakeLists.txt文件进行编辑,在INCLUDE_DIRS "include"后
添加REQUIRES driver User_OLED_Driver。
(7)、先删除已构建的项目,然后重新构建。
二、修改代码
1、修改.c文件



(1)、头文件中删除#include “stm32f10x.h”,将#include “OLED.h”修改为#include “OLED_Driver.h”,增加#include “driver/gpio.h”
(2)、增加引脚宏定义、和引脚电平状态枚举。
(3)、修改OLED_W_SCL()函数和OLED_W_SCL()函数。将源码中的这两个函数删除,重新宏定义两个函数。
(4)、修改OLED_GPIO_Init()函数。
/*引脚定义*/
#define GPIO_SDA GPIO_NUM_21
#define GPIO_SCL GPIO_NUM_22
/*引脚输出的点评状态*/
enum GPIO_OUTPUT_STATE
{
PIN_RESET, // 0
PIN_SET // 1
};
/*引脚配置*********************/
/**
* 函 数:OLED写SCL高低电平
* 参 数:要写入SCL的电平值,范围:0/1
* 返 回 值:无
* 说 明:当上层函数需要写SCL时,此函数会被调用
* 用户需要根据参数传入的值,将SCL置为高电平或者低电平
* 当参数传入0时,置SCL为低电平,当参数传入1时,置SCL为高电平
*/
#define OLED_W_SCL(x) \
do \
{ \
x ? gpio_set_level(GPIO_SCL, PIN_SET) : gpio_set_level(GPIO_SCL, PIN_RESET); \
} while (0)
/**
* 函 数:OLED写SDA高低电平
* 参 数:要写入SDA的电平值,范围:0/1
* 返 回 值:无
* 说 明:当上层函数需要写SDA时,此函数会被调用
* 用户需要根据参数传入的值,将SDA置为高电平或者低电平
* 当参数传入0时,置SDA为低电平,当参数传入1时,置SDA为高电平
*/
#define OLED_W_SDA(x) \
do \
{ \
x ? gpio_set_level(GPIO_SDA, PIN_SET) : gpio_set_level(GPIO_SDA, PIN_RESET); \
} while (0)
/**
* 函 数:OLED引脚初始化
* 参 数:无
* 返 回 值:无
* 说 明:当上层函数需要初始化时,此函数会被调用
* 用户需要将SCL和SDA引脚初始化为开漏模式,并释放引脚
*/
void OLED_GPIO_Init(void)
{
uint32_t i, j;
/*在初始化前,加入适量延时,待OLED供电稳定*/
for (i = 0; i < 1000; i++)
{
for (j = 0; j < 1000; j++)
;
}
/*将SCL和SDA引脚初始化为开漏模式*/
gpio_config_t io_conf =
{
.pin_bit_mask = (1ULL << GPIO_SDA) | (1ULL << GPIO_SCL), // 选择 GPIO21 和 GPIO22
.mode = GPIO_MODE_OUTPUT_OD, // 开漏输出模式
.pull_up_en = GPIO_PULLUP_ENABLE, // 启用上拉电阻
.pull_down_en = GPIO_PULLDOWN_DISABLE, // 禁用下拉电阻
.intr_type = GPIO_INTR_DISABLE // 禁用中断
};
gpio_config(&io_conf);
// 设置 GPIO21 和 GPIO22 的输出频率为 50MHz
gpio_set_drive_capability(GPIO_SDA, GPIO_DRIVE_CAP_3); // 50MHz
gpio_set_drive_capability(GPIO_SCL, GPIO_DRIVE_CAP_3); // 50MHz
/*释放SCL和SDA*/
OLED_W_SCL(1);
OLED_W_SDA(1);
}
/*********************引脚配置*/
2、修改.h文件
由于编译器不同,ESP-IDF会对源码中的显示数组格式报错,按图修改格式格式即可,按住Shift+Alt键即可按列选中快速修改。
汉字数组格式如下图所示:

/*汉字字模数据*********************/
/*相同的汉字只需要定义一次,汉字不分先后顺序*/
/*必须全部为汉字或者全角字符,不要加入任何半角字符*/
/*宽16像素,高16像素*/
const ChineseCell_t OLED_CF16x16[] = {
{{"武"},
{0x20,0x20,0x24,0x24,0x24,0xA4,0x24,0x24,0x20,0xFF,0x20,0x22,0x2C,0x20,0x20,0x00,
0x40,0xC0,0x7E,0x40,0x40,0x3F,0x22,0x22,0x20,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00,}},
{{"汉"},
{0x10,0x60,0x02,0x0C,0xC0,0x02,0x1E,0xE2,0x02,0x02,0x02,0xE2,0x1E,0x00,0x00,0x00,
0x04,0x04,0x7C,0x03,0x80,0x80,0x40,0x20,0x13,0x0C,0x13,0x20,0x40,0x80,0x80,0x00,}}
};
/*********************汉字字模数据*/
三、main.c烧录程序
添加头文件和app_main函数后,构建烧录程序。

#include <stdio.h>
#include "OLED_Data.h"
#include "OLED.h"
#include "driver/gpio.h"
void app_main(void)
{
OLED_Init();
while (1)
{
/*在(0, 0)位置显示字符'A',字体大小为8*16点阵*/
OLED_ShowChar(0, 0, 'A', OLED_8X16);
/*在(16, 0)位置显示字符串"Hello World!",字体大小为8*16点阵*/
OLED_ShowString(16, 0, "Hello World!", OLED_8X16);
/*在(0, 18)位置显示字符'A',字体大小为6*8点阵*/
OLED_ShowChar(0, 18, 'A', OLED_6X8);
/*在(16, 18)位置显示字符串"Hello World!",字体大小为6*8点阵*/
OLED_ShowString(16, 18, "Hello World!", OLED_6X8);
/*在(0, 28)位置显示数字12345,长度为5,字体大小为6*8点阵*/
OLED_ShowNum(0, 28, 12345, 5, OLED_6X8);
/*在(40, 28)位置显示有符号数字-66,长度为2,字体大小为6*8点阵*/
OLED_ShowSignedNum(40, 28, -66, 2, OLED_6X8);
/*在(70, 28)位置显示十六进制数字0xA5A5,长度为4,字体大小为6*8点阵*/
OLED_ShowHexNum(70, 28, 0xA5A5, 4, OLED_6X8);
/*在(0, 38)位置显示二进制数字0xA5,长度为8,字体大小为6*8点阵*/
OLED_ShowBinNum(0, 38, 0xA5, 8, OLED_6X8);
/*在(60, 38)位置显示浮点数字123.45,整数部分长度为3,小数部分长度为2,字体大小为6*8点阵*/
OLED_ShowFloatNum(60, 38, 123.45, 3, 2, OLED_6X8);
/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/
OLED_Update();
/* code */
}
}
四、结果展示

3264

被折叠的 条评论
为什么被折叠?



