当前位置:文档之家› 12864讲解

12864讲解

12864讲解
12864讲解

辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理……

芯片:YM12864R P-1 控制芯片:ST7920A 带中文字库

初步小结:

1、控制芯片不同,寄存器定义会不同

2、显示方式有并行和串行,程序不同

3、含字库芯片显示字符时不必对字符取模了

4、对芯片的结构地址一定要理解清楚

5、显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚

6、显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚

7、显示汉字时的二级单元(一级为八位数据写入单元)要清楚

8、显示图片时的二级单元(一级为八位数据写入单元)要清楚

12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。

为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。(注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息,每页包括64个存储单元。因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。

芯片的结构一定要清楚!

点阵LCD的显示原理

在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。

那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:

图1 “A”字模图

而中文的“你”在字模中的记载却如图2所示:

图2 “你”字模图

字符二级单元(图3中阴影部分)

一个汉字的二级单元是一个16*16的区域,因些128*64液晶可以显示4行8列共32个汉字(如图3)。而它的一个二级单元如图4(在无字库时,对汉字的取模有横向跟纵向两种,要注意),对于并行含有子库芯片的显示,只要设定好这个二级单元的地址(如0X80+i,这样设定i的范围为0~31,这里注意第一行会直接跳到第三行;或者根据自己需要如第二行0X90+i,i范围为0~7;第三行0X88+i,i范围为0~7;),然后直接把汉字写入就OK了~(串行无字符库的后面再做分析)

垂直坐标:上半屏00~1F,总共为32

水平坐标:上半屏水平坐标分别为0X80+(00~07)

下半屏00~1F,总共为

32 下半屏水平坐标分别为0X88+(00~07)

图片显示芯片结构分块与汉字显示不一样

图象显示过程是这样的:首先设置垂直地址,再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址,然后在每个地址里写入16位数据)。垂直地址范围 AC5...AC0

水平地址范围 AC3…AC0

绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H

但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如图5:分上下屏写入。

for(i=0;i<32;i++) // 上半屏32个垂直地址

{

write_com(0x80 + i); // 垂直地址

write_com(0x80); // 水平地址

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

带中文字库的128X64显示模块时应注意以下几点:

①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。

③当字符编码为2字节时,应先写入高位字节,再写入低位字节。

④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。

程序———————并行(串行后面再分析)——————————————————————————

#include

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar code LCD_data1[];

uchar code LCD_data2[];

uchar code LCD_picture1[];

uchar code LCD_picture2[];

sbit RS = P2^4;

sbit RW = P2^5;

sbit EN = P2^6;

sbit PSB = P2^1;

sbit RES = P2^3;

sbit Dataport = P0;

sbit Busyport = P0^7;

////////////////////////////////////////////////////////////// void delay_ms(unsigned int n) //延时10×n毫秒程序 {

unsigned int i,j;

for(i=0;i

for(j=0;j<2000;j++);

}

void delay(unsigned int m) //1US延时程序

{

unsigned int i,j;

for(i=0;i

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

}

/////////////////////////////////////////////////////////////// //判LCM忙子函数

void check_LCD_busy (void)

{

Dataport = 0xff;

RS = 0;

RW = 1;

EN = 1;

while (Busyport);

EN = 0;

}

/////////////////////////////////////////////////////////////// //写命令子函数

void write_com(uchar Command)

{

check_LCD_busy();

RW=0;

RS=0;

delay(1);

P0=Command;

EN=1;

delay(1);

EN=0;

}

////////////////////////////////////////////////////////////////

//写数据子函数

void write_data(uchar Data)

{

check_LCD_busy();

RW=0;

RS=1;

delay(1);

P0=Data;

EN=1;

delay(1);

EN=0;

}

/////////////////////////////////////////////////////////////////

//LCM清屏函数

void lcdClear (void)

{

write_com(0x01);

}

////////////////////////////////////////////////////////////////

//LCM复位函数

void reset ()

{

RES=0; //复位

delay(1); //延时

RES=1; //复位置高

delay(10);

}

///////////////////////////////////////////////////////////////

//显示汉字

void dispString (uchar X, Y,uchar *msg) //X为哪一行,Y为哪一列。msg 为汉字

{

if(X==0) X = 0x80; //第一行,汉字显示坐标

else if(X==1) X = 0x90; //第二行

else if(X==2) X = 0x88; //第三行

else X = 0x98; //第四行

Y = X + Y; //Y为1往右移一位

write_com(Y); //写入坐标

while (*msg)

{

write_data(*msg++); //显示汉字

}

}

/////////////////////////////////////////////////////////////// //显示图象

void disppicture(uchar code *adder)

{

uint i,j;

//*******显示上半屏内容设置

for(i=0;i<32;i++) // 上半屏32个垂直地址 {

write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD

write_com(0x80); //SET 水平地址 HORIZONTAL ADD

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

//*******显示下半屏内容设置

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

{

write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD write_com(0x88); //SET 水平地址 HORIZONTAL ADD

for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

}

/////////////////////////////////////////////////////////////// //LCD字库初始化函数

void lcdinit_str(void)

{

delay(40); //大于40MS的延时程序

PSB=1; //设置为8BIT并口工作模式

delay(1); //延时

reset(); //复位

write_com(0x30); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF

delay(100); //大于100uS的延时程序

write_com(0x30); //Function Set

delay(37); ////大于37uS的延时程序

write_com(0x08); //Display on Control

delay(100); //大于100uS的延时程序

write_com(0x10); //Cursor Display Control光标设置

delay(100); //大于100uS的延时程序

write_com(0x0C); //Display Control,D=1,显示开

delay(100); //大于100uS的延时程序

write_com(0x01); //Display Clear

delay(10); //大于10mS的延时程序

write_com(0x06); //Enry Mode Set,光标从右向左加1位移动

delay(100); //大于100uS的延时程序

}

//////////////////////////////////////////////////////////////////

//LCD图片(扩展)初始化函数

void lcdinit_pic(void)

{

delay(40); //大于40MS的延时程序

PSB=1; //设置为8BIT并口工作模式

delay(1); //延时

reset();

write_com(0x36); //Extended Function Set RE=1: extended instruction

delay(100); //大于100uS的延时程序

write_com(0x36); //Extended Function Set:RE=1: extended instruction set

delay(37); ////大于37uS的延时程序

write_com(0x3E); //EXFUNCTION(DL=8BITS,RE=1,G=1)

delay(100); //大于100uS的延时程序

write_com(0x01); //CLEAR SCREEN

delay(100); //大于100uS的延时程序

}

/////////////////////////////////////////////////////////////////

void main()

{

while(1)

{

lcdinit_str();

delay_ms(10); //此延时如果没有的话第一行会一直在第一列

dispString(0, 1,"祖国江山好");

delay_ms(10);

dispString(1, 1,"爱情少不了");

delay_ms(10);

dispString(2, 1,"为了下一代");

delay_ms(10);

dispString(3, 1,"赶紧谈恋爱");

delay_ms(200);

delay_ms(200);

lcdClear();

delay_ms(10);

dispString(0, 1,"大名吴建峰");

delay_ms(10);

dispString(1, 1,"性别为非女");

delay_ms(10);

dispString(2, 1,"芳龄二十二");

delay_ms(10);

dispString(3, 1,"海拔一百六");

delay_ms(200);

delay_ms(200);

lcdinit_pic();

lcdClear();

delay_ms(10);

disppicture(LCD_picture1);

delay_ms(300);

delay_ms(300);

}

}

图象代码库见最后!~

成果——————————————————————————————————

图形取模方法(转):

128*64的像素能显示的内容就有限,也无法要求它能多清楚,如果将一个彩色的图片转换为单色位图,效果就更差了,个人不建议用它来显示彩色的图片,如果真要用128*64的液晶显示,建议如下:

1.尽量选择颜色比较单一的图片,当然一种颜色的效果最好不过了;

2.图片不能选择的太大,要不缩小了就看不清楚了;

3.图片的调整可以这样(仅供参考):

1>调整图片的宽高比大致为2:1;

2>将图片缩小到128*64像素;

3>保存为单色位图;

图片的大小缩放不太好操作,我通常是这样做的:你用画图程序打开你要显示的图片后,首先要操作的查看属性(点击菜单栏的图像->属性,单位选择为

像素后,宽高值就出来了),比如:宽:603,高:444,这显然宽高比不是2:1,你就要调整了,444*2=888,现在为603,所以888/603=1.47,所以宽要放大为147%(点击菜单栏的图像->拉伸/扭曲,在拉伸里面的水平处改为147),现在就调整为2:1了;接下来就要将图片缩小到128*64像素,先计算缩放的比例,128/888=0.144,所以相同的操作(点击菜单栏的图像->拉伸/扭曲,在拉伸里面的水平处改为14,垂直里面也要改为14);最后就是保存为单色位图(文件->另存为->文件类型选择为:单色位图(.bmp))?试过颜色比较单一的,效果还可以,复杂的彩色图片效果就很不理想了...

说明:在调整图片的宽高比大致为2:1的过程中图片会被拉伸变形,不过缩小到128*64像素后也不是太明显...

图片取模

图片代码——————————————————————————————————

uchar code LCD_picture1[]=

{

0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0

0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x18,0x00,

0x00,0x00,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x18,0x00,

0x03,0x00,0x07,0xEC,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0 0,0x37,0x80,

0x03,0x00,0x00,0xEC,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1 8,0x3F,0xC0,

0x03,0x00,0x0F,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1 8,0x79,0x80,

0x03,0x00,0x0F,0x6B,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1 8,0x7F,0x00,

0x1F,0xF4,0x01,0xE9,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0xE0,0x1 8,0xFF,0x80,

0x1F,0xFC,0x00,0xFB,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0xC6,0x70,0x1 B,0x1E,0xC0,

0x03,0x38,0x01,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x86,0x38,0xD B,0xFF,0xE0,

0x03,0x70,0x07,0x9E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x26,0x18,0xD B,0x8C,0x70,

0x7F,0xFF,0x87,0x27,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x01,0xF F,0xFF,0xB8,

0x7F,0xFF,0x80,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x0 0,0x0C,0x18,

0x07,0x80,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0 0,0xFF,0xE0,

0x0F,0x00,0x00,0xFB,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF 0,0xFF,0xE0,

0x1F,0x30,0x01,0xCF,0xFF,0xFF,0x09,0x00,0x00,0x00,0x00,0x03,0xFF,0xF F,0x0C,0x00,

0x3B,0x36,0x03,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF F,0xCC,0x00,

0x73,0x76,0x03,0x3F,0xFF,0xFF,0xF7,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF F,0xFC,0x00,

0x63,0xE6,0x00,0x3F,0xFF,0xFF,0xDC,0x80,0x00,0x00,0x00,0x7F,0xFF,0xF F,0xFC,0x00,

0x03,0xFE,0x00,0x7F,0xFF,0xFF,0xAF,0x60,0x00,0x00,0x00,0xFF,0xFF,0xF F,0xFC,0x00,

0x03,0xFE,0x00,0xFF,0xFF,0xFF,0xF5,0xC0,0x00,0x00,0x01,0xFF,0xFF,0xF F,0xFC,0x00,

0x00,0x00,0x01,0xFF,0xFF,0xFF,0x23,0x20,0x00,0x00,0x03,0xFF,0xFF,0xF F,0xFE,0x00,

0x00,0x00,0x03,0xFF,0x8F,0xE3,0xEC,0xA0,0x00,0x00,0x03,0xFF,0x1F,0xC

0x00,0x00,0x03,0xFF,0x07,0xC1,0x92,0xC0,0x00,0x00,0x07,0xFE,0x0F,0x8 3,0xFF,0x80,

0x00,0x00,0x07,0xFF,0x03,0xC0,0xE9,0xC0,0x00,0x00,0x0F,0xFE,0x07,0x8 1,0xFF,0x80,

0x00,0x00,0x07,0xFE,0x03,0x80,0xED,0xE0,0x00,0x00,0x0F,0xFC,0x07,0x0 1,0xFF,0xC0,

0x00,0x00,0x0F,0xFE,0x1B,0xB0,0xDD,0xE0,0x00,0x00,0x1F,0xFC,0x37,0x6 1,0xFF,0xC0,

0x00,0x00,0x0F,0xFE,0x1B,0xB0,0xFF,0xE0,0x00,0x00,0x1F,0xFC,0x37,0x6 1,0xFF,0xC0,

0x00,0x00,0x0F,0xFE,0x1B,0xB0,0xFF,0xF0,0x00,0x00,0x1F,0xFC,0x37,0x6 1,0xFF,0xE0,

0x00,0x00,0x1F,0xFE,0x1B,0xB0,0xFF,0xF0,0x00,0x00,0x3F,0xFC,0x37,0x6 1,0xFF,0xE0,

0x00,0x00,0x1F,0xFF,0x03,0xC0,0xFF,0xF0,0x00,0x00,0x3F,0xFE,0x07,0x8 1,0xFF,0xE0,

0x00,0x00,0x1F,0xFF,0x07,0xC1,0xFF,0xF0,0x00,0x00,0x3F,0xFE,0x0F,0x8 3,0xFF,0xE0,

0x00,0x00,0x1F,0xFF,0x8C,0x63,0xFF,0xF0,0x00,0x00,0x3F,0xFF,0x1F,0xC 7,0xFF,0xE0,

0x00,0x00,0x1F,0xDF,0xFC,0x7F,0xF7,0xF0,0x00,0x00,0x3F,0xFF,0xF0,0x7 F,0xFF,0xE0,

0x00,0x00,0x1F,0x07,0xFF,0xFF,0xD1,0xF0,0x00,0x00,0x3F,0xFF,0xE0,0x3 F,0xFF,0xE0,

0x00,0x00,0x1E,0x03,0xFF,0xFF,0x80,0xF0,0x00,0x00,0x3F,0xC0,0x00,0x0 0,0x07,0xE0,

0x00,0x00,0x1E,0x03,0xFE,0xFF,0xC0,0xF0,0x00,0x00,0x3F,0xE0,0x00,0x0 0,0x0F,0xE0,

0x00,0x00,0x0C,0x01,0xF8,0x3F,0x80,0xE0,0x00,0x00,0x1F,0xE0,0x00,0x0 0,0x1F,0xC0,

0x00,0x00,0x0E,0x03,0xF0,0x1F,0xC0,0xE0,0x00,0x00,0x1F,0xF0,0x0F,0xC 0,0x1F,0xC0,

0x00,0x00,0x1E,0x03,0xF0,0x1F,0x80,0xE0,0x00,0x00,0x1F,0xFC,0x0B,0x4 0,0x7F,0xC0,

0x00,0x00,0x7F,0x1F,0xF0,0x1F,0xC3,0xE0,0x00,0x00,0xFF,0xFF,0x0B,0x4 1,0xFF,0xC0,

0x00,0x00,0xFF,0xFF,0xF0,0x1F,0xF7,0xF0,0x00,0x01,0xFF,0xFF,0xC0,0x0 F,0xFF,0xF0,

0x00,0x01,0xFF,0xFF,0xF8,0x3F,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xF8,0x7 F,0xFF,0xF8,

0x00,0x03,0xFE,0x7F,0xFE,0xFF,0xFF,0xFE,0x00,0x07,0xFC,0xFF,0xFF,0xF F,0xFF,0xFC,

0x00,0x07,0xFC,0x1F,0xFF,0xFF,0xF8,0xFE,0x00,0x0F,0xF8,0x3F,0xFF,0xF

0x00,0x0F,0xF8,0x07,0xFF,0xFF,0xE0,0xFF,0x00,0x1F,0xF0,0x0F,0xFF,0xF F,0xC0,0xFE,

0x00,0x0F,0xF8,0x00,0xFF,0xFF,0x00,0x7F,0x80,0x1F,0xF0,0x01,0xFF,0xF E,0x00,0xFF,

0x00,0x1F,0xF0,0x00,0x02,0x00,0x00,0x7F,0x80,0x3F,0xE0,0x00,0x00,0x0 0,0x00,0x7F,

0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xE0,0x00,0x00,0x0 0,0x00,0x7F,

0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x7F,0xE0,0x00,0x00,0x0 0,0x00,0x7F,

0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x1F,0xE0,0x7F,0xC0,0x00,0x00,0x0 0,0x00,0x3F,

0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x1F,0xE0,0x7F,0xC0,0x00,0x00,0x0 0,0x00,0x3F,

0x00,0x7F,0xE0,0x01,0xC0,0xE0,0x00,0x1F,0xE0,0xFF,0xC0,0x00,0x70,0xE 0,0x00,0x3F,

0x00,0x7F,0xE0,0x03,0xF3,0xF0,0x00,0x1F,0xE0,0xFF,0xC0,0x00,0xF9,0xF 0,0x00,0x3F,

0x00,0x7F,0xE0,0x07,0xFF,0xF8,0x00,0x1F,0xE0,0xFF,0xC0,0x01,0xFF,0xF 8,0x00,0x3F,

0x00,0x7F,0xE0,0x07,0xFF,0xF8,0x00,0x1F,0xE0,0xFF,0xC0,0x01,0xFF,0xF 8,0x00,0x3F,

0x00,0x7C,0xE0,0x07,0xFF,0xF8,0x00,0x1B,0xE0,0xF9,0xC0,0x01,0xFF,0xF 8,0x00,0x37,

0x00,0x38,0xF0,0x03,0xFF,0xF0,0x00,0x39,0xE0,0xF1,0xE0,0x00,0xFF,0xF 0,0x00,0x73,

0x00,0x30,0x70,0x01,0xFF,0xE0,0x00,0x30,0xC0,0x60,0xE0,0x00,0x7F,0xE 0,0x00,0x61,

0x00,0x00,0x78,0x00,0xFF,0xC0,0x00,0x30,0x00,0x00,0xF0,0x00,0x3F,0xC 0,0x00,0x60,

0x00,0x00,0x38,0x00,0x7F,0x80,0x00,0x60,0x00,0x00,0x70,0x00,0x1F,0x8 0,0x00,0xC0,

0x00,0x00,0x1C,0x00,0x3F,0x00,0x00,0xC0,0x00,0x00,0x38,0x00,0x0F,0x0 0,0x01,0x80,

0x00,0x00,0x0E,0x00,0x1E,0x00,0x00,0x80,0x00,0x00,0x1C,0x00,0x06,0x0 0,0x01,0x00,

0x00,0x00,0x07,0x00,0x0C,0x00,0x01,0x80,0x00,0x00,0x0E,0x00,0x06,0x0 0,0x03,0x00,

};

三、文本(汉字,字符)输入

1、文本显示RAM(DDRAM)

文本显示RAM提供8个×4行的汉字空间,当写入文本显示RAM时,可以分别显示CGROM、HCGROM 与CGRAM的字型;

根据汉字显示坐标可以很容易地显示汉字以及其它字符~

四、图象输入

1、绘图RAM(GDRAM)

绘图显示RAM提供128×8个字节的记忆空间,在更改绘图RAM时,先连续写入水平与垂直的坐标值,再写入两个字节的数据到绘图RAM,而地址计数器(AC)会对水平地址(X地址)自动加一,当水平地址为0XFH时会重新设为00H;不会对垂直地址做进位自动加1.。在写入绘图RAM的期间,绘图显示必须关闭,整个写入绘图RAM的步骤如下:

1、关闭绘图显示功能。

2、先将水平的位元组坐标(X)写入绘图RAM地址;

再将垂直的坐标(Y)写入绘图RAM地址;

将D15——D8写入到RAM中;

将D7——D0写入到RAM中;

打开绘图显示功能。

绘图显示的缓冲区对应分布请参考“GDRAM坐标”

GDRAM地址坐标对于图象显示,这个地址表才是王道

水平方向X—以字节单位(2字节16位)

垂直方向Y—以位为单位

屏幕分上下两屏,垂直坐标上下屏都为Y:00—1F(也即0X80+Y),以位为单位;

水平坐标上半屏为X1:00—07(也即0X80+X1);下半屏为X2:08—0F (也0X80+X2)

由图可以看到水平坐标一个单位是两字节(即16位D15~D0),X地址会自动加1,是直接加一个单位(即两字节16位),比如00—》01(也即0X80+00—》0X80+01),从第一行第一列跳到第一行第二列。

(1)、整屏图象显示

程序:

void disppicture(uchar code *adder)

{

uint i,j;

//*******显示上半屏内容设置

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

{

write_com(0x80 + i); // 垂直地址 VERTICAL ADD

write_com(0x80); // 水平地址 HORIZONTAL ADD

for(j=0;j<16;j++) //X坐标方向以2字节为单位,Y坐标方向以1位为单位,先连续写入垂直与水平坐标,

{ //再写入两字节数据到GDRAM。这里是这样进行的:i=0时,j=0,1时,写入两字节到垂直(0X80+00)水平(0X80+00)这格(D15~D0)里;然后X 坐标地址自增1,地址变为垂直(0X80+00)水平(0X80+01)这格,在j=2,3时写入两字节,………一直到垂直(0X80+00)水平(0X80+07)这格,在j=14,15时写入两字节,此时循环

for(j=0;j<16;j++)结束跳出,刚好第一行128位写完数据;然后i++,开始写第二行…

write_data(*adder);

adder++;

}

}

//*******显示下半屏内容设置

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

{

write_com(0x80 + i); //SET 垂直地址下半屏的垂直地址中上半屏一样是0X80+Y (Y:00~1F)

write_com(0x88); //SET 水平地址下半屏的水平地址是从0X80+08=0X88开始的 for(j=0;j<16;j++)

{

write_data(*adder);

adder++;

}

}

}

LCD12864显示程序

;实验目的:熟悉12864LCD的使用 ;12864LCD带中文字库 ;编程让12864LCD显示公司名称“深圳乾龙盛电子”,公司电话“0975”,公司传真“6”;硬件设置: ;关断所有拨码开关。 #include<> ;__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_H S_OSC ;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define RS PORTA,5 ;命令/数据选择 #DEFINE RW PORTA,4 ;读/写选择 #DEFINE E PORTA,3 ;使能信号 #DEFINE PSB PORTA,2 ;并口/串口选择(H/L) #DEFINE RST PORTA,0 ;复位信号 ;----------------------------------------------- LCD_X EQU 30H ;页地址 LCD_Y EQU 31H ;Y地址 COUNT EQU 32H ;循环计数用 COUNT1 EQU 33H ;循环计数用 COUNT2 EQU 34H ;循环计数用 POINT EQU 35H ;查表偏移地址 POINT1 EQU 36H ;查表偏移地址 POINT2 EQU 37H ;查表偏移地址 TEMP EQU 38H ;临时寄存器 TEMP1 EQU 39H ;临时寄存器 ;----------------------------------------------- ORG 0000H ;复位地址 NOP ;ICD需要的空指令 GOTO MAIN ;跳转到主程序 ;**********************主程序************************ MAIN BANKSEL TRISA CLRF TRISA ;A口输出 CLRF TRISD ;D口输出 BANKSEL ADCON1 MOVLW 06H MOVWF ADCON1 ;A口全为数字口 CLRF STATUS

LCD12864显示程序

本例程为通过用A T89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include #include"12864.c" void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。 /********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ //#include #define uchar unsigned char #define uint unsigned int #define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3; /********************************************* 延时子程序 *********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

带字库12864液晶详解

12864液晶 一、概述 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: l 低电源电压(VDD:+3.0--+5.5V) l 显示分辨率:128×64点 l 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) l 内置 128个16×8点阵字符 l 2MHZ时钟频率 l 显示方式:STN、半透、正显 l 驱动方式:1/32DUTY,1/5BIAS l 视角方向:6点 l 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 l 通讯方式:串行、并口可选 l 内置DC-DC转换电路,无需外加负压 l 无需片选信号,简化软件设计 l 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 模块接口说明

*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口 管脚号管脚名称电平管脚功能描述 1 VSS 0V 电源地 2 VCC 3.0+5V 电源正 3 V0 - 对比度(亮度)调整 RS=“H”,表示DB7——DB0为显示数据 4 RS(CS)H/L RS=“L”,表示DB7——DB0为显示指令数据 R/W=“H”,E=“H”,数据被读到DB7——DB0 5 R/W(SID) H/L R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR 6 E(SCLK) H/L 使能信号 7 DB0 H/L 三态数据线 8 DB1 H/L 三态数据线 9 DB2 H/L 三态数据线 10 DB3 H/L 三态数据线 11 DB4 H/L 三态数据线 12 DB5 H/L 三态数据线 13 DB6 H/L 三态数据线 14 DB7 H/L 三态数据线 15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1) 16 NC - 空脚 17 /RESET H/L 复位端,低电平有效(见注释2) 18 VOUT - LCD驱动电压输出端 19 A VDD 背光源正端(+5V)(见注释3) 20 K VSS 背光源负端(见注释3)

12864液晶显示图片原理(完整版)

51单片机综合学习 12864液晶原理分析1 辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理…… 芯片:YM12864R P-1 控制芯片:ST7920A带中文字库 初步小结: 1、控制芯片不同,寄存器定义会不同 2、显示方式有并行和串行,程序不同 3、含字库芯片显示字符时不必对字符取模了 4、对芯片的结构地址一定要理解清楚

5、显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚 6、显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚 7、显示汉字时的二级单元(一级为八位数据写入单元)要清楚 8、显示图片时的二级单元(一级为八位数据写入单元)要清楚 12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入

到相应的存储单元中。图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。

LCD12864显示屏 带中文字库

蓝屏LCD12864显示屏带中文字库带背光12864-5V ST7920 需要用串口,请把 R9上的0欧电阻改到R10 带中文字库的,兰屏,白字 以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序: ORG 0000H RS EQU P3.7;确定具体硬件的连接方式 RW EQU P3.6 ;确定具体硬件的连接方式 E EQU P3.5 ;确定具体硬件的连接方式 MOV P1,#00000001B ;清屏并光标复位 ACALL ENABLE;调用写入命令子程序 MOV P1,#00111000B ;设置显示模式:8位2行5x7点阵 ACALL ENABLE ;调用写入命令子程序 MOV P1,#00001111B ;显示器开、光标开、光标允许闪烁 ACALL ENABLE ;调用写入命令子程序 MOV P1,#00000110B ;文字不动,光标自动右移 ACALL ENABLE ;调用写入命令子程序 MOV P1,#0C0H ;写入显示起始地址(第二行第一个位置) ACALL ENABLE ;调用写入命令子程序 MOV P1,#01000001B ;字母A的代码 SETB RS ;RS=1 CLR RW ;RW=0 ;准备写入数据 CLR E ;E=0 ;执行显示命令

ACALL DELAY ;判断液晶模块是否忙? SETB E ;E=1 ;显示完成,程序停车 AJMP $ ENABLE: CLR RS ;写入控制命令的子程序 CLR RW CLR E ACALL DELAY SETB E RET DELAY: MOV P1,#0FFH ;判断液晶显示器是否忙的子程序 CLR RS SETB RW CLR E NOP SETB E JB P1.7,DELAY ;如果P1.7为高电平表示忙就循环等待 RET END 程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址0C0H,最后输入要显示的字符A的代码41H。 SMC1602A(16*2)模拟口线接线方式 连接线图: --------------------------------------------------- |LCM-----51 | LCM-----51 | LCM------51 | ------------------------------------------------| |DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0 | |DB1-----P1.1 | DB5-----P1.5 | RS-------P2.1 | |DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 | |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND| --------------------------------------------------- [注:AT89S52使用12M晶振] =============================================================*/

玩转12864液晶(1)--显示字符

在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108 T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C) 关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。 我们先来了解一下它的并行连接情况。 下面是电路连接图

从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W 是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。 通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。 看看并行模式下的写时序图:

根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。 读时序图如下: 根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。 下面让我们根据这些编写出它的驱动程序吧。 我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C 实际显示效果图片如下: 程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。[p][/p] #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P1^0 ;

LCD12864汉字显示

//在12864液晶上显示汉字和英文字符 /***********************头文件*********************/ #include "regx52.h" typedef unsigned char uchar; typedef unsignedintuint; sbitlcdrs=P1^5; //12864:0写指令,1写数据 sbitlcdwr=P1^6; //12864读写信号 sbitlcden=P1^7; //12864片选信号 uchar code tab[]={" ATI-51S"}; uchari; /***********************1ms延时函数**********************/ void delay(uint z) { uint y; while(z--) { for(y=0;y<125;y++); } } /***********************LCD写指令写数据**********************/ voidwrite_comdata(uchara,uchardatas) { lcdrs=a; lcdwr=0; delay(1); P0=datas; lcden=1; delay(1); lcden=0; } /***********************光标位置*********************/ void cursor(uchar x, uchar y ) { uchar address; switch(x){ case 0: address=0x80+y;break; case 1: address=0x90+y;break;

12864LCD动态显示

/*------------------------------------------------------------------------------ PC2 PC3 PC4 PC5 PC6 PC7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 RS R/W E PSB NC RST DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 RS高电平写数据,低电平写指令代码.R/W高电平为读,低电平为写 E为使能信号,PSB高电平为并行模式,低电平为串行模式,RST低电平有效 显示地址:80H,81H,......86H,87H.第一行显示地址 90H,91H,......96H,97H.第二行显示地址 88H,89H,......8EH,8FH.第二行显示地址 98H,99H,......9EH,9FH.第三行显示地址 写指令01H:显示清屏,写指令02H: 位址归位,写指令0CH:开显示(无游标,不反白) 写指令30H:基本指令集,写指令80H:设置DDRAM,写指令10H:显示HCGROM ------------------------------------------------------------------------------*/ #include #include #define RS_H DDRC |= (1<<2);PORTC |= (1<<2); //RS设为高电平 #define RS_L DDRC |= (1<<2);PORTC &= ~(1<<2); //RS设为低电平 #define RW_H DDRC |= (1<<3);PORTC |= (1<<3); //RW设为高电平 #define RW_L DDRC |= (1<<3);PORTC &= ~(1<<3); //RW设为低电平 #define E_H DDRC |= (1<<4);PORTC |= (1<<4); //E设为高电平 #define E_L DDRC |= (1<<4);PORTC &= ~(1<<4); //E设为低电平 #define RST_H DDRC |= (1<<7);PORTC |= (1<<7); //RST为高电平 unsigned char MainMenu0[] = {"第二课堂胜风电子"}; unsigned char MainMenu1[] = {"数据为:"}; unsigned char Shuzi[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'}; /***********************函数功能:LCD延时子程序入口参数:t********************/ void delay(unsigned int t) { unsigned int i,j; for(i=0;i

带中文字库LCD12864液晶仿真

字库LCD12864液晶 /*----------------------------------------------- 名称:LCD12864 字库液晶芯片组st7920 ------------------------------------------------*/ #include #include #include /******************************************************************/ /* 定义数组 */ /******************************************************************/ unsigned char code IC_DAT[]; unsigned char code IC_DAT2[]; unsigned char code Photo1[]; /******************************************************************/ /* 定义接口信息 */ /******************************************************************/ sbit RS =P2^4; sbit WRD=P2^5; sbit E= P2^6; sbit PSB=P2^1; sbit RES=P2^3; /******************************************************************/

LCD12864显示矩阵键盘输入的任意两位数

/********************************************************** 用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5 液晶上显示25。用矩阵按键0-9共10个按键。LCD12864用串行方式操作,如果用并行,请自行修改。 ***********************************************************/ #include <> #include <> #define uchar unsigned char #define uint unsigned int #define NOP _nop_(); sbit LCD_CS=P1^0; //片选,高电平有效(RS) sbit LCD_SID=P1^1; //串行数据输入端(R/W) sbit LCD_SCLK=P1^2; //串行同步时钟,上升沿读取SID数据(E) sbit LCD_PSB=P1^3; //并/串选择 H并行 L串行 sbit LCD_RST=P1^4; //复位,低电平有效 uchar keynum; uchar code dis1[]={"请输入任意两位数"}; uchar code dis2[16]={"09ABCDEF"}; uchar dis_buf[]={0,0}; uchar getkey(); void display(); void delay(uint x) { uchar i; while(x--) { for(i=0;i<110;i++); } } /*写指令程序,指令由3个字节组成,第一个为写指令*/ /*第二个为指令高4位,第三个为指令低4位*/ void send_cmd(uchar cmd_dat) { uchar i; uchar i_dat; i_dat=0xf8; LCD_CS=1; LCD_SCLK=0; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80);

最完整的12864测试程序

以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD 驱动电压,应用时在VEE 与V0之间加一20K 可调电阻。 4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 5 R/W 读\写选择:高电平:读数据;低电平:写数据。 6 E 读写使能,高电平有效,下降沿锁定数据。 7 DB0 数据输入输出。 8 DB1 9 DB2 10 DB3 11 DB4 12 DB5 13 DB6 14 DB7 15 CS1 片选择信号,低电平时选择前64列。 16 CS2 片选择信号,低电平时选择后64列。 17 RET 复位信号,低电平有效。 18 VOUT LCD 驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。

以下是RT12864引脚功能定义 引脚号 管脚 说明 1 Vss 电源地(0V)。 2 VDD 电源正(+5V)。 3 V0 LCD驱动电压,应用时在VEE与V0之间加一20K可调电阻。4 D/I 数据\指令选择: 高电平:数据D0-D7将送入显示RAM 低电平:数据D0-D7将送入指令寄存器执行。 5 R/W

读\写选择:高电平:读数据;低电平:写数据。6 E 读写使能,高电平有效,下降沿锁定数据。7 DB0 数据输入输出。 8 DB1 9 DB2 10 DB3 11 DB4 12 DB5 13 DB6 14 DB7 15 CS1 片选择信号,低电平时选择前64列。 16 CS2 片选择信号,低电平时选择后64列。 17 RET 复位信号,低电平有效。 18 VOUT LCD驱动电源(-10V )。 19 LED+ 背光电源,LED+(+5V)。 20 LED- 背光电源,LED-(0V)。

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端口设置 */ sbit SCK=P3^6; //DS1302时钟 sbit SDA=P3^4; //DS1302 IO sbit RST = P3^5; // DS1302复位 bit ReadRTC_Flag; //读DS1302全局变量 /* 12864端口定义*/ #define LCD_data P0 //带字库液晶12864数据口 sbit LCD_RS = P2^4; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^1; //并口控制 sbit RES=P2^3; uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字 uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年 09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日

LCD12864液晶的使用之字库型液晶(一)

LCD12864液晶的使用之字库型液晶(一) 2011年02月15日星期二 16:44 下面介绍下带字库的液晶,由于Proteus中没有,就以实物为准吧!我手头上这块液晶是QY128*64HZ1,它的驱动器是ST7920,想必大家很熟悉了,百度、谷歌一下它的芯片手册很多!在学习此块液晶之前,建议大家好好看看它的驱动芯片的手册!它的驱动和LCD1602很像,甚至,读忙、写指令和写数据函数都是一样的,就初始化不一样,因为指令系统不同嘛!下面是我手头字库液晶的实物图。 (手机拍的,图片质量差了些,大家见谅!)

字库型液晶显示可以分为串行方式和并行方式两种,通过引脚PSB进行选择,它只有一个驱动芯片,不像Proteus中无字库液晶有两个驱动芯片。显示是整体显示,而不是左右屏的显示!大家一定要注意! 1、控制口信号说明:

注:①忙标志Bust_flag=1说明LCD内部正忙,此时不能对LCD进行操作,忙标志的判断由DB7也就是数据口的最高位所决定!这和LCD1602一样! ②上面对RS和RW的操作需配合使能信号EN来操作!否则无效! 1、显示说明 (1)、字符产生ROM(CGROM) 里面提供了8192(213)个汉字GB2132宋体 (2)、显示数据RAM(DDRAM) 内部提供64*2位空间,最多可控制4行16字,也就是16个中文字型显示,当写入显示数据RAM时,可分别显示CGROM和CGRAM的字型,可以用来显示三种字型:半角英文数字型、CGRAM字型和CGROM的中文字型,三种字型的选择,由在DDRAM总写入的编码选择,在0000H—0006H的编码中(其代码分别为0000、0002、0004、0006共四个)将选择CGRAM的自定义字型,02H —7FH的编码中将显示半角英文数字型的字型(也就是ASCII码,大小为16*8),至于A1以上的编码将自动结合下一个位元组,组成两个位元组的编码,从而形成一个中文字型的编码,也就是说显示一个汉字要两个ASCII码显示的位置,即大小为16*16。BIG(A140—D75F),GB(A1A0—F7FF)。 (3)、字型产生RAM 上面已经介绍了该种液晶提供四组可定义显示,是16*16大小的自定义图像空间,通过在特定的编码位置,写入我们要显示的自定义图像即可,这个和 LCD1602液晶的自定义显示字符的原理是一样的!这个将在下文加以详细介绍

单片机LCD12864显示系统课程设计

目录 一、概述 (2) 二、系统总体方案及硬件设计 (2) 2.1系统框图 (3) 2.2 单片机最小系统 (4) 2.3 显示电路 (6) 2.4 按键控制电路 (6) 三、系统软件设计 (9) 3.1软件设计概述 (9) 3.2汉字显示 (10) 3.3上下移屏..................................... 错误!未定义书签。 3.4 左右移屏.................................... 错误!未定义书签。 四、课程设计体会................................... 错误!未定义书签。 五、参考文献 (13) 六、附录 (14) 6.1 总电路图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 总程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

一、概述 随着社会的发展,趣来趣多的地方需要应用显示功能,各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD的显示即可完成,根据程序的不同而产生不同不效果以满足各种不同需求。 本文围绕设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机AT89S51,采用的液晶显示控制器的芯片是SED1520,主要实现由按键控制的中文显示、图片显示、滚屏以及左右移动功能。同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程,并详细阐述了程序的各个模块。本系统是以单片机的C语言来进行软件设计,指令的执行速度快,可读性强。为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。使硬件在软件的控制下协调运作。其次阐述了部分程序的流程图和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。最后对我所开发的用单片机实现LCD液晶显示器控制原理的设计思想和软、硬件调试作了详细的论述。 二、系统总体方案及硬件设计 2.1系统框图

12864显示程序,51单片机,C语言

12864显示程序,51单片机,C语言 可显示固定中文,字符,数字; 可实时动态刷新显示数字,字符; #include sbit rs=P1^2; sbit rw=P1^1; sbit cs=P1^0; sbit psb=P1^3; unsigned char code table[]={" X0: Y0: "}; unsigned char code table1[]={"现在X1: Y1: "}; unsigned char code table2[]={"划线模式:"}; unsigned char code table3[]={"开始暂停"}; void delay(unsigned char z) //延时 { unsigned i,j; for(i=0;i

cs=0; P2=com; delay(5); cs=1; delay(5); cs=0; } void write_date(unsigned char dat) //写数据 { rs=1; rw=0; cs=0; P2=dat; delay(5); cs=1; delay(5); cs=0; } void pos(unsigned char x,unsigned char y) //起点函数{ unsigned char pos;

if(x==0) x=0x80; else if(x==1) x=0x90; else if(x==2) x=0x88; else if(x==3) x=0x98; pos=x+y/2; write_com(pos); } void init() { unsigned char i; psb=1; //1并行,0串行 write_com(0x30); //基本指令操作 delay(5); write_com(0x0c); //显示开,关光标 delay(5); write_com(0x01); //清除led的显示内容delay(5); pos(0,0);

Lcd12864最全中文资料

128*64LCD液晶显示屏中文资料 一、概述 二、带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 三、基本特性: (1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) (4)、内置128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS (8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 (10)、通讯方式:串行、并口可选(11)、内置DC-DC转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 模块接口说明: *注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口

12864显示图形

看到工具箱旁边那个LCD12864很久没用了(当初买回来用的时候只是简单地测试了一下),于是萌生了重新写一次接口程序的想法(而且这次要给它加个图片显示的功能),好,说做就做,就用Atmega16和ICCAVR来做吧,最近这MCU和平台用得比较熟练。 马上从书堆里把当初打印出来的中文datasheet给翻了出来,依葫芦画瓢地写了个初始化程序。好,OK。编译通过。于是又写了一个可以自定义从XY坐标值开始输出显示的函数,再次编译,也通过,OK。于是呼马上写了四行简单的字符烧到单片机上试了一下,嘿嘿,一次通过。如下图: 后来在进一步测试的时候也出了点小问题。就是我是使用USBISP烧写器把程序烧写进AVR的(此时实验板由USBISP烧写器供电),想要实现从第一行的第一个字符开始连续显示"0123456789"。刚烧写完程序后能看到LCD12864上正常显示"0123456789",但是把烧写器从实验板上断开连接,单独用USB给实验板供电的时候,LCD的第一行只是显示"123456789",第一个字符消失了……,左思右想地弄了一个多小时后,终于把问题给解决了,就是把初始化程序的延时适当增加了些,真是奇怪。刚开始一直想不通为什么在烧写器供电的情况下就正常显示,而换到USB供电后就出了问题。后来再想想,估计是跟供电有关。在使用USBISP烧写器供电的时候,LCD的背光灯明显比用USB供电的时候来得亮,而且对比度也高很多,看来是因为换到USB供电后,供电不怎么充足,以至于LCD在上电初始化的时候花上了更多的时间去初始化(因为供电低了,功率小了,跑起来有点力不从心,用的时间就久了嘛……我是觉得可以这样去理解的 接下来呢,就到了有点难度的画图了。当初刚买到12864的时候只是简单测试了字符显示功能,除了因为画图还不需要用到,另外一个原因就是那datasheet上关于画图那部分的内容不怎么看得懂…。现在重新拿起来看,依然一头雾水……。马上上网百度了一下“12864 7920 显示图片”,看到了不少的例子程序,可是……就是没看到有关于这部分功能实现的详细思路和讲解……下载下来的那些程序,基本上没注释,不是说晦涩难懂,但是至少看起来一团糟,让人家不想继续看下去……于是还是硬着头皮去啃那datasheet。上面对于画图这部分的内容是这样讲解的:

LCD12864液晶显示模块(中文资料)

FYD12864液晶中文显示模块

(一) (一)概述 (3) (二)(二)外形尺寸 1 方框图 (3) 2 外型尺寸图 (4) (三)(三)模块的接口 (4) (四)(四)硬件说明 (5) (五) 指令说明 (7) (五)(五)读写操作时序 (8) (六)(六)交流参数 (11) (七)(七)软件初始化过程 (12) (八)(八)应用举例 (13) (九)(九)附录 1半宽字符表 (20) 2 汉字字符表 (21) 一、概述 FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: ●●低电源电压(VDD:+3.0--+5.5V)

●●显示分辨率:128×64点 ●●内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) ●●内置 128个16×8点阵字符 ●●2MHZ时钟频率 ●●显示方式:STN、半透、正显 ●●驱动方式:1/32DUTY,1/5BIAS ●●视角方向:6点 ●●背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 ●●通讯方式:串行、并口可选 ●●内置DC-DC转换电路,无需外加负压 ●●无需片选信号,简化软件设计 ●●工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 二、方框图 3、外形尺寸图

在12864显示任意图片及参考程序

用12864显示单色图片 首先介绍本12864液晶显示器: 型号:QC12864B 因为单片机读取的是数据,而不是直接的图片。得将图片进行取模,图片应该是单色图片,像素128*64。 下面我为大家介绍个实例。 ①、在电脑附件画图,首先设置属性

开始画图 保存文件,注意格式: ②、然后进行取模。

③、编程: #include #define uchar unsigned char #define uint unsigned int //宏定义 #define lcd P2 //数据端口 sbit rs=P1^2; //指令/数据选择信号 sbit rw=P1^1; //读写选择信号 sbit e=P1^0; //使能端 sbit psb=P1^3; //串并选择端,高电平为并行,低电平为串行 uchar code ai[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xCE,0x00,0x00,0x00,0x00,0x00,0x01,0xC1,0xE0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x03,0x31,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x0E,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0x9B,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0x82,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x00, 0x00,0x00,0x00,0xF8,0xEF,0x00,0x00,0x00,0x00,0x00,0x1B,0xFC,0x1E,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0xFE,0x00,0x00,0x00,0x00,0x00,0x1E,0x60,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x20,0x00,0x00,0x00,

相关主题
文本预览
相关文档 最新文档