液晶显示模块应用系统Word格式文档下载.docx
《液晶显示模块应用系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《液晶显示模块应用系统Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
读写数据指令每执行完一次读写操作,列地址就自动加一。
必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。
八、程序原理图设计:
HD61202共有20个引脚。
/CSA,/CSB分别为芯片片选端低电平有效。
E为读写使能端其在下降沿时,数据被锁存即写入HD61202;
高电平期间,数据被读出。
R/W为读写选择信号端,当R/W=1时为读选通,当R/W=0时为写选通。
D/I为数据,指令选择信号端,当D/I=1时为数据操作,D/I=0时为写指令或读状态。
RST为复位端。
DB0~DB7为数据总线。
GXM—12864液晶显示的明暗度是可调节的,主要是通过调节连接在LEDK,VEE.V0上的电位器连入电路的电阻就可以了。
另外还有电源和接地端。
其和单片机的连接如下图所示:
九、系统流程图:
本系统采用模块化设计。
GXM—12864共64行,分为8页每页又包含8行,在编程过程当中汉字采用16*16的点阵符,英文采用8*8点阵。
因此,每个汉字占2页用寄存器R0设置其值。
本程序先给程序初始化再清显示RAM区,为了使程序结构简单化,在汉字库对输入的汉字生成的点阵ASM数据前添加三个数据,其分别为显示起始页显示起始列所写入的汉字的长度。
用查表指针取得相应的数据,并把它放在寄存器中保存起来。
为了便于区别还设置了一个当前的列寄存器,以实现字符的左移,右移。
设置了一个行寄存器,通过加减其值实现上下移动。
本程序通过查表取得相应字符的点阵ASM数据,并根据这个数据确定查表指针应该指向哪个表确定表的地址。
从显示起始列寄存器取得起始列的值,由这个值判断它在哪个区,如果它小于#40H则在左区,如果它大于#40H小于80H则在右区,大于80H则转为左区。
通过定时器定时,控制字符移动的速度。
由于GXM—12864共128列,64行,所以显示区一次一行只能写8个汉字。
在给每个区写数据和指令代码时,首先要判断状态字的标志位是否“忙”。
如果不忙则继续写指令代码或显示数据,反之,则继续读状态字。
为了避免出现从复,还设置了完成标志位,通过判断标志位是否为“0”来确定其是否已经写完了。
其具体流程图如下:
主程序流程图:
清显示RAM区
设置列地址间接寄存器
COLADD#0
设置完成标志位
查表取数据
指针指向字符表并设置字高
判完成标志位是否为0
写各区的代码
进入另一页
判是否在左区?
判是否在右区?
(2)
N
Y
YN
写代码直到字符长度和页数均为0
判是否为表的最后一个数?
据?
指针指向下一个表
取数据给各区写代码把字符长度放在计数器中
指向另1字符数据表
实现左移
设置定时长度定时
26H=?
END
取字符长度值指针入堆栈
指针指向西文字符表
确定字符表地址
取字符表数据和列地址值
是否在右区?
Y
(1)
(1)
Y
(4)
Y
(2)
Y
(3)
字符长度是否为0
返回到“实现左移”
返回到(4)
(3)
十、程序如下:
ORG0000H
COMEQU20H
COLUMNEQU21H
MODLEEQU22H
DATEQU23H
COLADDEQU24H
START_LINEEQU25H
COUNTEQUR5
CWADD2EQU0800H
CRADD2EQU0A00H
DWADD2EQU0900H
DRADD2EQU0B00H
CWADD3EQU0400H
CRADD3EQU0600H
DWADD3EQU0500H
DRADD3EQU0700H
;
/////////////////////主程序
MAIN:
MOVSP,#40H
LCALLINT;
///////////调初始化子程序
LCALLCLEAR;
///////////调清显示RAM区子程序
MOVCOLADD,#0
OOO0:
MOVDPTR,#CHAR
LCALLZHONGWEN
MOVDPTR,#TABLE
LCALLDISPLAY
DECCOLADD
MOV27H,#20
LCALLAAL
SJMPOOO0
///////////////////
MOVE_R:
INCCOLADD
MOV27H,#100
DJNZR1,MOVE_R
RET
MOVE_L:
DECCOLADD
DJNZR1,MOVE_L
MOVE_UP:
INCSTART_LINE
MOVA,START_LINE
MOVCOM,A
LCALLLI
LCALLRIT
MOV27H,#250
LCALLAAL
CJNEA,#0FFH,HH
HH:
JCMOVE_UP
RET
MOVE_DOWN:
DECSTART_LINE
CJNEA,#0C0H,HHF
HHF:
JNCMOVE_DOWN
/////////////////////
MOVE_WEN:
MOV27H,#50
LCALLINT
MOVDPTR,#CHAR
LCALLZHONGWEN
DJNZR1,MOVE_WEN
/////////////////////WEST_DISPLAY
DISPLAY1:
INCDPTR
DISPLAY:
CLRA;
WRITE_PAGE
MOVCA,@A+DPTR
ORLA,#0B8H
MOVCOM,A
LCALLLI
LCALLRIT
////////////////////////////写起始页
CLRA;
FIND_COLUMN&
INCDPTR
ADDA,COLADD
MOVCOLUMN,A
///////////////////////////写起始列
FIND_MODLE
MOVMODLE,A
//////////////////////////写字符总长
QQ:
MOVCOUNT,MODLE
CLRA
CJNEA,#0FFH,PART1
PART1:
JNCGIVE_UP
CJNEA,#0FEH,PART2
PART2:
JNCDISPLAY1;
NEXTLINE
NEXT:
MOVB,MODLE
PUSHDPL
PUSHDPH
MOVDPTR,#TAB
MULAB
ADDA,DPL;
//////////字符字模块首地址
MOVDPL,A
MOVA,B
ADDCA,DPH
MOVDPH,A
UU:
MOVDAT,A
MOVA,COLUMN;
/////////判断列地址是否超出区域范围
CJNEA,#40H,AA
AA:
JNCBB;
/////////未超出则继续
ORLA,#40H
LCALLLD
SJMPKK
BB:
MOVA,COLUMN;
////////超出则判在何区域
CJNEA,#80H,CC
CC:
JNCKK
CLRC
SUBBA,#40H
LCALLRD
KK:
INCCOLUMN
DJNZCOUNT,UU
POPDPH
POPDPL
SJMPQQ
GIVE_UPL:
POPDPH
POPDPL
GIVE_UP:
RET
//////////////////////////////CHARACTERDISPLAY
ZHONGWEN:
MOVR0,#2;
/////////字的高度
CLRPSW.5
XXL:
PUSHDPH
PUSHDPL
XX:
POPDPH
CLRA
MOVCA,@A+DPTR
JNBPSW.5,ZZ;
/////////判完成标志位是否为“1”
DECA
ZZ:
ORLA,#0B8H
INCDPTR
ADDA,COLADD
MOVCOLUMN,A
MOVR7,A;
/////////总字符长
JBPSW.5,AGAINE
SJMPAGAIN
AGAINE:
INCDPTR
AGAIN:
CLRA
MOVA,COLUMN;
///////判列地址是否超出区域范围
CJNEA,#40H,D1
D1:
JNCD2
ORLA,#40H;
//////未超出则继续
SJMPOLE
D2:
CJNEA,#80H,D3;
/////超出则判在何区域
D3:
JNCOLE
OLE:
INCCOLUMN
DJNZR7,AGAINE
SETBPSW.5;
/////设置完成标志位
DJNZR0,XX
CJNEA,#0FFH,W1
W1:
JNCWANGLE
MOVR0,#2
CLRPSW.5
SJMPXXL
WANGLE:
/////////////////////////;
LEFT_INSTRUTION&
DATA
LI:
PUSHDPL;
/////////片选左区
MOVDPTR,#CRADD3;
/////////设置读状态字地址
LII:
MOVXA,@DPTR;
/////////读状态字
JBACC.7,LII;
//////////判“忙”标志为“0”否,否再读
MOVDPTR,#CWADD3;
//////////设置写指令代码地址
MOVA,COM;
//////////取指令代码
MOVX@DPTR,A;
///////////写指令代码
LD:
PUSHDPH
LDD:
JBACC.7,LDD;
MOVDPTR,#DWADD3;
//////////设置写显示数据地址
MOVA,DAT;
////////取数据
//////////写数据
///////////////////////RIGHT_INSTRUTION&
RIT:
/////////片选右区
MOVDPTR,#CRADD2;
RII:
JBACC.7,RII;
MOVDPTR,#CWADD2;
RD:
RDD:
JBACC.7,RDD;
MOVDPTR,#DWADD2;
/////////////////////////ON_TIME
AAL:
MOVTH0,#0DCH
MOVTL0,#0
SETBTR0
CLRTF0
JNBTF0,$
DJNZ27H,AAL
CLRTR0
///////////////////////初始化程序
INT:
MOVCOM,#0C0H;
/////////////设置显示起始行
MOVSTART_LINE,COM
MOVCOM,#3FH;
////////////开显示设置
//////////////////////清显示RAM区程序
CLEAR:
MOVR4,#00H;
/////////////////页面地址暂存器设置
CLEAR1:
MOVA,R4
MOVCOM,A;
////////////////页面地址设置
MOVCOM,#40H;
///////////////列地址设置为“0”
MOVR3,#40H;
///////////////一页清64各字节
CLEAR2:
MOVDAT,#00H;
////////////////显示数据为“0”
DJNZR3,CLEAR2;
///////////////页内字节清零循环
INCR4
CJNER4,#08H,CLEAR1;
/////////RAM区清零循环
RET
//////////////////////////////////
TABLE:
DB7,0,8,37H,25H,2CH,23H,2FH,2DH,25H,00H;
PAGE,COLUMN_START,MODLE,DATA
DB34H,2FH,00H,2FH,35H,32H,00H,33H,23H
DB28H,2FH,2FH,2CH,01H,0FFH
/////////////////////////////////////////////////
TAB:
DB000H,000H,000H,000H,000H,000H,000H,000H;
空格=00H
DB000H,000H,000H,04FH,000H,000H,000H,000H;
!
=01H
DB000H,000H,007H,000H,007H,000H,000H,000H;
"
=02H
DB000H,014H,07FH,014H,07FH,014H,000H,000H;
#=03H
DB000H,024H,02AH,07FH,02AH,012H,000H,000H;
$=04H
DB000H,023H,013H,008H,064H,062H,000H,000H;
%=05H
DB000H,036H,049H,055H,022H,050H,000H,000H;
&
=06H
DB000H,000H,005H,003H,000H,000H,000H,000H;
'
=07J
DB000H,000H,01CH,022H,041H,000H,000H,000H;
(=08H
DB000H,000H,041H,022H,01CH,000H,000H,000H;
)=09H
DB000H,014H,008H,03EH,008H,014H,000H,000H;
*=0AH
DB000H,008H,008H,03EH,008H,008H,000H,000H;
+=0BH
DB000H,000H,050H,030H,000H,000H,000H,000H;
;
=0CH
DB000H,008H,008H,008H,008H,008H,000H,000H;
-=0DH
DB000H,000H,060H,060H,000H,000H,000H,000H;
.=0EH
DB000H,020H,010H,008H,004H,002H,000H,000H;
/=0FH
DB000H,03EH,051H,049H,045H,03EH,000H,000H;
0=10H
DB000H,000H,042H,07FH,040H,000H,000H,000H;
1=11H
DB000H,042H,061H,051H,049H,046H,000H,000H;
2=12H
DB000H,021H,041H,045H,04BH,031H,000H,000H;
3=13H
DB000H,018H,014H,012H,07FH,010H,000H,000H;
4=14H
DB000H,027H,045H,045H,045H,039H,000H,000H;
5=15H
DB000H,03CH,04AH,049H,049H,030H,000H,000H;
6=16H
DB000H,001H,001H,079H,005H,003H,000H,000H;
7=17H
DB000H,036H,049H,049H,049H,036H,000H,000H;
8=18H
DB000H,006H,049H,049H,029H,01EH,000H,000H;
9=19H
DB000H,000H,036H,036H,000H,000H,000H,000H;
:
=1AH
DB000H,000H,056H,036H,000H,000H,000H,000H;
=1BH
DB000H,008H,014H,022H,041H,000H,000H,000H;
<
=1CH
DB000H,014H,014H,014H,014H,014H,000H,000H;
==1DH
DB000H,000H,041H,022H,014H,008H,000H,000H;
>
=1EH
DB000H,002H,001H,051H,009H,006H,000H,000H;
?
=1FH
DB000H,032H,049H,079H,041H,03EH,000H,000H;
@=20H
DB000H,07EH,011H,011H,011H,07EH,000H,000H;
A=21H
DB000H,041H,07FH,049H,049H,036H,000H,000H;
B=22H
DB000H,03EH,041H,041H,041H,022H,000H,000H;
C=23H
DB000H,041H,07FH,041H,041H,03EH,000H,000H;
D=24H
DB000H,07FH,049H,049H,049H,049H,000H,000H;
E=25H
DB000H,07FH,009H,009H,009H,001H,000H,000H;
F=26H
DB000H,03EH,041H,041H,04