学习GD32C113 使用 GD32C113 驱动墨水屏(IO口模拟)

1、所使用墨水屏

墨水屏采用中景园 的 1.54寸电子纸墨水屏幕,如下:

e-link

屏的参数:

image-20260313224842837

2、硬件连接

卖家提供的例程是 IO 模拟 SPI 实现的,这里也直接使用 IO 模拟 SPI,连接方法如下:

PA5 -> SCL
PA7 -> SDA
PB1 -> RES
PB0 -> DC
PA8 -> CS
PA1 -> BUSY

3、软件移植

在之前创建的工程基础上,把官方提供的例程里面评估相关部分代码添加到工程:

image-20260314132910978

移植关键是修改 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);	

运行结果如下:

image-20260314142452938

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

image-20260314142233606

把生成的字模数组添加到代码里面,修改下例程

		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);

显示如下:

image-20260314142400186

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)里面的例程跟固件库使用说明:

image-20260315091947962

参考:

1、1.54寸电子纸墨水屏幕1.54寸显示屏黑白EPD电子纸显示屏墨水屏

posted @ 2026-03-19 11:15  哈拎  阅读(2)  评论(0)    收藏  举报