学习GD32C113 使用 GD32C113 驱动墨水屏(IO口模拟)
1、所使用墨水屏
墨水屏采用中景园 的 1.54寸电子纸墨水屏幕,如下:

屏的参数:

2、硬件连接
卖家提供的例程是 IO 模拟 SPI 实现的,这里也直接使用 IO 模拟 SPI,连接方法如下:
PA5 -> SCL
PA7 -> SDA
PB1 -> RES
PB0 -> DC
PA8 -> CS
PA1 -> BUSY
3、软件移植
在之前创建的工程基础上,把官方提供的例程里面评估相关部分代码添加到工程:

移植关键是修改 IO 相关部分,按照 IO 连接方式,修改 oled.h 里面控制 IO 的宏定义,修改如下:
#define OLED_SCL_Clr() gpio_bit_reset(GPIOA,GPIO_PIN_5)//SCL
#define OLED_SCL_Set() gpio_bit_set(GPIOA,GPIO_PIN_5)
#define OLED_SDA_Clr() gpio_bit_reset(GPIOA,GPIO_PIN_7)//SDA
#define OLED_SDA_Set() gpio_bit_set(GPIOA,GPIO_PIN_7)
#define OLED_RES_Clr() gpio_bit_reset(GPIOB,GPIO_PIN_1)//RES
#define OLED_RES_Set() gpio_bit_set(GPIOB,GPIO_PIN_1)
#define OLED_DC_Clr() gpio_bit_reset(GPIOB,GPIO_PIN_0)//DC
#define OLED_DC_Set() gpio_bit_set(GPIOB,GPIO_PIN_0)
#define OLED_CS_Clr() gpio_bit_reset(GPIOA,GPIO_PIN_8)//CS
#define OLED_CS_Set() gpio_bit_set(GPIOA,GPIO_PIN_8)
#define OLED_BUSY() gpio_input_bit_get(GPIOA,GPIO_PIN_1)
初始化相应 IO
//初始化GPIO
void OLED_GPIOInit(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_5);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7);
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8);
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
}
然后把例程里面应用部分添加到 main 函数:
OLED_GUIInit();
Paint_NewImage(Image_BW,OLED_W,OLED_H,0,WHITE);
OLED_Clear(WHITE);
OLED_GUIInit();
OLED_ShowPicture(0,0,200,200,gImage_1,BLACK);
OLED_Display(Image_BW);;
delay_1ms(1000);
OLED_Clear(WHITE);
OLED_GUIInit();
OLED_ShowPicture(0,0,200,200,gImage_3,BLACK);
OLED_Display(Image_BW);;
delay_1ms(1000);
OLED_Clear(WHITE);
OLED_GUIInit();
OLED_ShowChinese(20,0,3,32,BLACK);//电
OLED_ShowChinese(52,0,4,32,BLACK);//子
OLED_ShowChinese(84,0,5,32,BLACK);//纸
OLED_ShowChinese(116,0,6,32,BLACK);//测
OLED_ShowChinese(148,0,7,32,BLACK);//试
OLED_ShowString(60,34,"2022/05/11",16,BLACK);
OLED_ShowString(40,50,"ASCII:",16,BLACK);
OLED_ShowString(100,50,"CODE:",16,BLACK);
OLED_ShowChar(88,50,t,16,BLACK);
OLED_ShowNum(140,50,t,3,16,BLACK);
t++;
if(t>'~')t=' ';
OLED_ShowPicture(14,74,172,64,gImage_2,BLACK);
OLED_ShowString(32,134,"1.54-inch E-paper",16,BLACK);
OLED_ShowString(0,152,"with 200 x 200 resolution",16,BLACK);
OLED_ShowString(8,168,"Zhongjingyuan Electronic",16,BLACK);
OLED_ShowString(24,184,"Technology Co.,Ltd.",16,BLACK);
OLED_DrawRectangle(1,1,200,200,BLACK,0);
OLED_Display(Image_BW);
delay_1ms(1000);
OLED_Clear(WHITE);
运行结果如下:

按照官方提供资料里面取模教程,生成了 “点灯笔记” 4 个汉字 32 X 32 的字模,

把生成的字模数组添加到代码里面,修改下例程
OLED_GUIInit();
OLED_ShowChinese(20,0,0,32,BLACK);//点
OLED_ShowChinese(52,0,1,32,BLACK);//灯
OLED_ShowChinese(84,0,2,32,BLACK);//笔
OLED_ShowChinese(116,0,3,32,BLACK);//记
OLED_ShowString(60,34,"GD32C113 Demo",32,BLACK);
OLED_ShowString(40,50,"Power By Halin",32,BLACK);
OLED_Display(Image_BW);
显示如下:

4、GD32C113 的 GPIO 使用方法
由于这里是使用 GPIO 模拟 SPI 来驱动墨水屏的,主要涉及到 GD32C113 的 GPIO 使用方法:
1、使能对应 GPIO 的时钟,使用的 API 为:
rcu_periph_clock_enable
2、根据需求设置为输入还是输出,不管输入还是输出都是用同一个 API 初始化:
gpio_init
3、使用
如果是要对哪个 口 拉高使用以下 API:
gpio_bit_set
拉低的话使用:
gpio_bit_reset
如果是要读取某个 IO 上的电平是高还是低,使用:
gpio_input_bit_get
更详细的使用方法可以查看固件库(SDK)里面的例程跟固件库使用说明:

参考:
本文来自博客园,作者:哈拎,转载请注明原文链接:https://www.cnblogs.com/halin/p/19737827
浙公网安备 33010602011771号