ESP32-IDF 江科大-0.96寸OLED软件IIC驱动代码移植

目录

 

一、创建OLED组件

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

2、将OLED驱动文件添加至组件文件夹中

3、修改CMake,构建编译

二、修改代码

1、修改.c文件

2、修改.h文件

三、main.c烧录程序

四、结果展示


 

一、创建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 */
    }
}

 

四、结果展示

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值