【51单片机快速入门指南】6.2:SPI 、八线、四线控制 LCD12864 屏幕及Proteus的仿真(支持中文汉字)

目录

  • 硬知识
    • 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的功能是:

  1. 与我们的单片机并行通信。
  2. 字库ROM、CGROM,DDRAM等。
  3. 行扫描COM0 ~ COM31…
  4. 列扫描SEG0 ~ SEG63…
  5. 串行方式发送数据到两片ST7921驱动芯片。

驱动芯片ST7921的功能是:

  1. 接收来自ST7920的串行信 ,转化成并口驱动电压。
  2. 根据信 要求,两片芯片分别驱动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

【51单片机快速入门指南】6.2:SPI 、八线、四线控制 LCD12864 屏幕及Proteus的仿真(支持中文汉字)

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进行处理,非常感谢!

上一篇 2021年11月4日
下一篇 2021年11月4日

相关推荐