液晶显示模块应用系统.docx
《液晶显示模块应用系统.docx》由会员分享,可在线阅读,更多相关《液晶显示模块应用系统.docx(33页珍藏版)》请在冰豆网上搜索。
液晶显示模块应用系统
液晶显示模块应用系统
一、设计任务:
设计完成一个液晶显示系统。
二、设计要求:
能够在液晶显示块上显示文字、图形、符号等。
完成以左移、右移、上移、下移的方式循环显示任意长度的文字。
三、仪器、仪表:
单片机、仿真机、万用表等。
四、元件清单:
液晶显示块1块按钮3个
电阻10K2个电容22uF1个
5.1K3个
五、完成时间:
一周
六、评分标准:
项目
满分
基本要求
完成汉字字模的提取
10
完成在液晶显示模块上显示相应的内容
15
完成以上、下、左、右等方式移动
25
完成循环移动
10
报告
完成原理图的设计
10
完成程序的编写
20
总结
10
七、原理:
本系统以单片机为核心,辅以12864液晶显示模块电路,构成了基于汉字库应用技术的点阵型液晶显示器。
硬件结构简单,其功能主要由单片机来完成。
并根据人眼的滞留时间不超过20ms,利用定时记数器T0定时控制。
能够循环显示要显示的内容。
GXM—12864的电路结构特点
GXM—12864是使用HD61202作为列驱动器,同时使用HD61203作为行驱动器的液晶模块。
由于HD61203不与MPU发生联系,只要提供电源就能产生行驱动信号和各种同步信号,结构比较简单。
GXM—12864共有两片HD61202和一片HD61203。
其显示区分为两部分(左区和右区)。
因此,在写入程序时要先判断在哪个区,所写的数据是否超出当前所在区的地址范围。
GXM—12864一共有64行,128列。
GXM—12864的内部结构电路如下图:
。
HD61202的时序
HD61202具有能与微处理器直接接口的时序。
各种信号波形对照如上图所示:
读写数据指令每执行完一次读写操作,列地址就自动加一。
必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。
八、程序原理图设计:
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
N
YN
写代码直到字符长度和页数均为0
判是否为表的最后一个数?
据?
指针指向下一个表
取数据给各区写代码把字符长度放在计数器中
指向另1字符数据表
判是否为表的最后一个数?
据?
实现左移
设置定时长度定时
26H=?
END
取字符长度值指针入堆栈
指针指向西文字符表
确定字符表地址
取字符表数据和列地址值
判是否在左区?
是否在右区?
Y
(1)
(1)
N
Y
(2)
(4)
Y
(2)
N
Y
N
(3)
字符长度是否为0
返回到“实现左移”
返回到(4)
(3)
Y
十、程序如下:
ORG0000H
COMEQU20H
COLUMNEQU21H
MODLEEQU22H
DATEQU23H
COLADDEQU24H
START_LINEEQU25H
COUNTEQUR5
CWADD2EQU0800H
CRADD2EQU0A00H
DWADD2EQU0900H
DRADD2EQU0B00H
CWADD3EQU0400H
CRADD3EQU0600H
DWADD3EQU0500H
DRADD3EQU0700H
DRADD2EQU0B00H
;/////////////////////主程序
MAIN:
MOVSP,#40H
LCALLINT;///////////调初始化子程序
LCALLCLEAR;///////////调清显示RAM区子程序
MOVCOLADD,#0
OOO0:
MOVDPTR,#CHAR
LCALLZHONGWEN
MOVDPTR,#TABLE
LCALLDISPLAY
DECCOLADD
MOV27H,#20
LCALLAAL
SJMPOOO0
;///////////////////
MOVE_R:
INCCOLADD
MOVDPTR,#CHAR
LCALLZHONGWEN
MOVDPTR,#TABLE
LCALLDISPLAY
MOV27H,#100
LCALLAAL
DJNZR1,MOVE_R
RET
MOVE_L:
DECCOLADD
MOVDPTR,#CHAR
LCALLZHONGWEN
MOVDPTR,#TABLE
LCALLDISPLAY
MOV27H,#100
LCALLAAL
DJNZR1,MOVE_L
RET
MOVE_UP:
INCSTART_LINE
MOVA,START_LINE
MOVCOM,A
LCALLLI
LCALLRIT
MOV27H,#250
LCALLAAL
MOVA,START_LINE
CJNEA,#0FFH,HH
HH:
JCMOVE_UP
RET
MOVE_DOWN:
DECSTART_LINE
MOVA,START_LINE
MOVCOM,A
LCALLLI
LCALLRIT
MOV27H,#250
LCALLAAL
MOVA,START_LINE
CJNEA,#0C0H,HHF
HHF:
JNCMOVE_DOWN
RET
;/////////////////////
MOVE_WEN:
DECCOLADD
MOV27H,#50
LCALLINT
LCALLAAL
MOVDPTR,#CHAR
LCALLZHONGWEN
DJNZR1,MOVE_WEN
RET
;/////////////////////WEST_DISPLAY
DISPLAY1:
INCDPTR
DISPLAY:
CLRA;WRITE_PAGE
MOVCA,@A+DPTR
ORLA,#0B8H
MOVCOM,A
LCALLLI
LCALLRIT
;////////////////////////////写起始页
CLRA;FIND_COLUMN&
INCDPTR
MOVCA,@A+DPTR
ADDA,COLADD
MOVCOLUMN,A
;///////////////////////////写起始列
CLRA;FIND_MODLE
INCDPTR
MOVCA,@A+DPTR
MOVMODLE,A
;//////////////////////////写字符总长
QQ:
MOVCOUNT,MODLE
CLRA
INCDPTR
MOVCA,@A+DPTR
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:
CLRA
MOVCA,@A+DPTR
MOVDAT,A
MOVA,COLUMN;/////////判断列地址是否超出区域范围
CJNEA,#40H,AA
AA:
JNCBB;/////////未超出则继续
ORLA,#40H
MOVCOM,A
LCALLLI
LCALLLD
SJMPKK
BB:
MOVA,COLUMN;////////超出则判在何区域
CJNEA,#80H,CC
CC:
JNCKK
CLRC
SUBBA,#40H
ORLA,#40H
MOVCOM,A
LCALLRIT
LCALLRD
KK:
INCCOLUMN
INCDPTR
DJNZCOUNT,UU
POPDPH
POPDPL
SJMPQQ
GIVE_UPL:
POPDPH
POPDPL
GIVE_UP:
RET
;//////////////////////////////CHARACTERDISPLAY
ZHONGWEN:
MOVR0,#2;/////////字的高度
CLRPSW.5
XXL:
PUSHDPL
PUSHDPH
PUSHDPL
PUSHDPH
XX:
POPDPH
POPDPL
CLRA
MOVCA,@A+DPTR
JNBPSW.5,ZZ;/////////判完成标志位是否为“1”
DECA
ZZ:
ORLA,#0B8H
MOVCOM,A
LCALLLI
LCALLRIT
INCDPTR
CLRA
MOVCA,@A+DPTR
ADDA,COLADD
MOVCOLUMN,A
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVR7,A;/////////总字符长
JBPSW.5,AGAINE
SJMPAGAIN
AGAINE:
INCDPTR
AGAIN:
CLRA
INCDPTR
MOVCA,@A+DPTR
MOVDAT,A
MOVA,COLUMN;///////判列地址是否超出区域范围
CJNEA,#40H,D1
D1:
JNCD2
ORLA,#40H;//////未超出则继续
MOVCOM,A
LCALLLI
LCALLLD
SJMPOLE
D2:
CJNEA,#80H,D3;/////超出则判在何区域
D3:
JNCOLE
CLRC
SUBBA,#40H
ORLA,#40H
MOVCOM,A
LCALLRIT
LCALLRD
OLE:
INCCOLUMN
DJNZR7,AGAINE
SETBPSW.5;/////设置完成标志位
DJNZR0,XX
INCDPTR
CLRA
MOVCA,@A+DPTR
CJNEA,#0FFH,W1
W1:
JNCWANGLE
INCDPTR
MOVR0,#2
CLRPSW.5
SJMPXXL
WANGLE:
RET
;/////////////////////////;LEFT_INSTRUTION&DATA
LI:
PUSHDPL;/////////片选左区
PUSHDPH
MOVDPTR,#CRADD3;/////////设置读状态字地址
LII:
MOVXA,@DPTR;/////////读状态字
JBACC.7,LII;//////////判“忙”标志为“0”否,否再读
MOVDPTR,#CWADD3;//////////设置写指令代码地址
MOVA,COM;//////////取指令代码
MOVX@DPTR,A;///////////写指令代码
POPDPH
POPDPL
RET
LD:
PUSHDPL;/////////片选左区
PUSHDPH
MOVDPTR,#CRADD3;/////////设置读状态字地址
LDD:
MOVXA,@DPTR;/////////读状态字
JBACC.7,LDD;//////////判“忙”标志为“0”否,否再读
MOVDPTR,#DWADD3;//////////设置写显示数据地址
MOVA,DAT;////////取数据
MOVX@DPTR,A;//////////写数据
POPDPH
POPDPL
RET
;///////////////////////RIGHT_INSTRUTION&DATA
RIT:
PUSHDPL;/////////片选右区
PUSHDPH
MOVDPTR,#CRADD2;/////////设置读状态字地址
RII:
MOVXA,@DPTR;/////////读状态字
JBACC.7,RII;//////////判“忙”标志为“0”否,否再读
MOVDPTR,#CWADD2;//////////设置写指令代码地址
MOVA,COM;//////////取指令代码
MOVX@DPTR,A;///////////写指令代码
POPDPH
POPDPL
RET
RD:
PUSHDPL;/////////片选右区
PUSHDPH
MOVDPTR,#CRADD2;/////////设置读状态字地址
RDD:
MOVXA,@DPTR;/////////读状态字
JBACC.7,RDD;//////////判“忙”标志为“0”否,否再读
MOVDPTR,#DWADD2;//////////设置写显示数据地址
MOVA,DAT;////////取数据
MOVX@DPTR,A;//////////写数据
POPDPH
POPDPL
RET
;/////////////////////////ON_TIME
AAL:
MOVTH0,#0DCH
MOVTL0,#0
SETBTR0
CLRTF0
JNBTF0,$
DJNZ27H,AAL
CLRTR0
CLRTF0
RET
;///////////////////////初始化程序
INT:
MOVCOM,#0C0H;/////////////设置显示起始行
MOVSTART_LINE,COM
LCALLLI
LCALLRIT
MOVCOM,#3FH;////////////开显示设置
LCALLLI
LCALLRIT
RET
;//////////////////////清显示RAM区程序
CLEAR:
MOVR4,#00H;/////////////////页面地址暂存器设置
CLEAR1:
MOVA,R4
ORLA,#0B8H
MOVCOM,A;////////////////页面地址设置
LCALLLI
LCALLRIT
MOVCOM,#40H;///////////////列地址设置为“0”
LCALLLI
LCALLRIT
MOVR3,#40H;///////////////一页清64各字节
;/////////////////////
CLEAR2:
MOVDAT,#00H;////////////////显示数据为“0”
LCALLLD
LCALLRD
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