目录
- 硬知识
-
- LCD12864简介
-
- 主控芯片ST7920的功能是:
- 驱动芯片ST7921的功能是:
- 引脚功能
- 时序
-
- 并行通信
- 串行通信
- 指令
- 存储结构
- 操作
- 取模软件的配置
- 示例程序
-
- st7920.c
- st7920.h
- 测试程序
-
- 显示图片
-
- 图片1
-
- 实验现象
- 图片2
-
- 实验现象
- 显示字符
-
- 英文
-
- 实验现象
- 中文
-
- 实验现象
- Proteus的仿真
普中51-单核-A2
STC89C52
Windows 10 20H2
Proteus 8 Frofessional v8.9 SP2
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
移植自发布一个ST7920的LCD12864 Proteus仿真模型,支持串口和4bit模式通讯 —— cdhigh
参考资料:《LCD12864液晶显示模块数据手册(带字库)》
硬知识
LCD12864简介
LCD12864液晶屏,背面3个COB牛屎堆,一个主控芯片ST7920,另外两个是移位芯片ST7921.
主控芯片ST7920的功能是:
- 与我们的单片机并行通信。
- 字库ROM、CGROM,DDRAM等。
- 行扫描COM0 ~ COM31…
- 列扫描SEG0 ~ SEG63…
- 串行方式发送数据到两片ST7921驱动芯片。
驱动芯片ST7921的功能是:
- 接收来自ST7920的串行信 ,转化成并口驱动电压。
- 根据信 要求,两片芯片分别驱动SEG64~ SEG159,SEG160~ SEG255
LCD12864它本质上是256×32点的矩阵屏,32行扫描是COM0-COM31,列字节是SEG0-SEG255总共32字节,每个字节8bit,总共256位。.
原本左右拼接的256×32点,变成了上下拼接的128×64点。如下图所示:
时序
并行通信
指令
操作
示例程序
stdint.h见【51单片机快速入门指南】1:基础知识和工程创建
软件SPI程序见【51单片机快速入门指南】5:软件SPI
SPI选择模式0。
模式选择在st7920.h内

st7920.c
//ST7920 LCD 驱动#include "st7920.h"#include "./Soft_SPI/Soft_SPI.h"void delay_ms(int i);void st7920_delay(){}void LCD12864_CS_H() //若SPI总线上只有屏幕,则可接VCC{ LCD12864_CS = 1;}void LCD12864_CS_L(){ LCD12864_CS = 0;}void LCD12864_PSB_L() //接GND或给低电平以实现SPI通讯{ LCD12864_PSB = 0;}void LCD12864_RS_H(){ RS_Pin = 1;}void LCD12864_RS_L(){ RS_Pin = 0;}void LCD12864_WR_H(){ WR_Pin = 1;}void LCD12864_WR_L(){ WR_Pin = 0;}void LCD12864_EN_H(){ EN_Pin = 1;}void LCD12864_EN_L(){ EN_Pin = 0;}uint8_t LCD12864_Port_Read(){ return LCD12864_Port;}//并口模式下写八位void LCD12864_Port_Write_8B(uint8_t Data){ LCD12864_Port = Data;}//4位模式下写半个字节(高4位)void LCD12864_Port_Write_4B(uint8_t Data){ LCD12864_Port &= 0x0F; LCD12864_Port |= Data;}//初始化void LCD_init(void){#if LCD_INTERFACE == MODE_SPI LCD12864_PSB_L();#endif delay_ms(50); LCD_write_command(0x33); delay_ms(1); LCD_write_command(0x32); delay_ms(1);#if LCD_INTERFACE == MODE_4BIT LCD_write_command(0x28); delay_ms(1); LCD_write_command(0x28); delay_ms(1);#endif LCD_write_command(0x08); //显示关 delay_ms(1); //大于100uS的延时程序 LCD_write_command(0x10); //光标设置 delay_ms(1); //大于100uS的延时程序 LCD_write_command(0x0C); //显示开 delay_ms(1); //大于100uS的延时程序 LCD_write_command(0x01); //Display Clear delay_ms(10); //大于10mS的延时程序 LCD_write_command(0x06); //光标从右向左加1位移动 delay_ms(10); //大于10mS的延时程序}//写命令void LCD_write_command(unsigned char command){#if LCD_INTERFACE == MODE_SPI LCD2_spi_write_byte(0xf8); st7920_delay(); LCD2_spi_write_byte_standard(command);#else LCD12864_RS_L(); //RS=0 LCD_write_byte(command); delay_ms(1);#endif}//写数据void LCD_write_data(unsigned char Data){#if LCD_INTERFACE == MODE_SPI LCD2_spi_write_byte(0xfa); st7920_delay(); LCD2_spi_write_byte_standard(Data);#else LCD12864_RS_H(); //RS=1 LCD_write_byte(Data);#endif}//并口模式写一个字节到控制器void LCD_write_byte(unsigned char Data){#if LCD_INTERFACE == MODE_4BIT LCD_write_half_byte(Data); Data 4; LCD_write_half_byte(Data);#else LCD12864_Port_Write_8B(Data); LCD12864_WR_L(); LCD12864_EN_H(); //EN端产生一个由低电平变高电平,写LCD st7920_delay(); LCD12864_EN_L(); //EN端产生一个由高电平变低电平,写LCD st7920_delay(); LCD12864_WR_H();#endif}//4位模式下写半个字节(高4位)void LCD_write_half_byte(unsigned char half_byte){ LCD12864_Port_Write_4B(half_byte); LCD12864_WR_L(); LCD12864_EN_H(); //EN端产生一个由低电平变高电平,写LCD st7920_delay(); LCD12864_EN_L(); //EN端产生一个由高电平变低电平,写LCD st7920_delay(); LCD12864_WR_H();}//串行模式下写一个字节void LCD2_spi_write_byte(unsigned char Data){ LCD12864_CS_H(); SOFT_SPI_RW_MODE0(Data); LCD12864_CS_L();}//标准处理,一个字节要拆成两个字节发送void LCD2_spi_write_byte_standard(unsigned char Data){ LCD2_spi_write_byte(Data & 0xf0); LCD2_spi_write_byte((Data 4) & 0xf0);}声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!