[GD32L233C-START 评测] GD32L233C-START测评 0.96OLED显示屏(I2C总线)显示代码移植

happy_njr   2022-2-3 22:05 楼主

1、0.96 OLED显示屏简介

    0.96寸OLED分辨率是128*64;即OLED显示是128行*64列,采用IIC 接口方式进行通讯(默认地址0x78),显示屏模块如下图所示。0.96’OLED(4Pin)模块采用SSD1306 为驱动芯片,模块带有稳压芯片,支持软件模拟IIC 通讯与硬件IIC 通讯,上电自动复位,功耗低,自发光,自由视角。

OLED屏.jpg

    接口定义

    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时序来完成的显示代码的底层驱动。

GPIO.jpg

      通过排线将模块的VCC,GND,SCL,SDA分别与DEMO板上的3.3V ,GND ,PA1,PA2相连,完成硬件电路的连接。

连线.jpg

    3、工程代码移植

      首先下载OLED的店铺提供的参考官方的相关资料,如有需要,可以到下面的链接下载中景园的OLED屏的相关资料,资料相对比较完善,除了文档外,还提供了I2C接口,及SPI接口的不同的平台下的参考代码,供我们移植使用。

         链接:https://pan.baidu.com/s/1gw5hNr5oGIVyxUZZb3189Q               提取码:gl0z

         

OLED资料.jpg

   找到 03-程序源码——>中景园IIC接口显示屏例程——>STM32例程——>01-0.96OLED显示屏STM32F103C8T6_IIC例程——>HARDWARE——>OLED,拷贝OLED该文件夹到自己新建的工程目录下。该文件夹下,提供了OLED的相关底层接口及相关显示驱动的代码,需要我们适当的修改就可以完成OLED的显示移植工作。

OLED2.jpg

     1)新建工程,移植标准库文件,可以直接通过例程直接进行工程的移植,也可以参见其他小伙伴的帖子进行工程代码的移植,并将OLED文件夹放到工程目录下的HARDWARE文件夹下,并添加oled.c到工程中来,此处放到的是HARDWARE工程目录下,该文件下放置外设硬件资源的相关文件。工程目录如下图所示:

工程目录.jpg

  同时注意,设置oled.h等的文件路径,如下图设置选择相应的文件夹即可:
 

添加头文件目录.jpg

 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文件中对应的汉字库代码。

取模.jpg

在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)编译,下载,显示结果如下:

OLED显示.jpg

5)总结

  OLED的显示的代码移植并不复杂,只需要按照模块化的思维,移植底层驱动代码,修改与接口有关的相关硬件的配置,即可完成相应的功能代码的移植工作。代码移植是我们搞嵌入式开发必须要掌握的一种技能,掌握了移植的技巧,不同的平台间的切换也会自如些,开发的效率也会适当的得到一定的提高。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复