介绍
本项目为参加兆易创新联手安谋科技极术社区联合推出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总线写入相应的数组,即可显示所需的图像。