学习GD32C113 -- 使用 GD32C113 驱动 1.54 TFT LCD、显示分形

1、所使用 TFT LCD

TFT LCD 采用中景园 的 1.54 寸 TFT LCD,驱动 IC 是 ST789V,如下:

image-20260317085148774

屏的参数:

image-20260317085205809

2、硬件连接

硬件连接如下:

PA5 -> SCL
PA7 -> SDA
PB0 -> RES
PB1 -> DC
PA4 -> CS
PA1 -> BLK

3、使用 IO 模拟驱动

官方提供的例程是使用 IO 模拟 SPI 驱动的,这里也先使用 IO 模拟测试下屏的好坏,在之前创建的工程基础上,把官方提供的例程里面屏幕相关部分代码添加到工程:

image-20260321223359507

移植关键是修改 IO 相关部分,按照 IO 连接方式,修改 oled.h 里面控制 IO 的宏定义,修改如下:

#define LCD_SCLK_Clr() gpio_bit_reset(GPIOA,GPIO_PIN_5)//SCL=SCLK
#define LCD_SCLK_Set() gpio_bit_set(GPIOA,GPIO_PIN_5)

#define LCD_MOSI_Clr() gpio_bit_reset(GPIOA,GPIO_PIN_7)//SDA=MOSI
#define LCD_MOSI_Set() gpio_bit_set(GPIOA,GPIO_PIN_7)

#define LCD_RES_Clr()  gpio_bit_reset(GPIOB,GPIO_PIN_0)//RES
#define LCD_RES_Set()  gpio_bit_set(GPIOB,GPIO_PIN_0)

#define LCD_DC_Clr()   gpio_bit_reset(GPIOB,GPIO_PIN_1)//DC
#define LCD_DC_Set()   gpio_bit_set(GPIOB,GPIO_PIN_1)
 		     
#define LCD_CS_Clr()   gpio_bit_reset(GPIOA,GPIO_PIN_4)//CS
#define LCD_CS_Set()   gpio_bit_set(GPIOA,GPIO_PIN_4)

#define LCD_BLK_Clr()  gpio_bit_reset(GPIOA,GPIO_PIN_1)//BLK
#define LCD_BLK_Set()  gpio_bit_set(GPIOA,GPIO_PIN_1)

初始化相应 IO

//初始化GPIO
void LCD_GPIO_Init(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_4);
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);

	gpio_bit_set(GPIOB,GPIO_PIN_0);
	gpio_bit_set(GPIOB,GPIO_PIN_1);
	gpio_bit_set(GPIOA,GPIO_PIN_1);
	gpio_bit_set(GPIOA,GPIO_PIN_4);
	gpio_bit_set(GPIOA,GPIO_PIN_5);
	gpio_bit_set(GPIOA,GPIO_PIN_7);
}

然后把例程里面应用部分代码添加到 main 函数:

	LCD_Init();//LCD初始化
	LCD_Fill(0,0,LCD_W,LCD_H,WHITE);

	while(1)
	{

		LCD_ShowChinese(0,0,"中景园电子",RED,WHITE,32,0);
		LCD_ShowString(0,40,"LCD_W:",RED,WHITE,16,0);
		LCD_ShowIntNum(48,40,LCD_W,3,RED,WHITE,16);
		LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
		LCD_ShowIntNum(128,40,LCD_H,3,RED,WHITE,16);
		LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
		LCD_ShowString(0,70,"Increaseing Nun:",RED,WHITE,16,0);
		LCD_ShowFloatNum1(128,70,t,4,RED,WHITE,16);
		t+=0.11;
		for(j=0;j<3;j++)
		{
			for(i=0;i<6;i++)
			{
				LCD_ShowPicture(40*i,120+j*40,40,40,gImage_1);
			}
		}
	}	

编译下载,成功点亮:

image-20260321225046629

4、使用硬件 SPI

硬件连接使用了 PA5、PA7,对应的是硬件 SPI0,首先初始化 SPI0 及对应 IO:

void spi_config(void)
{
	spi_parameter_struct spi_init_struct;
		
    /* SPI0 GPIO config:SCK/PA5,  MOSI/PA7 */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
		
	rcu_periph_clock_enable(RCU_SPI0);
    /* deinitialize SPI and the parameters */
    spi_i2s_deinit(SPI0);
    spi_struct_para_init(&spi_init_struct);

    /* configure SPI0 parameter */
    spi_init_struct.trans_mode           = SPI_BIDIRECTIONAL_TRANSMIT;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_8;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);
	spi_enable(SPI0);
}

由于该 LCD 模块没有引出读的口,所以这里只需要用 SPI 单发送模式就行,不使用硬件 CS,SPI 相关 IO 只初始化 PA5、PA7,然后是使能 SPI0 时钟、配置参数、使能 SPI,然后是实现写 SPI 函数:

void spi_transmission_byte(uint8_t data)
{
    while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE));
    /* send the data */
    spi_i2s_data_transmit(SPI0, data);
}

修改 LCD 驱动部分:

void LCD_Writ_Bus(uint8_t dat) 
{	
	uint8_t i;
	LCD_CS_Clr();
	spi_transmission_byte(dat);
    LCD_CS_Set();	
}

编译下载,屏幕不亮,在线调试看了下 SPI 寄存器,发现 RBNE 置位了,

image-20260322133701142

修改发送函数,添加读取数据寄存器操作:

void spi_transmission_byte(uint8_t data)
{
    while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE));
    /* send the data */
    spi_i2s_data_transmit(SPI0, data);
    while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE));
    /* return the data read from the SPI bus */ 
     spi_i2s_data_receive(SPI0);
}

编译下载,成功点亮屏幕,

5、显示分形

尝试了以下在 1.54 大小的 LCD 上显示分形,分别实现了 mandelbrot 、 Julia,效果如下:

image-20260322194307290

参考:

1、黄保凯中景园1.54寸240x240高清ips lcd显示屏1.54寸液晶屏st7789-淘宝网

posted @ 2026-03-22 20:11  哈拎  阅读(4)  评论(0)    收藏  举报