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

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

再来个背面照片:

买来后也就只有个管脚说明:(我只说串口的定义)
工作于串行模式时的引脚定义:
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连接:

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

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

下面还是要先讲原理,资料说起来是枯燥了点。但你不去理解它,是不可能让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地址与液晶屏的位置关系见下图:

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

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

  上图我们可以看出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、下面我们来介绍能够使用的指令?

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

  由图可以看出,单片机与液晶模块之间传送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的电路接法如下图:

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

我先上点图,再写。。

2

3

4

5

6

我们先写一段简单的,就在屏上显示一排“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);
}

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

实际效果图:

整体图:

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

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


模快上的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的应用的更多相关文章

  1. 自制单片机之十六……将文字或图形转成LCD上使用的C51字模数据

    这一讲说说如何用取模软件将图形转成数据吧,有很多人反复问我这个问题,我就再罗嗦下吧! 取字模的软件有很多款.有的只能将文字转成字模数据,有的既可将文本文字转字模也能将图片转成点阵数据.在这里我就介绍一 ...

  2. 【单片机实验】6LED静态串行显示

    实验三 6LED静态串行显示一.实验目的1.掌握数字.字符转换成由数码管显示的八段码的软件译码方法及译码过程:2.静态显示的原理和相关程序的编写. 二.实验电路静态显示 电路如图3-2所示.显示器由6 ...

  3. 自制单片机之十二……AT89C2051烧写器的制做与调试

    现在都用S52了,还用C2051干嘛!价格也差不多.但是C2051的体积要比S51.S52小很多,而且引脚只有20只,在一些简单的控制中,这些引脚已足够了,小的体积更具有优势些.但目前好像还没有支持在 ...

  4. 自制单片机之十八……无线通讯模块NRF24L01+

    (一)基础知识篇 今天刚调试好,先看图吧! 这张是AT89C2051控制NRF24L01+做发射调试. 看看NRF24L01细节吧! 这是LCD屏显示: AT89S52做接收测试: 正在接收时的显示: ...

  5. 自制单片机之十……AT89S51的上拉电阻问题

    很多网友都问我AT89S51的P0口为什么要接一个上拉电阻.我就用一个篇幅来说一说 P0口和其它三个口的内部电路是不同的,如下图 P0口是接在两个三极管D0和D1之间的,而P1-P3口的上部是接一个电 ...

  6. Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)

    一.介绍           今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...

  7. 十天学会单片机Day4串行口通信

    并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通 ...

  8. 自制单片机之六……串行I2C总线E2PROM AT24CXXX的应用

    这一篇介绍I2C存储器的使用.主要是介绍AT24CXX系列器件,它分为两类,主要是通过被存储容量地址来分的,一类是AT24C02-AT24C16,它的存储容量从256字节到2048字节.另一类是AT2 ...

  9. 十五个最常用Linux命令行 - imsoft.cnblogs

    众多Linux管理员在使用Linux的时候会经常使用到很多Linux命令行,其中有绝大部分不是经常使用到的.在本文中主要为大家总结了经常使用的十五个最常用Linux命令行,希望对刚刚接触Linux命令 ...

随机推荐

  1. 【转】Everything中文绿色版在Win7/8用不了?

    原文网址:http://pcedu.pconline.com.cn/472/4727542.html 用过Everything的朋友应该都知道,Everything有两个版本,一个是安装版,另一个是E ...

  2. HDOJ 1164 Eddy's research I(拆分成素数因子)

    Problem Description Eddy's interest is very extensive, recently he is interested in prime number. Ed ...

  3. cf581C Developing Skills

    Petya loves computer games. Finally a game that he's been waiting for so long came out! The main cha ...

  4. Android中ListView异步加载数据

    1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...

  5. Servlet的init()方法如何才会在服务器启动时执行

    如果要想让 servlet 的 init () 方法在服务器启动 时就被执行,则需要在 web.xml 中相应的 servlet 下配置 <servlet > <servlet -n ...

  6. hand第四次考核

    使用Spring与Mybatis技术实现下要求: (2分)1,Spring的配置文件名称为ApplicationContext.xml (2分)2,在ApplicationContext.xml中配置 ...

  7. (转)利用ant在Mac 下自动化打包签名Android程序

    1.创建一个android项目 参数说明:-k /--package 为命名空间(包名)-a /--name 工程名-p /--path 项目 -t 为目标平台的版本编号 命令:./android c ...

  8. SWFLoader交互

    主应用程序: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx=& ...

  9. CSS常用选择器

    关于CSS常用选择器: 1.ID选择器 关于ID选择器具有唯一性,在文档流中,ID是唯一的,在低版本的浏览器中,允许出现不适唯一ID的情况,而在高版本的浏览器中,出现ID不唯一的情况浏览器会出现的报错 ...

  10. Mapreduce运行过程分析(基于Hadoop2.4)——(一)

    1 概述 该瞅瞅MapReduce的内部执行原理了,曾经仅仅知道个皮毛,再不搞搞,不然怎么死的都不晓得.下文会以2.4版本号中的WordCount这个经典样例作为分析的切入点.一步步来看里面究竟是个什 ...