自制单片机之十五……可串行驱动LCD12864的应用

时间:2021-11-02 05:31:06

  在网上搜了一下,ST7920控制器的LCD产品可以提供8位,4位并行和串行接口可选,并行的控制接口的LCD较多,前面的贴子也介绍过,我们在这儿不说了,这儿我们讲的是串口控制LCD12864。

  买了块ST7920的LCD12864,型号是12864-1。这个价格好像比前面我买的那个并口的便宜些,52元。是不是显示效果要差些呢。

自制单片机之十五……可串行驱动LCD12864的应用

再来个背面照片:

自制单片机之十五……可串行驱动LCD12864的应用

买来后也就只有个管脚说明:(我只说串口的定义)
工作于串行模式时的引脚定义:
PIN1------------ GND  电源-, 一般接0V。 
PIN2------------VDD 电源+, 一般接5V。 
PIN3------------V0 对比度调整端。 
PIN4------------RS(CS),片选
PIN5------------R/W(SID),串行数据线
PIN6------------E(SCLK),串行时钟脉冲输入 
PIN7------------DB0,不连接
PIN8------------DB1,不连接 
PIN9------------DB2,不连接
PIN10-----------DB3,不连接 
PIN11-----------DB4,不连接 
PIN12-----------DB5,不连接 
PIN13-----------DB6,不连接 
PIN14-----------DB7,不连接
PIN15-----------PSB  并行:PSB=1,可以接VCC;  串行:PSB=0,一般接GND 
PIN16 ----------NC,不连接 
PIN17-----------RST,模块复位(低电平有效)
PIN18 ----------VEE,液晶驱动电压(或名Vout) 
PIN19 ----------LED+ ,背光 +,一般接5V。 
PIN20 ----------LED- ,背光 -,一般接GND。

在网上搜了关于ST7920的资料,跟据图上的接法串行驱动只要四根线和S52连接:

自制单片机之十五……可串行驱动LCD12864的应用

PIN5----SID 数据线
PIN6----SCLK 时钟脉冲线
PIN1----VSS(GND)接地
PIN2----VDD(Vcc)电源+5V

  我先试了背光,也就是第20脚接地,19脚通过电流表接电源+5V,测得背光电流为30mA,背光很亮。

自制单片机之十五……可串行驱动LCD12864的应用

下面还是要先讲原理,资料说起来是枯燥了点。但你不去理解它,是不可能让LCD正常工作的。

  先说说ST7920的LCD内部都有哪些资源。
1、ST7920 内部固化了8192 个16×16 点阵的中文字型在CGROM里。
2、固化有126 个16×8 点阵的西文字符在HCGROM里。
3、提供4个16×16点阵自造字符的存储空间CGRAM。
4、提供128×64的点阵绘图共1024个字节的存储空间GDRAM。
5、提供1个16×15点阵图标的存储空间IRAM(ICON RAM)。

  如何去把它们显示在LCD上呢。
1、作为字符显示,在控制器内有个供写入字符代码的缓存器DDRAM ,你只要将要显示的中文字符代码或西文字符代码写入DDRAM,硬件将依照编码自动从CGROM 中选择将要显示的字型显示再屏幕上。至于是显示西文字符还是中文字符,它会自动辨别的,这和我们PC上是一样的,字符代码也完全一样。

2、图形方式就是用指令直接将表示点阵信息的字节数据写入相应位置的GDRAM内,

具体的规则:
1、字符显示时,DDRAM地址与液晶屏的位置关系见下图:

自制单片机之十五……可串行驱动LCD12864的应用

这个图上可以看出,它的地址编排很怪,第一行到87H完了以后就跳到了第三行接着88H了,每二行也是一样的,很明显,有下面两行接在上面两行后面的迹像。如下图:

自制单片机之十五……可串行驱动LCD12864的应用

2、下面我们再来看看图形显示GDRAM地址和LCD屏位置的关系:

自制单片机之十五……可串行驱动LCD12864的应用

  上图我们可以看出ST7920的LCD12864在地址的排列上是分为上、下半屏来显示的,上半屏横向的列地址(X)是0-7(00h-07h),下半屏的列地址是8-15(08h-0fh)。而每个一地址都可写入两个字节的内容,它们是按高位在前低位在后排列的。垂直方向上的地址(Y)上半屏是0-31(00h-1fh),下半屏的Y地址仍是0-31(00h-1fh),可以看出,它的地址排列方式还是将下半屏接在上半屏后面的,因此这块LCD12864,虽然在点阵的物理排列上是128×64,但在地址排列上,它却是块256×32。

3、下面我们来介绍能够使用的指令?

自制单片机之十五……可串行驱动LCD12864的应用

自制单片机之十五……可串行驱动LCD12864的应用

下面我们来看看在串行模式下是如何进行控制的,见下图:

自制单片机之十五……可串行驱动LCD12864的应用

  由图可以看出,单片机与液晶模块之间传送1字节的数据共需24个时钟脉冲。首先,单片机要给出数据传输起始位,这里是以5个连续的“1”作数据起始位,如模块接收到连续的5个“1”,则内部传输被重置并且串行传输将被同步。紧接着,“RW”位用于选择数据的传输方向(读或写),“RS”位用于选择内部数据寄存器或指令寄存器,最后的第8位固定为“0”。在接收到起始位及“RW”和“RS”的第1个字节后,下一个字节的数据或指令将被分为2个字节来串行传送或接收。数据或指令的高4位,被放在第2个字节串行数据的高4位,其低4位则置为“0”;数据或指令的低4位被放在第3个字节的高4位,其低4位也置为“0”,如此完成一个字节指令或数据的传送。需要注意的是,当有多个数据或指令要传送时,必须要等到一个指令完成执行完毕后再传送下一个指令或数据,否则,会造成指令或数据的丢失。这是因为液晶模块内部没有发送/接收缓冲区。

硬件电路连接:

1、LCD 驱动电压即对比度调节电路
  ST7920 内带倍压电路,生成2 倍于 VCC 的电压。倍压通过Vout 脚引出,引脚叫VEE,
通过电位器调节后,从V0 引回模块用来驱动LCD。直接驱动LCD 的是V0,
V0 电压越高,对比度越深。通过调节电位器来调节V0 值以改变对比度。
某些模块没有 Vout 脚。Vout 电压直接通过降压处理供给V0。对比度已经锁
定。如果一定要调节对比度,可以通过V0 对地接一可调电阻,拉低V0 值。

2、PSB 电路
PSB 接高时选择为并口方式操作,接低时选择串口方式进行操作,因此在这里我们将PSB接地。

3、RST电路
  复位电路是低电位有效,在正常操作时应为高电位,因此我们将它用10K电阻接至电源正极,并接一个0.1uF瓷片电容接至地,这是最典型的复位电路接法。

4、RS
  在作并口使用时RS的作用是选择进行数据操作还是命令操作,高电位为数据,低电位为命令。在当串行工作时是做片选CS使用的,高电位可接受数据,低电位锁存。因为我们只用一个LCD,所以将它接电源正,一直选通。

LCD的电路接法如下图:

自制单片机之十五……可串行驱动LCD12864的应用

仔细的把上图的电路连接好,LCD就可以点亮了,但此时还什么内容也不会显示。接下来就是程序篇了。

我先上点图,再写。。

自制单片机之十五……可串行驱动LCD12864的应用

2

自制单片机之十五……可串行驱动LCD12864的应用

3

自制单片机之十五……可串行驱动LCD12864的应用

4

自制单片机之十五……可串行驱动LCD12864的应用

5

自制单片机之十五……可串行驱动LCD12864的应用

6

自制单片机之十五……可串行驱动LCD12864的应用

我们先写一段简单的,就在屏上显示一排“AAAAAA”。看下面的程序:

/*************************************************
名    称:LCD12864_ST7920串行方式测试

连接方式: 串行方式连接
*************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

/*****LCD接口定义*****/
sbit SID = P1^0;      //串行数据
sbit SCLK = P1^1;     //串行同步时钟

/*****汉字地址表*****/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};

/*****n(ms)延时子程序*****/
void delayms(uint t)     //约延时n(ms)
{
uint i;
while(t--)
    {
     for(i=0;i<125;i++);
    }        
}

/*****串行发送一个字节*****/
void SendByte(uchar Dbyte)
{
     uchar i;
     for(i=0;i<8;i++)
     {
       SCLK = 0;
       Dbyte=Dbyte<<1;   //左移一位
       SID = CY;         //移出的位给SID
       SCLK = 1;
       SCLK = 0;
     }
}

/*****写指令*****/
void Lcd_WriteCmd(uchar Cbyte )
{
     delayms(1);//检测忙的子程序我们就不写了,因为串行的不支持读操作,我们就用个延时吧
     SendByte(0xf8);            //11111,RW(0),RS(0),0
     SendByte(0xf0&Cbyte);      //高四位
     SendByte(0xf0&Cbyte<<4);   //低四位(先执行<<)
}

/*****写数据*****/
void Lcd_WriteData(uchar Dbyte )
{
     delayms(1);
     SendByte(0xfa);            //11111,RW(0),RS(1),0
     SendByte(0xf0&Dbyte);      //高四位
     SendByte(0xf0&Dbyte<<4);   //低四位(先执行<<)
}

/*****初始化LCD*****/
void Lcd_Init(void)

delayms(50);
    Lcd_WriteCmd(0x30);        //选择基本指令集
delayms(1);
    Lcd_WriteCmd(0x30);        //选择8bit数据流
delayms(1);
    Lcd_WriteCmd(0x0c);        //开显示(无游标、不反白)
delayms(1);
    Lcd_WriteCmd(0x01);        //清除显示,并且设定地址指针为00H
delayms(30);
}

/*****显示汉字*****/
void hanzi_Disp(uchar x,uchar y,uchar code *s)

Lcd_WriteCmd(addr_tab[8*x+y]); //写地址
while(*s>0)
    { 
      Lcd_WriteData(*s);    //写数据
      s++;     
    }
}

/*****主函数*****/
void main(void)

    Lcd_Init();
    hanzi_Disp(1,2,"AAAAAA");// 就是在第二行第一列显示"AAAAAA"
while(1);
}

哈哈!百度网站被黑,害我好几天没能登上来,现在终于好了,继续。。

实际效果图:

自制单片机之十五……可串行驱动LCD12864的应用

整体图:

自制单片机之十五……可串行驱动LCD12864的应用

在网上有很多人说,串行的很不稳定,有时会乱码。我反复试了,你看

我图上用了四根线接到AT89C2051上一根串行数据线,一根时钟脉冲线,一根电源正,一根接地。但是在LCD模块上除了这四根线,不是什么都不接的,在用电位器作调节对比度以外,见前面那张电路图:

自制单片机之十五……可串行驱动LCD12864的应用
模快上的PSB一定要接地,否刚就极不稳定了,还有RST复位端也要如图那样接好。RS端接高电位。这样如果你的程序正确,那LCD模块非常稳定。

另外在写程序时,清屏指令Lcd_WriteCmd(0x01);    后面一定要跟个延时指令,因为这条指令需要1.6mS的时间执行,否则紧跟在后面的指令就会出错。

好!下面给出前面效果图的完整程序:

/*************************************************
名    称:LCD12864_ST7920串行测试程序
连接方式: 串行方式连接

*************************************************/

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

/*****LCD接口定义*****/
sbit SID = P1^0;      //串行数据
sbit SCLK = P1^1;     //串行同步时钟

/*****汉字地址表*****/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};

//图片取模方式:横向取模,字节正序
unsigned char code logo[1024]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x6B,0xFB,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xFF,0xBF,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1F,0xFF,0xFD,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0xAF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xEF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xEF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x0C,0xED,0xFE,0x00,0x00,0x00,
0x00,0x03,0xDF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x80,0xBF,0xFF,0xFF,0x80,0x00,0x00,
0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x03,0xA1,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x07,0xF3,0xFF,0xFF,0xFF,0x80,0x00,0x00,
0x00,0xDF,0xFF,0xFF,0x7F,0xFA,0x0F,0x80,0x0F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
0x00,0xBD,0xFF,0xB4,0x7F,0xF8,0x1F,0xE0,0x1F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
0x00,0x5E,0xFF,0x80,0x7F,0xF0,0x3F,0xF8,0x3F,0xFD,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
0x01,0xCF,0xFC,0x00,0x3F,0xF0,0x3F,0xF8,0x3F,0xEF,0xFF,0xFF,0xFF,0x80,0x00,0x00,
0x01,0x7F,0xB0,0x00,0x7F,0xE0,0x3F,0xFB,0xFF,0xE7,0xFF,0xFF,0xFF,0xC0,0x00,0x00,
0x06,0x1F,0x80,0x00,0x7F,0xE0,0x7F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x80,0x00,0x00,
0x01,0x7E,0x00,0x00,0xFF,0xC0,0x3F,0xFF,0xFF,0x80,0xBF,0xFF,0xFF,0x80,0x00,0x00,
0x02,0x28,0x00,0x00,0xFF,0xC0,0x33,0xFF,0xFF,0x00,0x1F,0xFF,0xFE,0x00,0x00,0x00,
0x08,0xB0,0x00,0x00,0xFF,0x80,0x1F,0xFF,0xFF,0x00,0x1F,0xFF,0xF4,0x00,0x00,0x00,
0x03,0x40,0x00,0x00,0xFF,0x80,0x07,0xFF,0xFC,0x00,0x3F,0xFF,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFD,0x00,0x07,0xFF,0xFC,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,
0x08,0x00,0x00,0x00,0xFF,0x00,0x01,0xFF,0xE8,0x00,0xFF,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xEF,0x80,0x01,0xFF,0xE0,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xFF,0x00,0x0B,0xFF,0xF8,0x03,0xFF,0xE2,0x04,0x00,0x00,0x40,
0x00,0x00,0x00,0x03,0xFE,0x00,0x1F,0xFF,0xF4,0x03,0xFF,0xE2,0x04,0x00,0x10,0x40,
0x00,0x00,0x00,0x03,0xFE,0x00,0x3F,0xFF,0xFF,0x0B,0xFF,0xFF,0xFF,0xDB,0x28,0x20,
0x00,0x00,0x00,0x03,0xFE,0x00,0x3F,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0xFC,0x9A,0xC0,
0x00,0x00,0x00,0x03,0xFE,0x00,0x37,0xDF,0xFF,0x9F,0xFF,0xFF,0xFE,0xD9,0xD1,0x00,
0x00,0x00,0x00,0x07,0xFC,0x00,0x6F,0x87,0xFF,0xDF,0xFF,0xFF,0xFF,0xFE,0xDD,0x40,
0x00,0x00,0x00,0x03,0xFC,0x00,0xFF,0xE3,0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0x94,0x80,
0x00,0x00,0x00,0x01,0xFC,0x00,0x7F,0x81,0xFF,0xF7,0xFF,0xFF,0xFF,0xEC,0x94,0x40,
0x00,0x00,0x00,0x01,0xFC,0x00,0x5F,0x00,0x7F,0xDF,0xFF,0xFF,0xF7,0xFF,0x72,0x00,
0x00,0x00,0x00,0x03,0xF8,0x00,0x6F,0x00,0x7F,0x85,0xFF,0xFF,0xDB,0xFD,0x20,0x00,
0x00,0x00,0x00,0x05,0xEC,0x00,0x1E,0x00,0x3E,0x02,0x6A,0xFF,0x6D,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x00,0x04,0x50,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
0x10,0x44,0x00,0x04,0x50,0x41,0x00,0x10,0x40,0x00,0x00,0x00,0x28,0x00,0x0E,0x10,
0x10,0x44,0x00,0x04,0x50,0x01,0x00,0x00,0x40,0x00,0x00,0x00,0x28,0x00,0x11,0x30,
0x1E,0x77,0x78,0x88,0x9E,0x41,0xE3,0x93,0xD1,0x03,0x9C,0xEC,0x4E,0x8B,0xD1,0x10,
0x11,0x44,0x44,0x88,0x91,0x41,0x10,0x54,0x51,0x04,0x22,0x92,0x48,0x50,0x51,0x10,
0x11,0x44,0x44,0x08,0x91,0x41,0x13,0xD4,0x51,0x04,0x22,0x92,0x48,0x20,0x91,0x10,
0x11,0x44,0x44,0x08,0x91,0x41,0x14,0x54,0x51,0x04,0x22,0x92,0x48,0x21,0x11,0x10,
0x11,0x44,0x44,0x88,0x91,0x49,0x14,0x54,0x51,0x24,0x22,0x92,0x48,0x52,0x11,0x10,
0x11,0x33,0x78,0x91,0x11,0x49,0xE3,0xD3,0xCF,0x23,0x9C,0x92,0x86,0x8B,0xCE,0x38,
0x00,0x00,0x40,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
0x00,0x00,0x40,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//我的logo

/*****n(ms)延时子程序*****/
void delayms(uint t)     //约延时n(ms)
{
uint i;
while(t--)
    {
     for(i=0;i<125;i++);
    }        
}

/*****串行发送一个字节*****/
void SendByte(uchar Dbyte)
{
     uchar i;
     for(i=0;i<8;i++)
     {
       SCLK = 0;
       Dbyte=Dbyte<<1;   //左移一位
       SID = CY;         //移出的位给SID
       SCLK = 1;
       SCLK = 0;
     }
}

/*****写指令*****/
void Lcd_WriteCmd(uchar Cbyte )
{
     //delayms(1);
     SendByte(0xf8);            //11111,RW(0),RS(0),0
     SendByte(0xf0&Cbyte);      //高四位
     SendByte(0xf0&Cbyte<<4);   //低四位(先执行<<)
}

/*****写数据*****/
void Lcd_WriteData(uchar Dbyte )
{
     //delayms(1);
     SendByte(0xfa);            //11111,RW(0),RS(1),0
     SendByte(0xf0&Dbyte);      //高四位
     SendByte(0xf0&Dbyte<<4);   //低四位(先执行<<)
}

/*****初始化LCD*****/
void Lcd_Init(void)

delayms(50);
    Lcd_WriteCmd(0x30);        //选择基本指令集
delayms(1);
    Lcd_WriteCmd(0x30);        //选择8bit数据流
delayms(1);
    Lcd_WriteCmd(0x0c);        //开显示(无游标、不反白)
delayms(1);
    Lcd_WriteCmd(0x01);        //清除显示,并且设定地址指针为00H
delayms(2);
}

/*****显示汉字*****/
void hanzi_Disp(uchar x,uchar y,uchar code *s)

Lcd_WriteCmd(addr_tab[8*x+y]); //写地址
while(*s>0)
    { 
      Lcd_WriteData(*s);    //写数据
      s++;     
    }
}

/*****显示图片(显示Gdram内容?
?*绘图显示的步骤
1 关闭绘图显示功能
2 先将垂直的坐标(Y)写入绘图RAM地址
3 再将水平的位元组坐标(X)写入绘图RAM地址
4 将D15-D8写入RAM中
5 将D7-D0写入到RAM中
6 打开绘图显示功能*/

void pic_Disp(uchar *pic)    //显示Gdram内容(显示图片)
{
uchar x,y,i;
Lcd_WriteCmd(0x34);   //切换到扩充指令,
Lcd_WriteCmd(0x34);//关闭图形显示
for(i=0;i<9;i=i+8)
for(y=0;y<32;y++)
{
for(x=0;x<8;x++)
{
   Lcd_WriteCmd(0x80+y); //行地址
   Lcd_WriteCmd(0x80+x+i); //列地址
   Lcd_WriteData(*pic++); //写数据 D15-D8
   Lcd_WriteData(*pic++); //写数据 D7-D0
}
}
   Lcd_WriteCmd(0x36);//打开图形显示

}

/*****整屏充满亮点或暗点*****/
//当i=0时显示上面128×32,当i=8时显示下面128×32
//当i=0时显示上面128×32,当i=8时显示下面128×32
void Lcd_Fill(uchar test)

uchar x,y,i;
Lcd_WriteCmd(0x34);//切换到扩充指令
Lcd_WriteCmd(0x34);//关闭图形显示
    for(i=0;i<9;i=i+8)   
for(y=0;y<0x20;y++)
{     
for(x=0;x<8;x++)
       { 
          Lcd_WriteCmd(y+0x80);       //行地址
          Lcd_WriteCmd(x+0x80+i);     //列地址     
          Lcd_WriteData(test);   //写数据 D15-D8 
          Lcd_WriteData(test);   //写数据 D7-D0 
       }

Lcd_WriteCmd(0x36);//打开图形显示
}

/*****主函数*****/
void main(void)

while(1)
{
    Lcd_Init();
    hanzi_Disp(0,0,"ST7920型液晶模块");
    hanzi_Disp(1,2,"串行测试");
    hanzi_Disp(3,0," ");
    delayms(2000);
    Lcd_WriteCmd(0x08);//关闭字符显示
    delayms(500);
    Lcd_WriteCmd(0x0c);//打开字符显示
    delayms(500);
    Lcd_WriteCmd(0x08);//关闭字符显示
    delayms(500);
    Lcd_WriteCmd(0x0c);//打开字符显示
    delayms(2000);
    Lcd_WriteCmd(0x01);//清屏,需要1.6m秒,所以后面一定要有延时,否则会出错。
    delayms(1);
    Lcd_WriteCmd(0x08);//关闭字符显示
    Lcd_Fill(0xff);//去填充图形
    Lcd_WriteCmd(0x30);//切换回基本指令
    hanzi_Disp(1,2,"白屏显示");
    delayms(4000);

Lcd_WriteCmd(0x01);//清屏
    delayms(1);
    Lcd_Fill(0x00);//填充
Lcd_WriteCmd(0x30);
    hanzi_Disp(1,2,"黑屏显示");
    delayms(2000);

Lcd_WriteCmd(0x01);//清屏
    delayms(1);
    pic_Disp(logo);//填充图形我的logo
    delayms(2000);
    Lcd_Fill(0x00);      //填充黑屏
    delayms(1000);   
}
}

总之每个指令要反复试它的作用方法,如切换基本指令和扩充指令,再关闭和打开图形显示,你如果不试就不知道它是如何作用的。

这个蓝屏白字的屏呢用起来一开始猛的一看呢很好看,有点感觉得像彩屏,但实际使用上并不好,很难把屏调到屏幕的字很白,但又没有虚影。总是要么调要没有虚影,但字的色块灰中偏紫且不均匀。要么把字调到很白,但靠近字的周围又有紫色虚影,还比较严重。总之,实际使用没有黄绿屏黑字的好。

自制单片机之十五……可串行驱动LCD12864的应用

自制单片机之十五……可串行驱动LCD12864的应用

跟黄绿屏的比比

自制单片机之十五……可串行驱动LCD12864的应用

随机推荐

  1. ubuntu 安装 OpenCv 及其Qt的开发环境配置

    ubuntu安装opencv (1)安装编译opencv的环境 sudo apt-get -y install build-essential cmake pkg-config (2)安装Image ...

  2. Zabbix3&period;0&plus;CentOS7&period;0&plus;MariaDB5&period;5监视服务器安装

    本次安装采用: Centos7.0 Zabbix3.0 MariaDB5.5 -------------------  2012/12/2更新 最新的Centos7.1或者Redhat7.1版本在最后 ...

  3. ID3决策树---Java

    1)熵与信息增益: 2)以下是实现代码: //import java.awt.color.ICC_ColorSpace; import java.io.*; import java.util.Arra ...

  4. 高级Java程序员的技术进阶之路

      据不完全统计,截至目前(2017.07)为止,中国Java程序员的数量已经超过了100万.而且,随着IT培训业的持续发展和大量的应届毕业生进入社会,Java程序员面临的竞争压力越来越大.那么,作为 ...

  5. 手动用tomcat启动war包,无法访问web项目

    先说一下自己采的小坑,网上大多解答都是复制来复制去,不说重点在哪.我这里简单总结下访问路径问题 一.用idea打成war包,具体步骤如下图: 步骤:在项目配置选Artifacts新建Web Appli ...

  6. 剑指offer第32题:把数组排成最小的数及关于list&period;sort&lpar;&rpar;和sorted&lpar; Iterable object &rpar;函数的相关知识

     * 解题思路:  * 先将整型数组转换成字符数组,然后将String数组排序,最后将排好序的字符串数组拼接出来.关键就是制定比较规则.  * 排序规则如下:  * 若ab > ba 则 a & ...

  7. 唉 调皮的ListView

    唉 调皮的ListView 本次任务是 运用LisTView和自定义Adapter 来实现资料以列表的形式展现 来看代码 *** 布局代码老规矩 直接贴上 <LinearLayout andro ...

  8. paxos协议&lpar;1&rpar;-朴素paxos

    前言 学习paxos协议,最困惑我的两点是: 1. 朴素paxos是怎么样的?这部分主要是原理: 2. paxos协议是怎么运用到分布式系统解决问题的.因为很多博客的开篇说paxos协议可以运用在很多 ...

  9. wpa&lowbar;supplicant下行接口浅析

    wpa_supplicant通过socket通信机制实现下行接口,与内核进行通信,获取信息或下发命令. 以下摘自http://blog.csdn.net/fxfzz/article/details/6 ...

  10. LightOJ 1140 计数&sol;数位DP 入门

    题意: 给出a,b求区间a,b内写下过多少个零 题解:计数问题一般都会牵扯到数位DP,DP我写的少,这道当作入门了,DFS写法有固定的模板可套用 dp[p][count] 代表在p位 且前面出现过co ...