12864很好的资料Word格式文档下载.docx
《12864很好的资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《12864很好的资料Word格式文档下载.docx(35页珍藏版)》请在冰豆网上搜索。
D/I=“L”,表示DB7∽DB0为显示指令数据
5
R/W
R/W=“H”,E=“H”数据被读到DB7∽DB0
R/W=“L”,E=“H→L”数据被写到IR或DR
6
E
R/W=“L”,E信号下降沿锁存DB7∽DB0
R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0
7
DB0
数据线
8
DB1
9
DB2
10
DB3
11
DB4
12
DB5
13
DB6
14
DB7
15
CS1
H:
选择芯片(右半屏)信号
16
CS2
选择芯片(左半屏)信号
17
RET
复位信号,低电平复位
18
VOUT
-10V
LCD驱动负电压
19
LED+
LED背光板电源
20
LED-
表1:
12864LCD的引脚说明
在使用12864LCD前先必须了解以下功能器件才能进行编程。
12864内部功能器件及相关功能如下:
1.指令寄存器(IR)
IR是用于寄存指令码,与数据寄存器数据相对应。
当D/I=0时,在E信号下降沿的作用下,指令码写入IR。
2.数据寄存器(DR)
DR是用于寄存数据的,与指令寄存器寄存指令相对应。
当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。
DR和DDRAM之间的数据传输是模块内部自动执行的。
3.忙标志:
BF
BF标志提供内部工作情况。
BF=1表示模块在内部操作,此时模块不接受外部指令和数据。
BF=0时,模块为准备状态,随时可接受外部指令和数据。
利用STATUSREAD指令,可以将BF读到DB7总线,从检验模块之工作状态。
4.显示控制触发器DFF
此触发器是用于模块屏幕显示开和关的控制。
DFF=1为开显示(DISPLAYOFF),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAYOFF)。
DDF的状态是指令DISPLAYON/OFF和RST信号控制的。
5.XY地址计数器
XY地址计数器是一个9位计数器。
高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。
X地址计数器是没有记数功能的,只能用指令设置。
Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。
6.显示数据RAM(DDRAM)
DDRAM是存储图形显示数据的。
数据为1表示显示选择,数据为0表示显示非选择。
DDRAM与地址和显示位置的关系见DDRAM地址表。
7.Z地址计数器
Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。
当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。
Z地址计数器可以用指令DISPLAYSTARTLINE预置。
因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。
此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
12864LCD的指令系统及时序
该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。
其指令表如表2所示:
指令名称
控制信号
控制代码
RS
显示开关
1/0
显示起始行设置
X
页设置
列地址设置
读状态
BUSY
ON/OFF
RST
写数据
读数据
表2:
12864LCD指令表
各功能指令分别介绍如下。
∙显示开/关指令
R/WRS
DB7DB6DB5DB4DB3DB2DB1DB0
00
00111111/0
当DB0=1时,LCD显示RAM中的内容;
DB0=0时,关闭显示。
2、显示起始行(ROW)设置指令
11显示起始行(0~63)
该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。
3、页(PAGE)设置指令
10111页号(0~7)
显示RAM共64行,分8页,每页8行。
4、列地址(YAddress)设置指令
01显示列地址(0~63)
设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以
用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
BUSY0ON/OFFREST0000
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
BUSY:
1-内部在工作0-正常状态
ON/OFF:
1-显示关闭0-显示打开
RESET:
1-复位状态0-正常状态
在BUSY和RESET状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。
在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。
6、写数据指令
01
∙读数据指令
读显示数据
读、写数据指令每执行完一次读、写操作,列地址就自动增一。
必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据
12864液晶原理分析1
专业—51单片机2010-02-2414:
50:
31阅读154评论4字号:
大中小
[转自本人QQ空间,发表于2009年08月19日22:
14]
辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理……
芯片:
YM12864RP-1控制芯片:
ST7920A
带中文字库
初步小结:
1、
控制芯片不同,寄存器定义会不同
2、
显示方式有并行和串行,程序不同
3、
含字库芯片显示字符时不必对字符取模了
4、
对芯片的结构地址一定要理解清楚
5、
显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚
6、
显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚
7、
显示汉字时的二级单元(一级为八位数据写入单元)要清楚
8、
显示图片时的二级单元(一级为八位数据写入单元)要清楚
12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8bits显示数据RAM。
左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。
显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。
512*8bitsRAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。
每个存储单元存储8个液晶点的显示信息。
为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。
每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。
(注意:
二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。
即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。
因此存储单元地址包括页地址(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控制器进行不同的数据操作,可以得到不同的结果。
图1“A”字模图
而中文的“你”在字模中的记载却如图2所示:
图2“你”字模图
图3
图4字符二级单元(图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了~(串行无字符库的后面再做分析)
图5:
垂直坐标:
上半屏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<
stdio.h>
reg52.h>
intrins.h>
string.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeLCD_data1[];
ucharcodeLCD_data2[];
ucharcodeLCD_picture1[];
ucharcodeLCD_picture2[];
sbitRS=P2^4;
sbitRW=P2^5;
sbitEN=P2^6;
sbitPSB=P2^1;
sbitRES=P2^3;
sbitDataport=P0;
sbitBusyport=P0^7;
//////////////////////////////////////////////////////////////
void
delay_ms(unsignedintn)
//延时10×
n毫秒程序
{
unsignedinti,j;
for(i=0;
n;
i++)
2000;
j++);
}
delay(unsignedintm)
//1US延时程序
unsignedinti,j;
m;
10;
///////////////////////////////////////////////////////////////
//判LCM忙子函数
voidcheck_LCD_busy(void)
Dataport=0xff;
RS=0;
RW=1;
EN=1;
while(Busyport);
EN=0;
//写命令子函数
voidwrite_com(ucharCommand)
check_LCD_busy();
RW=0;
RS=0;
delay
(1);
P0=Command;
EN=1;
EN=0;
////////////////////////////////////////////////////////////////
//写数据子函数
voidwrite_data(ucharData)
RS=1;
P0=Data;
/////////////////////////////////////////////////////////////////
//LCM清屏函数
voidlcdClear(void)
write_com(0x01);
//LCM复位函数
voidreset()
RES=0;
//复位
//延时
RES=1;
//复位置高
delay(10);
//显示汉字
voiddispString(ucharX,Y,uchar*msg)
//X为哪一行,Y为哪一列。
msg为汉字
if(X==0)
X=0x80;
//第一行,汉字显示坐标
elseif(X==1)X=0x90;
//第二行
elseif(X==2)X=0x88;
//第三行
else
X=0x98;
//第四行
Y=X+Y;
//Y为1往右移一位
write_com(Y);
//写入坐标
while(*msg)
write_data(*msg++);
//显示汉字
//显示图象
voiddisppicture(ucharcode*adder)
uinti,j;
//*******显示上半屏内容设置
for(i=0;
//上半屏32个列地址
{
write_com(0x80+i);
//SET
垂直地址VERTICALADD
write_com(0x80);
//SET
水平地址HORIZONTALADD
for(j=0;
j++)
{
write_data(*adder);
adder++;
}
//*******显示下半屏内容设置
//
write_com(0x80+i