13

黑船 · 2022年12月28日 · 广东

【GD32F427开发板试用】12864显示屏驱动

介绍

本项目为参加兆易创新联手安谋科技极术社区联合推出GD32F427开发板试用活动。

ST7820介绍

ST7820是矽創电子旗下的中文字型点阵矩阵LCD驱动器,可以显示字母、数字符号、中文字型和自定义图块显示,他可以提供三种控制方式,8位并行通信、4位并行通信和SPI串行通信,提供多功能指令:
画面清除
游标归位
游标显示/隐藏
显示字元闪烁
垂直画面旋转
反白显示
睡眠模式

首先提供了st7820和GD32F427的SPI串行通信驱动代码,提供了显示字符、显示图像和移动游标的函数,然后在此基础上介绍如何在st7820驱动的12864显示屏中显示所需的图像。

st7820与GD32F427的IO连接如下,通过SPI0进行通信。
RS:PA4
SID:PA7
CLK:PA5
RST:PC7

初始化程序:硬件SPI0和延迟timer2程序

void lcd_init(void)
{
    spi_parameter_struct spi_init_struct;
    timer_parameter_struct timer_initpara;
    
    rcu_periph_clock_enable(RCU_GPIOC);
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SPI0);
    
    rcu_periph_clock_enable(RCU_TIMER2);

    /* configure SPI0 GPIO */
    gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5 | GPIO_PIN_7);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
    
    /* CS PIN */
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);    
    
    /* RESET PIN */
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    
    gpio_bit_reset(GPIOC, GPIO_PIN_7);    
    
    spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
    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_32;
    spi_init_struct.endian = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);    
    
    spi_enable(SPI0);    
    
    timer_deinit(TIMER2);
    timer_initpara.prescaler = 168 - 1;
    timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection = TIMER_COUNTER_DOWN;
    timer_initpara.period = 1;
    timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER2, &timer_initpara);    
}
void timer_delay_us(uint16_t nus)
{
    TIMER_CAR(TIMER2) = (uint32_t)nus;

    TIMER_CTL0(TIMER2) |= (uint32_t)TIMER_CTL0_CEN;

    while((TIMER_INTF(TIMER2) & TIMER_FLAG_UP) != SET);

    TIMER_CTL0(TIMER2) &= ~(uint32_t)TIMER_CTL0_CEN;

    TIMER_INTF(TIMER2) = (~(uint32_t)TIMER_FLAG_UP);
        
}

显示字符

可以通过SPI总线写入字符的ASCII码和芯片内置的汉字字符,即可显示所需的字符。

显示图像

首先需要将图像转换为和屏幕相同大小的128x64的尺寸,然后按照灰度转为为HEX数组,然后通过SPI总线写入相应的数组,即可显示所需的图像。

实现效果

微信图片_20221228211822.jpg

完整仓库地址

推荐阅读
关注数
10708
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息