【免费开源】STM32_LCD12864液晶显示屏中文字库菜单驱动并行串行双模式完整工程项目
一、项目背景
LCD12864 是 128×64 点阵液晶显示屏,自带 GB2312 中文字库(ST7920 控制器版本),是嵌入式入门最具性价比的图形显示屏。本项目"基于 STM32 的 LCD12864 显示屏驱动"实现并行(8080)与串行(SPI)双模式驱动、汉字与图形混合显示、菜单系统、动画刷新。
二、项目流程图
三、硬件接线(串行 SPI 模式)
| LCD12864 | STM32 |
|---|---|
| RS(CS) | PB12 |
| RW(MOSI) | PB15 |
| EN(SCK) | PB13 |
| PSB | GND |
| BLA | 3.3V |
| BLK | GND |
四、核心驱动代码
#include"main.h"externSPI_HandleTypeDef hspi2;#defineCS_HIGH()HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET)#defineCS_LOW()HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET)staticvoidSend(uint8_trs,uint8_td){uint8_thdr=0xF8|(rs?0x02:0x00);uint8_thi=d&0xF0;uint8_tlo=(d&0x0F)<<4;CS_HIGH();HAL_SPI_Transmit(&hspi2,&hdr,1,100);HAL_SPI_Transmit(&hspi2,&hi,1,100);HAL_SPI_Transmit(&hspi2,&lo,1,100);CS_LOW();HAL_Delay(1);}voidLCD_Cmd(uint8_tc){Send(0,c);}voidLCD_Data(uint8_tc){Send(1,c);}voidLCD12864_Init(void){HAL_Delay(100);LCD_Cmd(0x30);LCD_Cmd(0x0C);LCD_Cmd(0x01);HAL_Delay(2);LCD_Cmd(0x06);}staticconstuint8_taddr[4]={0x80,0x90,0x88,0x98};voidLCD_Show(uint8_trow,uint8_tcol,constchar*s){LCD_Cmd(addr[row]+col);while(*s)LCD_Data(*s++);}intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_SPI2_Init();LCD12864_Init();LCD_Show(0,0,"你好 STM32!");LCD_Show(1,0,"LCD12864 测试");LCD_Show(2,0,"汉字 ABC 123");LCD_Show(3,0,"www.example.com");while(1)HAL_Delay(1000);}五、关键技术
5.1 串行三字节协议
ST7920 串行模式每次传 3 个字节:起始字节(同步) + 数据高 4 位 + 数据低 4 位,不要忘了高低位拆分。
5.2 GDRAM 绘图
开启扩展指令集 0x34 后可以写入 GDRAM,每个字节代表横向 8 个像素,可显示 BMP 图像、波形。
5.3 中文显示
直接发送 GB2312 双字节即可(字库内置),无需自己写字模数组。
六、应用扩展
- 配合 ADC 显示电压波形;
- 多级菜单参数配置面板;
- 中文 OLED-like 时钟项目;
- 工业仪表显示。
七、调试经验
- PSB 引脚决定并/串模式:低电平为串行;
- 屏幕雪花/漏字通常是延时不够,发送命令后建议加 100us 延时;
- 部分屏幕背光接 5V,注意电压;
- 写 GDRAM 之前要切 0x34,写完文字之前要切 0x30。
八、总结
LCD12864 仍是嵌入式开发中"显示中文最经济"的方案。本工程提供完整的 SPI 驱动、并口驱动、菜单示例、波形显示,源码可直接用在毕设项目中。