1、0.96 OLED显示屏简介
0.96寸OLED分辨率是128*64;即OLED显示是128行*64列,采用IIC 接口方式进行通讯(默认地址0x78),显示屏模块如下图所示。0.96’OLED(4Pin)模块采用SSD1306 为驱动芯片,模块带有稳压芯片,支持软件模拟IIC 通讯与硬件IIC 通讯,上电自动复位,功耗低,自发光,自由视角。
接口定义
GND:电源地
VCC:电源正(3.3~5V)
SCL:OLED 的D0 脚,在IIC 通信中为时钟管脚
SDA:OLED 的D1 脚,在IIC 通信中为数据管脚
2、GD32L233C-START DEMO板与OLED硬件电路连接
GD32L233C-START DEMO板开放了许多的GPIO供测试使用,本次代码移植采用的是PA1,PA2,移植的代码是通过GPIO硬件模拟仿真I2C时序来完成的显示代码的底层驱动。
通过排线将模块的VCC,GND,SCL,SDA分别与DEMO板上的3.3V ,GND ,PA1,PA2相连,完成硬件电路的连接。
3、工程代码移植
首先下载OLED的店铺提供的参考官方的相关资料,如有需要,可以到下面的链接下载中景园的OLED屏的相关资料,资料相对比较完善,除了文档外,还提供了I2C接口,及SPI接口的不同的平台下的参考代码,供我们移植使用。
链接:https://pan.baidu.com/s/1gw5hNr5oGIVyxUZZb3189Q 提取码:gl0z
找到 03-程序源码——>中景园IIC接口显示屏例程——>STM32例程——>01-0.96OLED显示屏STM32F103C8T6_IIC例程——>HARDWARE——>OLED,拷贝OLED该文件夹到自己新建的工程目录下。该文件夹下,提供了OLED的相关底层接口及相关显示驱动的代码,需要我们适当的修改就可以完成OLED的显示移植工作。
1)新建工程,移植标准库文件,可以直接通过例程直接进行工程的移植,也可以参见其他小伙伴的帖子进行工程代码的移植,并将OLED文件夹放到工程目录下的HARDWARE文件夹下,并添加oled.c到工程中来,此处放到的是HARDWARE工程目录下,该文件下放置外设硬件资源的相关文件。工程目录如下图所示:
同时注意,设置oled.h等的文件路径,如下图设置选择相应的文件夹即可:
2)修改底层的GPIO相关的代码即可,应用层的相关代码无需修改。主要修改oled.h中的端口定义,以及oled.c中的OLED初始化中的关于GPIO的设置相关代码,如下
#ifndef __OLED_H
#define __OLED_H
#include "stdlib.h"
#include "gd32l23x.h"
#include "systick.h"
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
//-----------------OLED端口定义----------------
#define OLED_SCL_Clr() gpio_bit_reset(GPIOA,GPIO_PIN_1)//SCL
#define OLED_SCL_Set() gpio_bit_set(GPIOA,GPIO_PIN_1)
#define OLED_SDA_Clr() gpio_bit_reset(GPIOA,GPIO_PIN_2)//DIN
#define OLED_SDA_Set() gpio_bit_set(GPIOA,GPIO_PIN_2)
//剩余的无需修改
// .....
#endif
还需要修改oled.c中的OLED初始化中的关于GPIO的模式的设置部分,如下:
void OLED_Init(void)
{
/* 使能GPIOA时钟 */
rcu_periph_clock_enable(RCU_GPIOA);
/* 配置端口模式 */
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_1);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_2);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
//下面的剩余无需改动
// ....
}
3)接着在main.c中编写相应的测试代码即可完成相关的测试,移植的oled代码中,提供了一系列的应用层的显示驱动函数接口代码供用户调用,用于完成各种字符,汉字,数字,图片等的显示功能,如下
void OLED_ClearPoint(u8 x,u8 y);
void OLED_ColorTurn(u8 i);
void OLED_DisplayTurn(u8 i);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode);
void OLED_DrawCircle(u8 x,u8 y,u8 r);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);
void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode);
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode);
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode);
void OLED_Init(void);
注意需要根据自己的需要,如显示汉字或图片,来制作自己的汉字库或图片库文件,上述链接中的文档中也提供了相应的字库的生成说明指导,比较方便。如本测试代码要显示北京兆易创新这几个汉字,需要自己生成汉字库,替代oledfont.h文件中对应的汉字库代码。
在main.c中编写测试代码如下,可以完成相关的显示测试功能,非常的方便。
#include "gd32l23x.h"
#include "systick.h"
#include "oled.h"
int main(void)
{
systick_config();
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
while(1)
{
OLED_ShowChinese(8*2,0,0,16,1);//北
OLED_ShowChinese(8*4,0,1,16,1);//京
OLED_ShowChinese(8*6,0,2,16,1);//兆
OLED_ShowChinese(8*8,0,3,16,1);//易
OLED_ShowChinese(8*10,0,4,16,1);//创
OLED_ShowChinese(8*12,0,5,16,1);//新
OLED_ShowString(16,16,"EEWORLD & GD ",16,1);
OLED_ShowString(8,32,"GD32L233C-START",16,1);
OLED_ShowString(20,48,"2022/02/03",16,1);
OLED_Refresh();
}
}
4)编译,下载,显示结果如下:
5)总结
OLED的显示的代码移植并不复杂,只需要按照模块化的思维,移植底层驱动代码,修改与接口有关的相关硬件的配置,即可完成相应的功能代码的移植工作。代码移植是我们搞嵌入式开发必须要掌握的一种技能,掌握了移植的技巧,不同的平台间的切换也会自如些,开发的效率也会适当的得到一定的提高。