精华内容
下载资源
问答
  • 原标题:12864液晶显示屏串行驱动演示C语言程序设计/*LCD (ST7920)驱动程序马文垒 2004/12/27*/#include //引脚定义#define CS P2_0 //片选 高电平有效 单片LCD使用时可固定高电平#define SID P2_1 //数据#define ...

    原标题:12864液晶显示屏串行驱动演示C语言程序设计

    /*

    LCD (ST7920)驱动程序

    马文垒 2004/12/27

    */

    #include

    //引脚定义

    #define CS P2_0 //片选 高电平有效 单片LCD使用时可固定高电平

    #define SID P2_1 //数据

    #define SCLK P2_2 //时钟

    #define PSB P2_3 //低电平时表示用串口驱动,可固定低电平

    #define RESET P2_4 //LCD复位,LCD模块自带复位电路。可不接

    void write(bit start, unsigned char ddata);

    void sendbyte(unsigned char bbyte);

    void delaynms(unsigned int di);

    void lcdinit(void);

    void lcdtest(void);

    void lcdcls(void);

    unsigned char code ma[] ={" 汉字显示LCD "};

    unsigned char code ma2[]={"自带字库图文混排"};

    unsigned char code ma3[]={"控制IC:ST7920 "};

    unsigned char code ma4[]={"功能强大使用方便"};

    void lcdinit(void) //初始化LCD

    {

    delaynms(10); //启动等待,等LCM讲入工作状态

    PSB=0; ; //串口驱动模式

    RESET=0; delaynms(1); RESET=1; // 复位LCD

    CS=1;

    write(0,0x30); //8 位介面,基本指令集

    write(0,0x0c); //显示打开,光标关,反白关

    write(0,0x01); //清屏,将DDRAM的地址计数器归零

    }

    void write(bit start, unsigned char ddata) //写指令或数据

    {

    unsigned char start_data,Hdata,Ldata;

    if(start==0) start_data=0xf8; //写指令

    else start_data=0xfa; //写数据

    Hdata=ddata&0xf0; //取高四位

    Ldata=(ddata<<4)&0xf0; //取低四位

    sendbyte(start_data); //发送起始信号

    delaynms(5); //延时是必须的

    sendbyte(Hdata); //发送高四位

    delaynms(1); //延时是必须的

    sendbyte(Ldata); //发送低四位

    delaynms(1); //延时是必须的

    }

    void sendbyte(unsigned char bbyte) //发送一个字节

    {

    unsigned char i;

    for(i=0;i<8;i++)

    {

    SID=bbyte&0x80; //取出最高位

    SCLK=1;

    SCLK=0;

    bbyte<<=1; //左移

    }

    }

    void delaynms(unsigned int di) //延时

    {

    unsigned int da,db;

    for(da=0;da

    for(db=0;db<10;db++);

    }

    void lcdtest(void) //图形方式下屏幕全黑

    {

    unsigned char i,j;

    for(i=0;i<32;i++)

    { write(0,0x80+i);write(0,0x80);

    for(j=0;j<16;j++) write(1,0xff);

    }

    for(i=0;i<32;i++)

    { write(0,0x80+i);write(0,0x88);

    for(j=0;j<16;j++) write(1,0xff);

    }

    }

    void lcdcls(void) //图形方式下清屏

    {

    unsigned char i,j;

    for(i=0;i<32;i++)

    { write(0,0x80+i);write(0,0x80);

    for(j=0;j<16;j++) write(1,0x00);

    }

    for(i=0;i<32;i++)

    { write(0,0x80+i);write(0,0x88);

    for(j=0;j<16;j++) write(1,0x00);

    }

    }

    void main(void)

    {

    unsigned char i;

    lcdinit();

    while(1)

    {

    write(0,0x80); for(i=0;i<16;i++) write(1,ma[i]);

    write(0,0x90); for(i=0;i<16;i++) write(1,ma2[i]);

    write(0,0x88); for(i=0;i<16;i++) write(1,ma3[i]);

    write(0,0x98); for(i=0;i<16;i++) write(1,ma4[i]);

    write(0,0x36); //图形方式

    lcdtest();

    lcdcls();

    }

    }

    责任编辑:

    展开全文
  • 液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD122321、LCD128642、LCD122323、接线图二、ST79201、接口时序①、并口时序图②、串口时序图2、用户指令集①、基本指令集(RE = 0)②、扩展指令集...



    一、LCD12864 / LCD12232

    1、LCD12864

           LCD12864 带中文字库图形点阵式液晶显示器,可配合各种单片机可完成中文汉字、英文字符和图形显示,可构成全中文人机交互图形界面,模块具有功耗低、显示内容丰富等特点而应用广泛。它是利用液晶经过处理后能改变光线的传播方向,以电流刺激液晶分子产生点、线、面并配合背光灯构成画面。其显示分辨率为 128 × 64, 内置 2M 位中文字型 ROM(CGROM)8192 个(16 * 16 点阵)汉字,和 16K 位半宽字型 ROM(HCGROM)128个(16 * 8 点阵)ASCII 字符集,可以显示 8 × 4 行 16 × 16 点阵的汉字。ST7920 的字型产生 RAM(CGRAM)提供用户自定义字符生成(造字)功能,可提供 4 组 16 * 16 点阵的空间。将要显示的字符的编码写到显示 RAM(DDRAM)上,硬件自动从 CGROM 中选择将要显示的字型显示在屏幕上。绘图 RAM 提供 64 * 32 个字节的空间,最多可以控制 256 * 64 点阵的二维绘图缓冲空间。具有 4 位 / 8 位并行(适配 M6800 时序)、2 线或 3 线串行多种接口方式。各种液晶厂家均有提供几乎都是同样规格的 LCD12864 模块或兼容模块,基本上也都采用了兼容的 IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块。

           我用的这块 LCD12864 液晶屏是在优信电子上买的 12864T,带字库,如下图。

           关于这款 LCD12864 液晶屏的串并口选择,默认出货为串口,并口通用。1、在选择串并口时可以通过程序选择高低电平(PSB引脚)来完成。2、可以通过短接液晶屏背面 PCB 上面的丝印来选择,S 短接为串口,P 点短接为并口。

    在这里插入图片描述
           由于出货时第三脚 V0 已经通过 JP2 跳点断开,如需要通过外部可调电阻调节,将 JP2 跳点连接即可。

    在这里插入图片描述
    引脚说明:
    在这里插入图片描述
    外形尺寸说明:
    在这里插入图片描述

    2、LCD12232

           LCD12232 和 LCD12864 一样,主控都是 ST7920(各种液晶厂家均有提供几乎都是同样规格的 LCD12232 模块或兼容模块,基本上也都采用了兼容的 IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块),LCD12232 相当于是把 LCD12864 纵向截掉一半,同时横向少了 6 个像素点。我使用的是 YB12232ZB 这款液晶屏,带字库,如下图。

    在这里插入图片描述
    在这里插入图片描述
           关于这款 LCD12232 液晶屏的串并口选择,默认出货为串口,并口通用。串 / 并口选择必须通过短接液晶屏背面 PCB 上面丝印来选择,S 短接为串口,P 点短接为并口。不能两个同时短接!!!只能短接其中一个!!!

    在这里插入图片描述

    串口引脚说明(短接 S):
    在这里插入图片描述
    并口引脚说明(短接 P):
    在这里插入图片描述
    外形尺寸说明
    在这里插入图片描述
    控制流:
    在这里插入图片描述

    3、接线图

    这里使用 STC15W408AS(SOP20)做主控 MCU。
    可通过 JP1 和 JP2 选择液晶屏的供电电压,3.3V 或者 5V。
    可通过 JP3 确定 PSB 引脚是通过单片机 IO 控制或者直接拉高(悬空默认拉高,即并行接口,仅 LCD12864 有效)。
    可通过 JP4 确定 RST 引脚是通过单片机 IO 控制或者直接拉高(低电平有效)。
    可通过单片机 IO 控制液晶屏背光开关,默认开背光(低电平关背光)。
    在这里插入图片描述

    在这里插入图片描述

    二、ST7920

    1、接口时序

    ①、并口时序图

    写时序图:
    在这里插入图片描述
    读时序图:
    在这里插入图片描述

    ②、串口时序图

    在这里插入图片描述
    串行数据传送共分三个字节完成:
    第一字节:串口控制格式: 11111ABC
    A 为数据传送方向控制:H 表示数据从 LCD 到 MCU,L 表示数据从 MCU 到 LCD
    B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令
    C 固定为 0
    第二字节:(并行)8 位数据的高 4 位—格式 DDDD0000
    第三字节:(并行)8 位数据的低 4 位—格式 0000DDDD

    串行接口时序参数:(测试条件:T=25℃ VDD=4.5V)
    在这里插入图片描述

    2、用户指令集

    1、当模块在接受指令前,MCU 必须先确认模块内部处于非忙碌状态,即读取 BF 标志时 BF 需为 0,方可接受新的指令;如果在送出一个指令前并不检查 BF 标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

    2、“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。

    ①、基本指令集(RE = 0)

    在这里插入图片描述

    ②、扩展指令集(RE = 1)

    在这里插入图片描述

    ③、具体指令介绍

    1、清除显示

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLLLLH

    功能:将 DDRAM 填满 “20H”(空格)代码,把 DDRAM 地址计数器(AC)调整为“00H”,更新设置进入设定点将 I / D 设为 1,游标右移 AC 加 1。

    2、位址归位

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLLLHX

    功能:把 DDRAM 位址计数器调整为“00H”,游标回原点,该功能不影响显示 DDRAM

    3、进入设定点

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLLHI/DS

    功能:指定在显示数据的读取与写入时,设定游标的移动方向及指定显示的移位。
    I/D = 1,游标右移,DDRAM 地址计数器(AC)加 1。
    I/D = 0,游标左移,DDRAM 地址计数器(AC)减 1。
    S:显示画面整体位移

    SI/D功能描述
    HH画面整体左移
    HL画面整体左移

    4、显示状态开 / 关

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLHDCB

    功能:
    D = 1,整体显示 ON。
    C = 1,游标 ON。
    B = 1,游标位置显示反白 ON,将游标所在地址上的内容反白显示。

    5、游标或显示移位控制

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLHS/CR/LXX

    功能:设定游标的移动与显示的移位控制位,这个指令并不改变 DDRAM 的内容

    S/CR/L方向AC 的值
    LL游标向左移动AC=AC-1
    LH游标向右移动AC=AC+1
    HL显示向左移动,游标跟着移动AC=AC
    HH显示向右移动,游标跟着移动AC=AC

    6、功能设定

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLHDLXREXX

    功能:
    DL = 1,8位接口控制位 。DL = 0,4位接口控制位。
    RE = 1,扩充指令集动作。
    RE = 0,基本指令集动作。
    同一指令的动作不能同时改变 DL 和 RE,需先改变 DL 再改变 RE 才确保设置正确。

    7、设定 CGRAM 位址

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLHAC5AC4AC3AC2AC1AC0

    功能:设定 CGRAM 地址到地址计数器(AC),AC 范围为 00H - 3FH 需确认扩充指令中 SR = 0(卷动位置或 RAM 地址选择)。

    8、设定 DDRAM 位址

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLHLAC5AC4AC3AC2AC1AC0

    功能:设定 DDRAM 地址到地址计数器(AC)
    第一行 AC 范围:80H - 8FH
    第二行 AC 范围:90H - 9FH
    ST7920 控制器的 128 * 64 点阵液晶其实原理上等同于 256 * 32 点阵,第三行对应的 DDRAM 地址紧接第一行,第四行对应的 DDRAM 地址紧接第二行。
    在使用反白功能时,如果第一行反白,第三行必然反白,第二行反白,第四行必然反白,这是正常现象。

    9、读取忙碌状态(BF)和位址

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    HLBFAC6AC5AC4AC3AC2AC1AC0

    功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值

    10、写资料到 RAM

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LHD7D6D5D4D3D2D1D0

    功能:当显示数据写入后会使 AC 改变,每个 RAM (DDRAM / CGRAM / IRAM)地址都可以连续写入 2 个字节的显示数据,当写入第二个字节时,地址计数器 AC 的值自动加一。

    11、读出 RAM 的值

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    HHD7D6D5D4D3D2D1D0

    功能:读取后会使 AC 改变
    设定 RAM(DDRAM / CGRAM / IRAM)地址后,先要 Dummy read 一次才能读取到正确的显示数据,第二次读取不需要 Dummy read,除非重新设置了 RAM 地址。

    12、 待命模式

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLLLLH

    功能:进入待命模式,执行其他命令都可终止待命模式,该指令不改变 RAM 的内容。

    13、卷动位址或 IRAM 位址选择

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLLLHSR

    功能:SR=1,允许输入垂直卷动位址。SR=0,允许输入 IRAM 位址(扩充指令)及允许设定 CGRAM 地址(基本指令)。

    14、反白选择

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLLHLR0

    功能:选择 2 行中的任一行作反白显示,并可决定反白的与否。R0 初始值为 0,第一次执行时为反白显示,再次执行时为正常显示。

    R0 = 0,第一行。R0 = 1,第二行。

    ST7920 控制器的 128 * 64 点阵液晶其实原理上等同于 256 * 32 点阵,第三行对应的 DDRAM 地址紧接第一行,第四行对应的 DDRAM 地址紧接第二行。
    在使用反白功能时,如果第一行反白,第三行必然反白,第二行反白,第四行必然反白,这是正常现象。

    15、睡眠模式

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLLLHSLLL

    功能:SL=1,脱离睡眠模式。SL=0,进入睡眠模式。

    16、扩充功能设定

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLLHDLXREGX

    功能:
    DL = 1,8位接口控制位 。DL = 0,4位接口控制位。
    RE=1,扩充指令集动作。RE=0,基本指令集动作。
    G=1,绘图显示 ON。G=0,绘图显示 OFF。

    17、设定 IRAM 位址或卷动位址

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLLHAC5AC4AC3AC2AC1AC0

    功能:SR=1,AC5-AC0 为垂直卷动地址。SR=0,AC3-AC0 写 IRAM 地址。

    18、设定绘图 RAM 位址

    RWRSDB7DB6DB5DB4DB3DB2DB1DB0
    LLHLLLAC3AC2AC1AC0
    LLHAC6AC5AC4AC3AC2AC1AC0

    功能:设定 GDRAM 地址到地址计数器(AC),先设置垂直位置再设置水平位置(连续写入 2 字节数据来完成垂直与水平坐标的设置)。
    垂直地址范围:AC6 - AC0
    水平地址范围:AC3 - AC0

    三、示例程序

    单片机晶振频率或者 IRC 频率 ≥ 20MHz 时,写数据 / 指令时需要加一定时间(例如 5 毫秒)延时,某则液晶屏显示会有杂点或者乱码!!!

    1、LCD12864并行接口

    //-------------------------------------------------------------------------------
    //创建日期: 2021.02.02
    //软件环境: Keil
    //硬件环境: STC15W408AS
    //IRC频率:  11.0592MHz
    //创建人: Calvin Chan
    //-------------------------------------------------------------------------------
    #include <reg51.h>
    #include <intrins.h>
    
    #ifndef uchar
    	#define uchar unsigned char
    #endif
    #ifndef uint
    	#define uint  unsigned int
    #endif
    
    #define DATA_PORT	P1		//数据口
    
    sbit RS = P3 ^ 5;
    sbit RW = P3 ^ 6;
    sbit EN = P3 ^ 7;
    
    sbit PSB = P3 ^ 4;		//串并口选择
    sbit RST = P3 ^ 3;		//复位
    
    sbit BK = P3 ^ 2;	//背光开关
    
    unsigned char code images[] = { //128,64,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x18, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF0, 0xFF, 0xE7, 0xFF, 0xEF, 0xFF, 0xFF, 0xC0, 0x00,
    	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
    	0x00, 0x03, 0xFF, 0xF7, 0xFF, 0xBE, 0x7F, 0xFB, 0xFF, 0xF3, 0xFB, 0xFF, 0xFF, 0xEF, 0x80, 0x00,
    	0x00, 0x01, 0xFB, 0xF7, 0x8F, 0xF8, 0x7F, 0xF8, 0xFF, 0xF1, 0xFB, 0xC7, 0x87, 0xEF, 0x00, 0x00,
    	0x00, 0x00, 0xFB, 0xF7, 0x0F, 0xF0, 0x7C, 0xF8, 0xF9, 0xF1, 0xFB, 0x87, 0x83, 0xEE, 0x00, 0x00,
    	0x00, 0x00, 0xFF, 0xFF, 0x07, 0xF0, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x87, 0x83, 0xFE, 0x00, 0x00,
    	0x00, 0x00, 0x7F, 0xFE, 0x03, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x07, 0x81, 0xFC, 0x00, 0x00,
    	0x00, 0x00, 0x7F, 0xFE, 0x07, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0x7F, 0x07, 0x81, 0xFC, 0x00, 0x00,
    	0x00, 0x00, 0x3E, 0x7C, 0x0F, 0xFC, 0x7C, 0xF8, 0xF9, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x00, 0x00,
    	0x00, 0x00, 0x3E, 0x7C, 0x3F, 0xFF, 0xFF, 0xFD, 0xFF, 0xF8, 0x3E, 0x1F, 0xF0, 0xF8, 0x00, 0x00,
    	0x00, 0x00, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0x70, 0x00, 0x00,
    	0x00, 0x00, 0x1C, 0x38, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0xF0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    
    unsigned char code images2[] = { //64*32
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xE0, 0xFF, 0xF0, 0xFF, 0x00,
    	0x00, 0x3E, 0x01, 0xF0, 0xFF, 0xF3, 0xFF, 0x80, 0x00, 0x3E, 0x01, 0xF0, 0x79, 0xC3, 0xC7, 0xC0,
    	0x00, 0x7F, 0x03, 0xF8, 0x7B, 0x87, 0x83, 0xC0, 0x00, 0x7F, 0x03, 0xF8, 0x7F, 0x07, 0x83, 0xE0,
    	0x00, 0x7F, 0x87, 0xF8, 0x7F, 0x07, 0x81, 0xE0, 0x00, 0xFF, 0x87, 0xFC, 0x7F, 0x87, 0x81, 0xE0,
    	0x00, 0xFF, 0x87, 0xFC, 0x7F, 0xC7, 0x83, 0xC0, 0x00, 0xE7, 0xCE, 0x3E, 0x7B, 0xE7, 0xC3, 0xC0,
    	0x01, 0xE7, 0xEF, 0x3F, 0xFF, 0xF3, 0xE7, 0x80, 0x03, 0xFF, 0xFF, 0x7F, 0xFF, 0xF9, 0xFF, 0x00,
    	0x03, 0xF7, 0xFF, 0x7F, 0xFF, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    
    //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲
    void lcd_wait_idle(void)                  //控制器忙检测子程序
    {
    	unsigned char i;
    	DATA_PORT = 0xff;
    	RS = 0;
    	RW = 1;
    	EN = 1;
    
    	for(i = 0; i < 20; i++)             //
    		if((DATA_PORT & 0x80) != 0x80)
    			break;  //D7=0 空闲退出
    
    	EN = 0;
    }
    
    //功能:从液晶显示控制器读数据
    unsigned char lcd_rd(void)               //从液晶显示控制器读数据
    {
    	unsigned char d;
    	lcd_wait_idle();                      //ST7920液晶显示控制器忙检测
    	RS = 1;                          //RS=1 RW=1 E=高脉冲
    	RW = 1;
    	EN = 1;
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	d = DATA_PORT;
    	EN = 0;
    	return d;
    }
    //功能:向液晶显示控制器写数据
    void lcd_wd(unsigned char d)             //向液晶显示控制器写数据
    {
    	lcd_wait_idle();                      //ST7920液晶显示控制器忙检测
    	DATA_PORT = d;
    	RS = 1;                          //RS=1 RW=0 E=高脉冲
    	RW = 0;
    	EN = 1;
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	EN = 0;
    }
    //功能:向液晶显示控制器送指令
    void lcd_wc(unsigned char c)             //向液晶显示控制器送指令
    {
    	lcd_wait_idle();                      //ST7920液晶显示控制器忙检测
    	DATA_PORT = c;
    	RS = 0;                          //RS=0 RW=0 E=高脉冲
    	RW = 0;
    	EN = 1;
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	EN = 0;
    }
    //功能:开启LCD显示
    void lcd_on(void)                        //LCD显示开启子程序
    {
    	lcd_wc(0x30);                        //设置为基本指令集
    	lcd_wc(0x0c);
    }
    //功能:关闭LCD显示
    void lcd_off(void)                       //LCD显示关闭子程序
    {
    	lcd_wc(0x30);                        //设置为基本指令集
    	lcd_wc(0x08);
    }
    //功能:液晶显示控制器初始化
    void lcd_init(void)                     //液晶显示控制器初始化子程序
    {
    	lcd_wc(0x33);                        //接口模式设置,8位,基本指令集
    	Delay5ms();                         //延时3MS
    	lcd_wc(0x30);                        //基本指令集,8位控制口
    	Delay5ms();                         //延时3MS
    	lcd_wc(0x30);                        //重复送基本指令集
    	Delay5ms();                         //延时3MS
    	lcd_wc(0x01);                        //清屏控制字
    	Delay5ms();                         //延时3MS
    	lcd_on();                            //开显示
    }
    //功能:开启绘图区域显示
    void lcd_graph_on(void)                  //绘图区域显示开启子程序
    {
    	lcd_wc(0x36);							//扩充指令集,8位,开绘图
    	lcd_wc(0x30);                        //恢复为基本指令集
    }
    //功能:关闭绘图区域显示
    void lcd_graph_off(void)                  //绘图区域显示关闭子程序
    {
    	lcd_wc(0x34);							//扩充指令集,8位,关绘图
    	lcd_wc(0x30);                        //恢复为基本指令集
    }
    //功能:整屏显示 c 代表的ASCII字符
    void char_lcd_fill(unsigned char c) 
    {
    	unsigned char i;
    
    	if(c > 128) {
    		return;
    	}
    
    	lcd_wc(0x80);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    
    	lcd_wc(0x90);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    
    	lcd_wc(0x88);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    
    	lcd_wc(0x98);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    }
    //功能:写字库自带的汉字、字符
    //字库自带的汉字为 16 * 16, 字符为 8 * 16
    //参数: x 横坐标 0-7
    //		y 纵坐标  1-4
    //		datas 需要写入的数据
    void lcd_write_font(unsigned char x, unsigned char y, unsigned char *datas)
    {
    	if(y > 4) {
    		return;
    	}
    
    	if(x > 7) {
    		return;
    	}
    
    	switch(y) { //定位第几行第几列开始写汉字
    		case 1 :
    			lcd_wc(0x80 + x);
    			break;
    
    		case 2 :
    			lcd_wc(0x90 + x);
    			break;
    
    		case 3 :
    			lcd_wc(0x88 + x);
    			break;
    
    		case 4 :
    			lcd_wc(0x98 + x);
    			break;
    	}
    
    	while(*datas != '\0') {
    		lcd_wd(*datas++);//写入汉字
    	}
    }
    
    //功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
    void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
    {
    	lcd_wc(0x36);                        //扩展指令集,8位,开绘图
    
    	if(GYPOS >= 32) {
    		lcd_wc((GYPOS - 32) + 0x80);	//下半屏,先送Y地址
    		lcd_wc((GXPOS / 16) + 0x88);	//下半屏,再送X地址
    
    	} else {
    		lcd_wc(GYPOS + 0x80);		//上半屏
    		lcd_wc((GXPOS / 16) + 0x80);	//上半屏
    	}
    
    	lcd_wc(0x30);                        //恢复为基本指令集
    }
    
    //功能:清除绘图区域
    void g_lcd_fill()
    {
    	unsigned char i, j;
    
    	for(i = 0; i < 64; i++) {
    		g_lcd_pos(0, i);
    
    		for(j = 0; j < 16; j++) {
    			lcd_wd(0x00);
    		}
    	}
    }
    
    //功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
    void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
    {
    	unsigned char lx, ly;
    
    	for(ly = 0; ly < YSIZE; ly++) {
    		g_lcd_pos(GXPOS, GYPOS);	//设置地址
    
    		for(lx = 0; lx < XSIZE; lx += 8) {
    			lcd_wd(*s);
    			s++;
    		}
    
    		GYPOS++;	//换行
    	}
    }
    
    void main()
    {
    	BK = 1;
    
    	Delay500ms();//等待上电稳定
    	lcd_init();
    
    	PSB = 1;		//并口
    
    	while(1) {
    		lcd_graph_on();		//开启图形
    		g_lcd_fill();		//图形区域清零
    		put_size_image(0, 0, 128, 64, images);
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		g_lcd_fill();
    		put_size_image(0, 32, 64, 32, images2);
    		put_size_image(64, 32, 64, 32, images2);
    		put_size_image(0, 0, 64, 32, images2);
    		put_size_image(64, 0, 64, 32, images2);
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		g_lcd_fill();
    		lcd_graph_off();	//关闭图形
    		lcd_write_font(0, 1, "中国牛批!!!!");
    		lcd_write_font(0, 2, "中国牛批!!!!");
    		lcd_write_font(0, 3, "中国牛批!!!!");
    		lcd_write_font(0, 4, "中国牛批!!!!");
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		char_lcd_fill(' ');		//清除文字区域
    	}
    }
    

    2、LCD12864串行接口

    //-------------------------------------------------------------------------------
    //创建日期: 2021.02.02
    //软件环境: Keil
    //硬件环境: STC15W408AS
    //IRC频率:  11.0592MHz
    //创建人: Calvin Chan
    //-------------------------------------------------------------------------------
    #include <reg51.h>
    #include <intrins.h>
    
    #ifndef uchar
    	#define uchar unsigned char
    #endif
    #ifndef uint
    	#define uint  unsigned int
    #endif
    
    #define DATA_PORT	P1		//数据口
    
    sbit CS   = P3 ^ 5;
    sbit STD  = P3 ^ 6;
    sbit SCLK = P3 ^ 7;
    
    sbit PSB = P3 ^ 4;		//串并口选择
    sbit RST = P3 ^ 3;		//复位
    
    sbit BK = P3 ^ 2;	//背光开关
    
    unsigned char code images[] = { //128,64,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x18, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF0, 0xFF, 0xE7, 0xFF, 0xEF, 0xFF, 0xFF, 0xC0, 0x00,
    	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
    	0x00, 0x03, 0xFF, 0xF7, 0xFF, 0xBE, 0x7F, 0xFB, 0xFF, 0xF3, 0xFB, 0xFF, 0xFF, 0xEF, 0x80, 0x00,
    	0x00, 0x01, 0xFB, 0xF7, 0x8F, 0xF8, 0x7F, 0xF8, 0xFF, 0xF1, 0xFB, 0xC7, 0x87, 0xEF, 0x00, 0x00,
    	0x00, 0x00, 0xFB, 0xF7, 0x0F, 0xF0, 0x7C, 0xF8, 0xF9, 0xF1, 0xFB, 0x87, 0x83, 0xEE, 0x00, 0x00,
    	0x00, 0x00, 0xFF, 0xFF, 0x07, 0xF0, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x87, 0x83, 0xFE, 0x00, 0x00,
    	0x00, 0x00, 0x7F, 0xFE, 0x03, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x07, 0x81, 0xFC, 0x00, 0x00,
    	0x00, 0x00, 0x7F, 0xFE, 0x07, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0x7F, 0x07, 0x81, 0xFC, 0x00, 0x00,
    	0x00, 0x00, 0x3E, 0x7C, 0x0F, 0xFC, 0x7C, 0xF8, 0xF9, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x00, 0x00,
    	0x00, 0x00, 0x3E, 0x7C, 0x3F, 0xFF, 0xFF, 0xFD, 0xFF, 0xF8, 0x3E, 0x1F, 0xF0, 0xF8, 0x00, 0x00,
    	0x00, 0x00, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0x70, 0x00, 0x00,
    	0x00, 0x00, 0x1C, 0x38, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0xF0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    
    unsigned char code images2[] = { //64*32
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xE0, 0xFF, 0xF0, 0xFF, 0x00,
    	0x00, 0x3E, 0x01, 0xF0, 0xFF, 0xF3, 0xFF, 0x80, 0x00, 0x3E, 0x01, 0xF0, 0x79, 0xC3, 0xC7, 0xC0,
    	0x00, 0x7F, 0x03, 0xF8, 0x7B, 0x87, 0x83, 0xC0, 0x00, 0x7F, 0x03, 0xF8, 0x7F, 0x07, 0x83, 0xE0,
    	0x00, 0x7F, 0x87, 0xF8, 0x7F, 0x07, 0x81, 0xE0, 0x00, 0xFF, 0x87, 0xFC, 0x7F, 0x87, 0x81, 0xE0,
    	0x00, 0xFF, 0x87, 0xFC, 0x7F, 0xC7, 0x83, 0xC0, 0x00, 0xE7, 0xCE, 0x3E, 0x7B, 0xE7, 0xC3, 0xC0,
    	0x01, 0xE7, 0xEF, 0x3F, 0xFF, 0xF3, 0xE7, 0x80, 0x03, 0xFF, 0xFF, 0x7F, 0xFF, 0xF9, 0xFF, 0x00,
    	0x03, 0xF7, 0xFF, 0x7F, 0xFF, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    
    //功能:送1位数据到液晶显示控制器
    void trans_bit(bit d)
    {
    	STD = d;                          //先送数据到数据口线DI
    	_nop_();
    	SCLK = 1;                         //再使时钟口线发一个负脉冲
    	_nop_();
    	SCLK = 0;
    	_nop_();
    	SCLK = 1;
    }
    //功能:送1字节数据到液晶显示控制器
    void trans_byte(unsigned char d)
    {
    	unsigned char i;
    
    	for(i = 0; i < 8; i++) {
    		if((d & 0x80) == 0x80)
    			trans_bit(1);
    		else
    			trans_bit(0);
    
    		d <<= 1;         //从高到低位送字节位数据到液晶显示控制器
    	}
    }
    //功能:向液晶显示控制器写图形数据
    void lcd_wd(unsigned char d) 
    {
    	CS = 1;                           //片选使能
    	trans_byte(0xFA);                     //SYNCODE=0F8H,RW=0,RS=1,D0=0
    	trans_byte(d & 0xF0);                 //送高四位数据,低四位补零
    	trans_byte((d & 0x0F) << 4);          //送低四位数据
    	CS = 0;                           //片选禁止
    }
    //功能:向液晶显示控制器送指令
    void lcd_wc(unsigned char c)             //向液晶显示控制器送指令
    {
    	CS = 1;                           //片选使能
    	trans_byte(0xF8);                     //SYNCODE=0F8H,RW=0,RS=0,D0=0
    	trans_byte(c & 0xF0);                 //送高四位数据,低四位补零
    	trans_byte((c & 0x0F) << 4);          //送低四位数据
    	CS = 0;                           //片选禁止
    }
    //功能:开启LCD显示
    void lcd_on(void)                        //LCD显示开启子程序
    {
    	lcd_wc(0x30);                        //设置为基本指令集
    	lcd_wc(0x0c);
    }
    //功能:关闭LCD显示
    void lcd_off(void)                       //LCD显示关闭子程序
    {
    	lcd_wc(0x30);                        //设置为基本指令集
    	lcd_wc(0x08);
    }
    //功能:液晶显示控制器初始化
    void lcd_init(void)                     //液晶显示控制器初始化子程序
    {
    	lcd_wc(0x33);                        //接口模式设置,8位,基本指令集
    	Delay5ms();                         //延时3MS
    	lcd_wc(0x30);                        //基本指令集,8位控制口
    	Delay5ms();                         //延时3MS
    	lcd_wc(0x30);                        //重复送基本指令集
    	Delay5ms();                         //延时3MS
    	lcd_wc(0x01);                        //清屏控制字
    	Delay5ms();                         //延时3MS
    	lcd_on();                            //开显示
    }
    //功能:开启绘图区域显示
    void lcd_graph_on(void)                  //绘图区域显示开启子程序
    {
    	lcd_wc(0x36);							//扩充指令集,8位,开绘图
    	lcd_wc(0x30);                        //恢复为基本指令集
    }
    //功能:关闭绘图区域显示
    void lcd_graph_off(void)                  //绘图区域显示关闭子程序
    {
    	lcd_wc(0x34);							//扩充指令集,8位,关绘图
    	lcd_wc(0x30);                        //恢复为基本指令集
    }
    //功能:整屏显示 c 代表的ASCII字符
    void char_lcd_fill(unsigned char c) 
    {
    	unsigned char i;
    
    	if(c > 128) {
    		return;
    	}
    
    	lcd_wc(0x80);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    
    	lcd_wc(0x90);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    
    	lcd_wc(0x88);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    
    	lcd_wc(0x98);
    
    	for(i = 0; i < 16; i++) {
    		lcd_wd(c);
    	}
    }
    //功能:写字库自带的汉字、字符
    //字库自带的汉字为 16 * 16, 字符为 8 * 16
    //参数: x 横坐标 0-7
    //		y 纵坐标  1-4
    //		datas 需要写入的数据
    void lcd_write_font(unsigned char x, unsigned char y, unsigned char *datas)
    {
    	if(y > 4) {
    		return;
    	}
    
    	if(x > 7) {
    		return;
    	}
    
    	switch(y) { //定位第几行第几列开始写汉字
    		case 1 :
    			lcd_wc(0x80 + x);
    			break;
    
    		case 2 :
    			lcd_wc(0x90 + x);
    			break;
    
    		case 3 :
    			lcd_wc(0x88 + x);
    			break;
    
    		case 4 :
    			lcd_wc(0x98 + x);
    			break;
    	}
    
    	while(*datas != '\0') {
    		lcd_wd(*datas++);//写入汉字
    	}
    }
    
    //功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
    void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
    {
    	lcd_wc(0x36);                        //扩展指令集,8位,开绘图
    
    	if(GYPOS >= 32) {
    		lcd_wc((GYPOS - 32) + 0x80);	//下半屏,先送Y地址
    		lcd_wc((GXPOS / 16) + 0x88);	//下半屏,再送X地址
    
    	} else {
    		lcd_wc(GYPOS + 0x80);		//上半屏
    		lcd_wc((GXPOS / 16) + 0x80);	//上半屏
    	}
    
    	lcd_wc(0x30);                        //恢复为基本指令集
    }
    
    //功能:清除绘图区域
    void g_lcd_fill()
    {
    	unsigned char i, j;
    
    	for(i = 0; i < 64; i++) {
    		g_lcd_pos(0, i);
    
    		for(j = 0; j < 16; j++) {
    			lcd_wd(0x00);
    		}
    	}
    }
    
    //功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
    void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
    {
    	unsigned char lx, ly;
    
    	for(ly = 0; ly < YSIZE; ly++) {
    		g_lcd_pos(GXPOS, GYPOS);	//设置地址
    
    		for(lx = 0; lx < XSIZE; lx += 8) {
    			lcd_wd(*s);
    			s++;
    		}
    
    		GYPOS++;	//换行
    	}
    }
    
    void main()
    {
    	BK = 1;				//开背光
    
    	Delay500ms();//等待上电稳定
    	
    	DATA_PORT = 0x00;
    	PSB = 0;			//串口
    	
    	lcd_init();
    	
    	char_lcd_fill('A');
    	Delay500ms();
    	Delay500ms();
    	Delay500ms();
    	Delay500ms();
    	char_lcd_fill(' ');
    
    	while(1) {
    		lcd_graph_on();		//开启图形
    		g_lcd_fill();		//图形区域清零
    		put_size_image(0, 0, 128, 64, images);
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		g_lcd_fill();
    		put_size_image(0, 32, 64, 32, images2);
    		put_size_image(64, 32, 64, 32, images2);
    		put_size_image(0, 0, 64, 32, images2);
    		put_size_image(64, 0, 64, 32, images2);
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		g_lcd_fill();
    		lcd_graph_off();	//关闭图形
    		lcd_write_font(0, 1, "我真的很爱中国!");
    		lcd_write_font(0, 2, "我真的很爱中国!");
    		lcd_write_font(0, 3, "我真的很爱中国!");
    		lcd_write_font(0, 4, "我真的很爱中国!");
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		char_lcd_fill(' ');
    	}
    }
    

    3、LCD12232并行接口

    //-------------------------------------------------------------------------------
    //创建日期: 2021.02.02
    //软件环境: Keil
    //硬件环境: STC15W408AS		
    //IRC频率:  11.0592MHz
    //创建人: Calvin Chan
    //-------------------------------------------------------------------------------
    #include <reg51.h>
    #include <intrins.h>
    
    #ifndef uchar
    	#define uchar unsigned char
    #endif
    #ifndef uint
    	#define uint  unsigned int
    #endif
    
    #define DATA_PORT	P1
    
    #define WRITE_CMD	1	//写命令
    #define WRITE_DATA	0	//写数据
    
    sbit RS = P3 ^ 5;
    sbit RW = P3 ^ 6;
    sbit EN = P3 ^ 7;
    
    sbit RST = P3 ^ 3;	//复位
    
    sbit BK = P3 ^ 2;	//背光开关
    
    unsigned char code images[] = { //122*32
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE0, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x1E, 0x1C, 0x3F, 0x83, 0x9F, 0xF8, 0x7F, 0xE3, 0x81, 0xFF, 0xFC, 0x0E, 0x00, 0x00, 0x00,
    	0x00, 0x1E, 0x3C, 0x3F, 0xC7, 0x9F, 0xFC, 0x7F, 0xF3, 0xC1, 0xFF, 0xFC, 0x1E, 0x00, 0x00, 0x00,
    	0x00, 0x0E, 0x3E, 0x3B, 0xEF, 0x1F, 0xFC, 0x7F, 0xF3, 0xC1, 0xDF, 0xDC, 0x1E, 0x00, 0x00, 0x00,
    	0x00, 0x0E, 0x3E, 0x39, 0xEF, 0x1E, 0x1C, 0x78, 0x79, 0xC3, 0xC7, 0x1E, 0x1C, 0x00, 0x00, 0x00,
    	0x00, 0x0F, 0x3E, 0x78, 0xFE, 0x1C, 0x1C, 0x78, 0x79, 0xE3, 0x87, 0x1E, 0x3C, 0x00, 0x00, 0x00,
    	0x00, 0x0F, 0x7F, 0x70, 0xFC, 0x1C, 0x1C, 0x70, 0x79, 0xE7, 0x87, 0x0F, 0x38, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0x77, 0x70, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xE7, 0x87, 0x0F, 0x78, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0x77, 0xF0, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xF7, 0x07, 0x07, 0x78, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0xF7, 0xE0, 0xFE, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xE3, 0xE1, 0xFF, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xE3, 0xE1, 0xEF, 0x1C, 0x1C, 0x70, 0x78, 0x7E, 0x07, 0x03, 0xF0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xE3, 0xE3, 0xC7, 0x9C, 0x1C, 0x70, 0x78, 0x3E, 0x07, 0x03, 0xE0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xC3, 0xC7, 0x87, 0x9C, 0x1C, 0x70, 0x78, 0x3C, 0x07, 0x01, 0xE0, 0x00, 0x00, 0x00,
    	0x00, 0x01, 0xC1, 0xC7, 0x83, 0x9C, 0x1C, 0x70, 0x38, 0x3C, 0x07, 0x03, 0xC0, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    
    //检测LCD是否忙
    void lcd_wait(void)
    {
    	uchar i;
    	DATA_PORT = 0xFF;
    	RS = 0;
    	RW = 1;
    	EN = 1;
    
    	for(i = 0; i < 20; i++)             //
    		if((DATA_PORT & 0x80) != 0x80)
    			break;  //D7=0 空闲退出
    
    	EN = 0;
    }
    //写数据/命令
    void lcd_write(uchar opra, uchar datas)
    {
    	lcd_wait();
    	DATA_PORT = datas;
    
    	if(opra == 1) {	//写命令
    		RS = 0;
    	} else {		//写数据
    		RS = 1;
    	}
    
    	RW = 0;
    	EN = 1;
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	EN = 0;
    }
    //从LCD读取数据
    uchar lcd_read_data(void)
    {
    	uchar datas;
    	lcd_wait();
    	RS = 0;
    	RW = 1;
    	EN = 1;
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	_nop_();
    	datas = DATA_PORT;
    	EN = 0;
    	return datas;
    }
    
    //开启LCD显示
    void lcdon(void)
    {
    	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
    	lcd_write(WRITE_CMD, 0x0c);
    }
    //关闭LCD显示
    void lcdoff(void)                       //LCD显示关闭子程序
    {
    	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
    	lcd_write(WRITE_CMD, 0x08);
    }
    
    //LCD初始化
    void lcd_init(void)
    {
    	lcd_write(WRITE_CMD, 0x33);		//发送基本指令集
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x0C);		//开显示,关游标,关游标位置反白
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x01);		//清屏
    	Delay5ms();
    	lcdon();
    }
    
    //字符操作区域
    //12232ZB字符区域定义为:
    //XPOS(0-15) 对应于第1列到第16列位置,每个字符列位置实际占位8点,总计对应128点
    //由于显示只有122点,所以最后的6点不能显示出来.
    //YPOS(0-1)对应于第1行到第2行,每个行位置实际占位16点,总计对应32点
    void lcd_write_ddram(uchar x, uchar y, uchar *datas)
    {
    	if(x > 15) {
    		return;
    	}
    
    	if(y > 1) {
    		return;
    	}
    
    	if(y == 0) {
    		lcd_write(WRITE_CMD, 0x80 + x);
    	} else {
    		lcd_write(WRITE_CMD, 0x90 + x);
    	}
    
    	while(*datas != '\0') {
    		lcd_write(WRITE_DATA, *datas++);
    	}
    
    }
    
    //功能:整屏显示 c 代表的ASCII字符
    void char_lcd_fill(unsigned char c) 
    {
    	uchar x, y;
    
    	for(y = 0; y < 2; y++) {
    		if(y == 0) {
    			lcd_write(WRITE_CMD, 0x80);
    		} else {
    			lcd_write(WRITE_CMD, 0x90);
    		}
    
    		for(x = 0; x < 15; x++) {
    			lcd_write(WRITE_DATA, c);
    		}
    	}
    }
    
    //功能:开启绘图区域显示
    void lcd_graph_on(void)
    {
    	lcd_write(WRITE_CMD, 0x36);							//扩充指令集,8位,开绘图
    	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
    }
    //功能:关闭绘图区域显示
    void lcd_graph_off(void)                  //绘图区域显示关闭子程序
    {
    	lcd_write(WRITE_CMD, 0x34);							//扩充指令集,8位,关绘图
    	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
    }
    
    //功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
    void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
    {
    	lcd_write(WRITE_CMD, 0x36);                       //扩展指令集,8位,开绘图
    	lcd_write(WRITE_CMD, (GYPOS + 0x80));		//Y
    	lcd_write(WRITE_CMD, ((GXPOS / 16) | 0x80));//X
    	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
    }
    
    //功能:清除图形区域
    void g_lcd_fill()
    {
    	unsigned char i, j;
    
    	for(i = 0; i < 32; i++) {
    		g_lcd_pos(0, i);
    
    		for(j = 0; j < 16; j++) {
    			lcd_write(WRITE_DATA, 0x00);
    		}
    	}
    }
    
    //功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
    void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
    {
    	unsigned char lx, ly;
    
    	for(ly = 0; ly < YSIZE; ly++) {
    		g_lcd_pos(GXPOS, GYPOS);	//设置地址
    
    		for(lx = 0; lx < XSIZE; lx += 8) {
    			lcd_write(WRITE_DATA, *s);
    			s++;
    		}
    
    		GYPOS++;	//换行
    	}
    }
    void main()
    {
    	BK = 1;
    
    	Delay500ms();//等待上电稳定
    	lcd_init();
    	
    	while(1) {
    		lcd_write_ddram(0, 0, "我爱中国真的爱 ");
    		lcd_write_ddram(0, 1, "我爱中国真的爱 ");
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		char_lcd_fill(' ');
    		lcd_write_ddram(0, 0, "ABCDEFGHIJKLMO");
    		lcd_write_ddram(0, 1, "PQRSTUVWXYZabc");
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		char_lcd_fill(' ');
    		lcd_graph_on();
    		g_lcd_fill();
    		put_size_image(0, 0, 122, 32, images);
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		lcd_graph_off();
    	}
    }
    

    4、LCD12232串行接口

    //-------------------------------------------------------------------------------
    //创建日期: 2021.02.02
    //软件环境: Keil
    //硬件环境: STC15W408AS		
    //IRC频率:  11.0592MHz
    //创建人: Calvin Chan
    //-------------------------------------------------------------------------------
    #include <reg51.h>
    #include <intrins.h>
    
    #ifndef uchar
    	#define uchar unsigned char
    #endif
    #ifndef uint
    	#define uint  unsigned int
    #endif
    
    #define DATA_PORT	P1
    
    #define WRITE_CMD	1	//写命令
    #define WRITE_DATA	0	//写数据
    
    sbit CS   = P3 ^ 5;
    sbit STD  = P3 ^ 6;
    sbit SCLK = P3 ^ 7;
    
    sbit RST = P3 ^ 3;	//复位
    
    sbit BK = P3 ^ 2;	//背光开关
    
    unsigned char code images[] = { //122*32
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE0, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x1E, 0x1C, 0x3F, 0x83, 0x9F, 0xF8, 0x7F, 0xE3, 0x81, 0xFF, 0xFC, 0x0E, 0x00, 0x00, 0x00,
    	0x00, 0x1E, 0x3C, 0x3F, 0xC7, 0x9F, 0xFC, 0x7F, 0xF3, 0xC1, 0xFF, 0xFC, 0x1E, 0x00, 0x00, 0x00,
    	0x00, 0x0E, 0x3E, 0x3B, 0xEF, 0x1F, 0xFC, 0x7F, 0xF3, 0xC1, 0xDF, 0xDC, 0x1E, 0x00, 0x00, 0x00,
    	0x00, 0x0E, 0x3E, 0x39, 0xEF, 0x1E, 0x1C, 0x78, 0x79, 0xC3, 0xC7, 0x1E, 0x1C, 0x00, 0x00, 0x00,
    	0x00, 0x0F, 0x3E, 0x78, 0xFE, 0x1C, 0x1C, 0x78, 0x79, 0xE3, 0x87, 0x1E, 0x3C, 0x00, 0x00, 0x00,
    	0x00, 0x0F, 0x7F, 0x70, 0xFC, 0x1C, 0x1C, 0x70, 0x79, 0xE7, 0x87, 0x0F, 0x38, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0x77, 0x70, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xE7, 0x87, 0x0F, 0x78, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0x77, 0xF0, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xF7, 0x07, 0x07, 0x78, 0x00, 0x00, 0x00,
    	0x00, 0x07, 0xF7, 0xE0, 0xFE, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xE3, 0xE1, 0xFF, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xE3, 0xE1, 0xEF, 0x1C, 0x1C, 0x70, 0x78, 0x7E, 0x07, 0x03, 0xF0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xE3, 0xE3, 0xC7, 0x9C, 0x1C, 0x70, 0x78, 0x3E, 0x07, 0x03, 0xE0, 0x00, 0x00, 0x00,
    	0x00, 0x03, 0xC3, 0xC7, 0x87, 0x9C, 0x1C, 0x70, 0x78, 0x3C, 0x07, 0x01, 0xE0, 0x00, 0x00, 0x00,
    	0x00, 0x01, 0xC1, 0xC7, 0x83, 0x9C, 0x1C, 0x70, 0x38, 0x3C, 0x07, 0x03, 0xC0, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    
    //功能:送1位数据到液晶显示控制器
    void trans_bit(bit d)
    {
    	STD = d;                          //先送数据到数据口线DI
    	_nop_();
    	SCLK = 1;                         //再使时钟口线发一个负脉冲
    	_nop_();
    	SCLK = 0;
    	_nop_();
    	SCLK = 1;
    }
    //功能:送1字节数据到液晶显示控制器
    void trans_byte(unsigned char d)
    {
    	unsigned char i;
    
    	for(i = 0; i < 8; i++) {
    		if((d & 0x80) == 0x80)
    			trans_bit(1);
    		else
    			trans_bit(0);
    
    		d <<= 1;                        //从高到低位送字节位数据到液晶显示控制器
    	}
    }
    //功能:向液晶显示控制器写图形数据
    void lcd_wd(unsigned char d)
    {
    	CS = 1;                           //片选使能
    	trans_byte(0xFA);                     //SYNCODE=0F8H,RW=0,RS=1,D0=0
    	trans_byte(d & 0xF0);                 //送高四位数据,低四位补零
    	trans_byte((d & 0x0F) << 4);          //送低四位数据
    	CS = 0;                           //片选禁止
    }
    //功能:向液晶显示控制器送指令
    void lcd_wc(unsigned char c)
    {
    	CS = 1;                           //片选使能
    	trans_byte(0xF8);                     //SYNCODE=0F8H,RW=0,RS=0,D0=0
    	trans_byte(c & 0xF0);                 //送高四位数据,低四位补零
    	trans_byte((c & 0x0F) << 4);          //送低四位数据
    	CS = 0;                           //片选禁止
    }
    
    //写数据/命令
    void lcd_write(uchar opra, uchar datas)
    {
    	if(opra == 1) {	//写命令
    		lcd_wc(datas);
    	} else {		//写数据
    		lcd_wd(datas);
    	}
    }
    
    //开启LCD显示
    void lcdon(void)
    {
    	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
    	lcd_write(WRITE_CMD, 0x0c);
    }
    //关闭LCD显示
    void lcdoff(void)                       //LCD显示关闭子程序
    {
    	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
    	lcd_write(WRITE_CMD, 0x08);
    }
    
    //LCD初始化
    void lcd_init(void)
    {
    	lcd_write(WRITE_CMD, 0x33);		//发送基本指令集
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x0C);		//开显示,关游标,关游标位置反白
    	Delay5ms();
    	lcd_write(WRITE_CMD, 0x01);		//清屏
    	Delay5ms();
    	lcdon();
    }
    
    //字符操作区域
    //12232ZB字符区域定义为:
    //XPOS(0-15) 对应于第1列到第16列位置,每个字符列位置实际占位8点,总计对应128点
    //由于显示只有122点,所以最后的6点不能显示出来.
    //YPOS(0-1)对应于第1行到第2行,每个行位置实际占位16点,总计对应32点
    void lcd_write_ddram(uchar x, uchar y, uchar *datas)
    {
    	if(x > 15) {
    		return;
    	}
    
    	if(y > 1) {
    		return;
    	}
    
    	if(y == 0) {
    		lcd_write(WRITE_CMD, 0x80 + x);
    	} else {
    		lcd_write(WRITE_CMD, 0x90 + x);
    	}
    
    	while(*datas != '\0') {
    		lcd_write(WRITE_DATA, *datas++);
    	}
    
    }
    
    //功能:整屏显示 c 代表的ASCII字符
    void char_lcd_fill(unsigned char c) 
    {
    	uchar x, y;
    
    	for(y = 0; y < 2; y++) {
    		if(y == 0) {
    			lcd_write(WRITE_CMD, 0x80);
    		} else {
    			lcd_write(WRITE_CMD, 0x90);
    		}
    
    		for(x = 0; x < 15; x++) {
    			lcd_write(WRITE_DATA, c);
    		}
    	}
    }
    
    //功能:开启绘图区域显示
    void lcd_graph_on(void)
    {
    	lcd_write(WRITE_CMD, 0x36);							//扩充指令集,8位,开绘图
    	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
    }
    //功能:关闭绘图区域显示
    void lcd_graph_off(void)                  //绘图区域显示关闭子程序
    {
    	lcd_write(WRITE_CMD, 0x34);							//扩充指令集,8位,关绘图
    	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
    }
    
    //功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
    void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
    {
    	lcd_write(WRITE_CMD, 0x36);                       //扩展指令集,8位,开绘图
    	lcd_write(WRITE_CMD, (GYPOS + 0x80));		//Y
    	lcd_write(WRITE_CMD, ((GXPOS / 16) | 0x80));//X
    	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
    }
    
    //功能:清除图形区域
    void g_lcd_fill()
    {
    	unsigned char i, j;
    
    	for(i = 0; i < 32; i++) {
    		g_lcd_pos(0, i);
    
    		for(j = 0; j < 16; j++) {
    			lcd_write(WRITE_DATA, 0x00);
    		}
    	}
    }
    
    //功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
    void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
    {
    	unsigned char lx, ly;
    
    	for(ly = 0; ly < YSIZE; ly++) {
    		g_lcd_pos(GXPOS, GYPOS);	//设置地址
    
    		for(lx = 0; lx < XSIZE; lx += 8) {
    			lcd_write(WRITE_DATA, *s);
    			s++;
    		}
    
    		GYPOS++;	//换行
    	}
    }
    void main()
    {
    	DATA_PORT = 0x00;
    	BK = 1;
    
    	Delay500ms();//等待上电稳定
    	lcd_init();
    
    	while(1) {
    		lcd_write_ddram(0, 0, "中国牛批666666");
    		lcd_write_ddram(0, 1, "中国牛批666666");
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		char_lcd_fill(' ');
    		lcd_write_ddram(0, 0, "ABCDEFGHIJKLMO");
    		lcd_write_ddram(0, 1, "PQRSTUVWXYZabc");
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		char_lcd_fill(' ');
    		lcd_graph_on();
    		g_lcd_fill();
    		put_size_image(0, 0, 122, 32, images);
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		Delay500ms();
    		lcd_graph_off();
    	}
    }
    
    展开全文
  • lcd1602液晶屏并行IO口转串行,结合74hc595实现三线控制液晶屏的目的,节省IO资源
  • 1622段码液晶屏C代码

    2019-03-15 17:21:42
    1622段码液晶屏C代码,msp430x16x // 串行接口复位脉冲宽度,典型值 tcs = 250 ns // Setup Time for CS to WR,RD Clock Width,典型值 tsu1 = 100 ns // Hold Time for CS to WR,RD Clock Width,典型值 th1 = ...
  • LCD12864液晶显示屏串行方式驱动详解

    万次阅读 2013-05-04 22:19:03
    市面上的LCD12864显示有很多种其中粗了分有带字库的和不带字库的,带字库的LCD因其自身带有各种字型ROM特别适合小存储微处理器使用。带字库LCD显示因其控制器不同又可以分为好几种,本文要介绍的金鹏电子生产的...

    市面上的LCD12864显示屏有很多种其中粗了分有带字库的和不带字库的,带字库的LCD因其自身带有各种字型ROM特别适合小存储微处理器使用。带字库LCD显示屏因其控制器不同又可以分为好几种,本文要介绍的金鹏电子生产的OCMJ4X8C_3型12864LCD显示屏是基于ST7920控制器,所以只要是该控制器驱动的显示屏大体使用是一样的。从金鹏电子官方下载OCMJ4X8C_3型LCD的技术资料,主要包括如下内容:

    其中『C系列中文机内码表』主要包含该型号显示屏ROM中所包含的汉字及字符编码表;『演示程序』文件夹中为官方提供的51单片机显示程序,这个很重要,要知道有时候当说明书讲的似懂非懂时一段代码就把一切都给说清道明了,谁要写说明书的那家伙是工科男呢——说得很少,做的很好,我们总是不善于表达;剩下的pdf文件就是说明书了(废话,我不是文盲!),但是你不能指望你所遇到的每一个问题都能从说明书中得到解答,正如上面所说琢磨演示程序的代码有时候来到更透彻,同时别忘了反复的实验,因为实践是检验真理的唯一标准。

    引脚说明:

    引脚

    名称

    说明

    引脚

    名称

    说明

    1

    VSS

    GND (0V)

    11

    DB4

    数据4

    2

    VDD

    Supply Voltage for logic (+5V)

    12

    DB5

    数据5

    3

    NC

    悬空

    13

    DB6

    数据6

    4

    RS(CS)

    H:Data  L:Instruction Code (Chip enable for serial mode)

    14

    DB7

    数据7

    5

    R/W(STD)

    H:Read  L:Write (serial data for serial mode)

    15

    PSB

    H:Parallel Mode  L:Serial Mode

    6

    E(SCLK)

    Enable Signal.高电平有效 (serial clock)

    16

    NC

     

    7

    DB0

    数据0

    17

    /RST

    复位信号,低电平有效

    8

    DB1

    数据1

    18、19

    保留

     

    9

    DB2

    数据2

    20

    LEDA

    背光电源正极(+5V)

    10

    DB3

    数据3

    21

    LEDK

    背光负电源(0V)

    注:括号中的标识为串行通信标识。

     

    串行通信:

    ①    引脚定义描述

    VSS:液晶显示地(GND)。

    VDD:液晶显示电源(+5V)。

    CS:片选,使能信号,该引脚为高读写才能成功。

    STD:数据信号。

    SCLK:同步时钟信号,上升沿有效。

    PSB:并口/串口选择信号。高电平定义为并口,低电平定义为串口通信。

    /RST:复位信号,低电平有效。

    LEDA:背光电源正。

    LEDK:背光电源负。

    ② 通讯协议分析

    当PSB脚接低电位时,LCD模块将进入串行传输模式。串行通信主要用到CS、SCLK、STD 三根线来实现,其中CS为片选使能,SCLK为同步时钟信号,STD为传输的数据信号。从一个完整的串行传输流程来看,一开始先传输启始字节,根据定义启始字节前五位为“同步位”字符串(五个连续的“1”),此时传输计数将被重置并且串行传输将被同步,再跟随的两个位字符串(第六、第七位)分别指定传输方向位(RW)及寄存器选择位(RS),最后第八位则为“0”。再接收到包含同步位及RW和RS资料的启始字节后,每一个八位的指令(数据)将被分为两个字节发送接收:高4位(DB7~DB4)的数据将会被放在第一个字节的LSB部分,而低4位(DB3~DB0)的数据会被放在第二个字节的LSB部分,至于相关的另四位则以“0”填充。

    串行通信时序图

    总结:因为串行通信的数据是以位为单位进行传输,所以只要在每位数据的传输过程中适当的添加一段延时基本上就能保证数据收发成功。至于实践代码完全可以借鉴官方PDF说明书中51程序。

    ③    关于整行反白显示

    ST7920手册中提到扩展功能中有一个反白指令,对于4行LCD这个指令实为鸡肋,为什么这么说?!请看手册关于这条指令的描述:

    功能:选择4行中的任一行作反白显示,并可决定反白与否。

    注:4X8C/_3/_6的一、三行为反白选择的第一行,二、四行为反白选择的第二行。”,看到没,只能两奇数或偶数行同时反白,所以,要实现单独行反白还得靠自己动手。在官方提供的51演示程序中有一段关于两个字的反白代码,片段如下:

    *-----------------------------------------------*/

    //当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
    
    //使用:con_disp(0xff,0xff,0x8c,0x80,2,16);
    
    voidcon_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
    
    {
    
      uchar i,j;
    
      for(j=0;j<yl;j++)
    
      {
    
        for(i=0;i<xl;i++)
    
        {
    
          wr_lcd (comm,0x34);
    
          wr_lcd (comm,y0+j);
    
          wr_lcd (comm,x0+i);
    
          wr_lcd (comm,0x30);
    
          wr_lcd (dat,data1);
    
          wr_lcd (dat,data2);
    
        }
    
      }
    
      wr_lcd (comm,0x36);
    
    }


      分析总结:开扩展功能(指令:0x34),往CGROM中写入地址y,x,回到基本指令功能(0x30),写0xFF反白,写0x00清除反白,最后开图形显示(0x36)。

    并行通讯

    展开全文
  • 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128&TImes;64,内置8192个16*16点汉字,和128个16*8点ASCII字符集...
  •  1.1 EDM1190A的特点 EDM1190A段码式液晶显示器模块由LCD液晶显示器、驱动电路、8位CPU接口电路构成。他具有低功耗、抗干扰性强、温度范围宽等优点;此外,EDM1190A的输入接口信号可与CMOS和TTL电平兼容,而且他...
  • 液晶显示接口汇总

    万次阅读 2018-08-15 12:41:21
    以R,G,B三色数据传输,按传输方式可分为串行(serial)与并行(parallel)两种,一般为TTL(3.3V)电平,需要同步信号,传输距离较短,抗干扰性不强。 SERIAL RGB: 分辨率支持:800 * 480 时钟频率支持:800...

    参考:LCD主流显示接口介绍
    RGB接口
    以R,G,B三色数据传输,按传输方式可分为串行(serial)与并行(parallel)两种,一般为TTL(3.3V)电平,需要同步信号,传输距离较短,抗干扰性不强。

    这里写图片描述

    SERIAL RGB:
    这里写图片描述

    分辨率支持:800 * 480
    时钟频率支持:800*3*480*60*1.2 = 83MHZ
    PARALLEL RGB:
    这里写图片描述

    分辨率支持:1920 * 1080
    时钟频率支持:1920*1080*60*1.2 = 149MHZ

    LVDS接口
    LVDS,即Low Voltage Differential Signaling,是一种低压差分信号技术接口如图。它是美国NS公司为克服以TTL电平方式传输宽带高码率数据时功耗大、EMI电磁干扰大等缺点而研制的一种数字视频信号传输方式。 LVDS输出接口利用非常低的电压摆幅(约350mV)在两条PCB走线或一对平衡电缆上通过差分进行数据的传 输,即低压差分信号传输。采用LVDS输出接口,可以使得信号在差分PCB线或平衡电缆上以几百Mbit/s的速率 传输,由于采用低压和低电流驱动方式,因此实现了低噪声和低功耗。传输速率可以达到几百兆bps,功耗低,抗干扰性好。

    这里写图片描述

    差分信号示意图

    一般有以下几种接口类型:
    a. 6位LVDS输出接口
    这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或 18bit LVDS接口。
    b. 双路6位LVDS输出接口
    这种接口电路中,采用双路方式传输,每个基色信号采用6位数据,其中奇路数据为18位,偶路数据为18位, 共36位RGB数据,因此,也称36位或36bit LVDS接口。
    c. 单路8位LVDS输出接口
    这种接口电路中,采用单路方式传输,每个基色信号采用8位数据,共24位RGB数据,因此,也称24位或 24bit LVDS接口。
    d. 双路8位LVDS输出接口
    这种接口电路中,采用双路方式传输,每个基色信号采用8位数据,其中奇路数据为24位,偶路数据为24位, 共48位RGB数据,因此,也称48位或48bit LVDS接口。
    a. 单路:1280*800@60
    1366*768@60
    b. 双路:1920*1080@
    这里写图片描述

    MIPI接口
    MIPI联盟定义了一套接口标准,把移动设备内部的接口如摄像头、显示屏、基带、射频接口等标准化,从而增加设计灵活性,同时降低成本、设计复杂度、功耗和EMI,应用于显示屏的协议称为DSI,传输速度较快,可达1Gbps/Lane,支持4Lane4Gbps吞吐量。采用低压差分信号传输,功耗低,抗干扰性好。
    这里写图片描述

    HDMI接口
    High-Definition Multimedia Interface可同时传输非压缩视频数据和压缩/非压缩的数字音频数据
    这里写图片描述

    这里写图片描述

    这里写图片描述

    展开全文
  • 液晶屏为JM12864或FYD12864(带字库),我用这两种型号的屏没问题, 4行*8列汉字=32 串行通信 接/口P1.5--P1.7,可根据你的电路修改相应的接口。
  • 12864液晶屏程序详解

    2013-11-23 22:44:59
    10-12864液晶(带字库)的三种显示方式 12864串行驱动演示,12864图文显示测试,12864中文显示测试程序 带详细注释
  • 该方案是在现有点阵式液晶显示上附加一个MCU,通过程序设计利用MCU的I/O端口去模拟I2C串行总线,从而实现利用MCU去控制LCD的目的;同时介绍一种在图符液晶显示系统中显示动态曲线的技术和实现方法。 关键词:液晶...
  • 链接:https://pan.baidu.com/s/1gvVN5re0I2gu2LPP2I9njA 提取码:jkz9 复制这段内容后打开百度网盘手机App,操作更方便哦
  • 虽然硬件电路都搭好了,但没法调试也就意味着不知道程序编写是否有问题,所以就想着在protues上把硬件电路搭起来调试程序,因为单片机用的是stc的所以protues中直接用AT的就行了,但是到了12864液晶屏这部分就犯难了...
  • nokia5110液晶屏中文说明手册

    热门讨论 2008-12-30 16:26:26
    nokia5110液晶屏中文说明手册 PCD8544是一块低功耗的CMOS LCD控制驱动器,设计为驱动48行84列的图形显示。所有必须的显示功能集成在一块芯片上,包括LCD电压及偏置电压发生器,只须很少外部元件且功耗小。 PCD8544...
  • 12864液晶串行操作 程序代码分为12864.c文件、12864.h头文件、main.c文件,3个文件程序代码如下 (1)lcd12864.c文件程序代码 #include"lcd12864.h" #include"reg52.h" #define uchar unsigned char #define uint ...
  • 七段式液晶显示器在超低市场非常受欢迎 电力计量和潜水应用,如热成本分配器、水和热量表,通常由专用的片上液晶显示器控制单片机中的控制器模块。此设计显示可供选择的、正在申请专利的解决方案任何没有这种片上...
  • MCU驱动和RGB驱动的液晶屏的区别

    千次阅读 2020-03-27 15:33:56
    彩色TFT液晶屏主要有2种接口:TTL接口(RGB颜色接口), LVDS接口(将RGB颜色打包成差分信号传输)。TTL接口主要用于12.1寸一下的小尺寸TFT屏,LVDS接口主要用于8寸以上的大尺寸TFT屏。TTL接口线多,传输距离短;LVDS...
  • nbspC/C++资料[手把手教你学51单片机C语言教程]22 LCD12864液晶屏显示.pdf11页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接...
  • STM32F103点亮6800时序12864点阵液晶屏

    千次阅读 2020-01-06 13:26:02
    STM32F103成功点亮12864点阵液晶屏前言攻克STM32技术手册攻克12864液晶屏硬件操作基础(1)片选信号合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的...
  •  在现代工业控制中,常用的人机接口界面依然采用的是键盘和液晶相结合的方式,要让触摸取代以前的人机接口界面,还存在一定的问题。在实际应用中,触摸一般是针对可编程控制器PLC 设计的,所以DSP 与触摸不能...
  • 本程序是为12864串行操作而写。 文件是经测试通过的Keil 51 UV2工程文件。
  • 该设计是基于小脚丫FPGA开发板和Nokia5110液晶屏的简单数字时钟,可以方便的调节时间,这里提供详细的设计框图、硬件连接、和设计源码,如果自己有兴趣还可以在此基础上添加日历、定时、秒表等功能。 数字时钟功能...
  •  在现代工业控制中,最常用的人机接口界面依然采用的是键盘和液晶相结合的方式,要让触摸取代以前的人机接口界面,还存在一定的问题。在实际应用中,触摸一般是针对可编程控制器PLC设计的,所以DSP与触摸不能...
  • lvds液晶屏幕接口详细讲解

    千次阅读 2020-12-22 02:18:59
    ..........1.LVDS输出接口概述液晶显示器驱动板输出的数字信号中,除了包括RGB数据信号外,还包括行同步、场同步、像素时钟等信号,其中像素时钟信号的最高频率可超过28MHz。采用TTL接口,数据传输速率不高,传输...
  • 摘要:VC/C++源码,其它分类,1602液晶控制,单片机源码 1602液晶屏LED控制,C单片机源码,包括有1602LCD串行方式显示、1602LCD计数显示实验、1602LCD简单时钟显示实验、1602LCD显示字符A、1602从右到左移动显示字符...
  • 晶联讯电子专注于液晶屏及液晶模块的研发、制造。所生产JLX12864C-1 型液晶模块由于使用 方便、带中文字库、显示清晰,广泛应用于各种人机交流面板。 JLX12864C-1液晶显示模块是128×64 点阵的汉字图形型液晶显示...
  • LCD液晶屏显示接口总结

    千次阅读 2020-07-24 09:25:45
    这种多数为串行总线接口,时序比较简单 大家参考数据手册去调试不会有太大的麻烦 本文只针对于常用的这4个接口特性进行解析 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的...
  • 液晶屏接口协议 MIPI LVDS 概览

    千次阅读 2019-05-06 17:00:01
    MIPI: MIPI接口简介  MIPI(移动行业处理器接口)是MobileIndustryProcessorInterface的缩写。MIPI(移动行业处理器接口)是...MIPI联盟定义了一套接口标准,把移动设备内部的接口如摄像头、显示、基带、射...
  • lvds液晶屏幕接口详解

    2020-12-22 02:18:59
    1.LVDS输出接口概述液晶显示器驱动板输出的数字信号中,除了包括RGB数据信号外,还包括行同步、场同步、像素时钟等信号,其中像素时钟信号的最高频率可超过28MHz。采用TTL接口,数据传输速率不高,传输距离较短,且...
  • booth算法乘法器设计uart串行口输入模块 本文展示了一个串行方式输入,液晶屏显示为输出的基于FPGA的booth算法乘法器,下面以模块的方式对乘法器进行介绍 uart串行口输入模块

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,653
精华内容 1,461
关键字:

串行液晶屏