1 线段的显示
点阵图形式液晶显示模块由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1B的8位,即每行有16B,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024B相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如,屏的第一行的亮暗由RAM区的000H~00FH 16B的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH、(001H)=00H、(002H)=FFH、…(00EH)=FFH、(00FH)=00H时,则在屏幕的顶部显示一条由8条亮线和8条暗线组成的虚线。
先设垂直地址,再设水平地址,RAM的地址计数器(AC)只会对水平地址(X轴)自动加1,当水平地址为00FH时会重新设为00H,但并不会对垂直地址做进位自动加1,故当连续写入多笔信息时,程序需自行判断垂直地址是否需重新设定。
2 字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8B,还要使每字节的不同位为“1”,其他的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但对于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
3 汉字的显示
汉字的显示一般采用图形的方式,事先从微机中提取要显示汉字的点阵码(一般用字模提取软件)。欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。不过在显示连续字符时,只需设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。当字符编码为2B时,应先写入高位字节,再写入低位字节。
每个汉字占32B,分左右两半,各占16B,左边为1、3、5等,右边为2、4、6等,可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一个字节,光标位置加1;再送上第二个字节,换行并且按列对齐(两列),依次再送上第三个字节……直到32B显示完就可以在LCD上得到一个完整的汉字。
4 LM12864初始化
对LM12864的初始化,实质上是对其进行指令系统中的指令操作。LM12864驱动控制器的指令系统并非是单片机内部执行相关操作的命令,而是通过接口电路对LM12864的引脚信号设置相应命令编码,主要通过相应程序来实现。
例6-1:让字符型液晶显示模块显示两行字串“WELLCOME”和“TESTLCD”。
解:字符型液晶显示模块显示两行字串“WELLCOME”和“TESTLCD”的显示位置如表6-9所示,接口电路图如图6-17所示。
表6-9 “WELLCOME”和“TESTLCD”显示位置
图6-17 LM12864液晶显示模块的接口电路
让字符型LM12864显示两行字串“WELLCOME”和“TESTLCD”的程序如下。
ORG 0000H;程序从地址0000H开始存放
JMP BEGIN;跳到BEGIN处执行程序
ORG 0030H
BEGIN:LCALL Initial;调用启动字符型液晶显示模块的子程序
LCALL CLS;调用清除显示器子程序
MOV A,#80H;将80H送入累加器,设定DDRAM的地址为00H,
;即将光标移到第1行第1列的位置上
LCALL Write Instruction;调用将指令码写到IR指令寄存器的子程序
MOV DPTR,#LINE1;将第1行字符串按程序存储器的起始地址存入DPTR
LCALL STRING;调用STRING子程序,将字符串放到液晶显示屏上显示
MOV A,#C0H;将C0H送入累加器,设定DDRAM的地址为40H,
;即将光标移到第2行第1列的位置上
LCALL Write Instruction;调用将指令码写到IR指令寄存器的子程序
MOV DPTR,#LINE1;将第2行字符串按程序存储器的起始地址存入DPTR
LCALL STRING;调用STRING子程序,将字符串放到液晶显示屏上显示
JMP BEGIN;执行多次循环
STRING:PUSH ACC
PLOOP:CLR A;清除ACC的内容
MOVC A,@A+DPTR;按照DPTR与ACC的值从程序存储器中读取数据存入ACC
JZ ENDPR;判断ACC的值是否为零,若ACC的值为零,结束显示字符串
LCALL Write LCD Data;调用将数据写到DR数据寄存器的子程序
INC DPTR;将DPTR中的值加1,以便显示字符串的下一个字符
JMP PLOOP;跳到标记PLOOP处继续执行程序
ENDPR:POP ACC
RET
LINE1:DB′WELLCOME′,00H;在液晶显示屏上显示出的第1行字符串内容为“WELLCOME”
LINE2:DB′TESTLCD′,00H;在液晶显示屏上显示出的第2行字符串内容为“TESTLCD”
END
LM12864接口设置单片机片内RAM的40H~5FH共32个单元为显示缓冲区,其中40H~4FH这16个单元对应液晶显示模块的第1行,50H~5FH这16个单元对应液晶显示模块的第2行。其显示控制程序清单如下:
ORG 0000H;程序从地址0000H开始存放
JMP BEGIN
ORG 0030H
BEGIN:MOV SP,#20H
MOV DPTR,#TAB
MOV R7,#32;共32个字符
MOV R1,#40H;设置单片机显示缓冲区的首地址
BUF:CLR A;将32个字符的ASCII码送到单片机的显示缓冲区
MOVC A,@A+DPTR
MOV @R1,A
INC DPTR
INC R1
DJNZ R7,BUF
CLR P1.0
SETB P1.0;产生一正脉冲,使液晶显示模块使能(www.xing528.com)
MOV A,#38H;功能设置为8位、双行显示、5×7点阵
ACALL WR1
MOV A,#01H;清屏
ACALL WR1
MOV A,#0FH;开显示、开光标、光标闪烁
ACALL WR1
MOV A,#06H;进入模式设置,所显示字符不移位,光标移位,DDRAM写入时地址加1
ACALL WR1
MOV A,#80H;写入DDRAM首地址(第1行)
ACALL WR1
MOV R0,#40H;单片机显示缓冲区的首地址
MOV R7,#16;第1行共显示16个字符
DDRAM1:ACALL RD1
INC R0
DJNZ R7,DDRAM1
MOV A,#C0H;写入DDRAM首地址(第2行)
SETB P1.0
ACALL WR1
MOV R0,#50H;单片机显示缓冲区的第2行首地址
MOV R7,#16;第2行共显示16个字符
DDRAM2:ACALL RD1
INC R0
DJNZ R7,DDRAM2
WR1:MOV R3,A;把控制字保存在R3中
CLR P1.2;RS=0,选择指令寄存器
CLR P1.1;RW=1,检查“忙”状态
BUSY1:MOV A,P0
RLC A
JC BUSY1;BF=1,进行等待
SETB P1.1;RW=0,进入写方式
CLR P1.0;写入指令码
SETB P1.0
MOV A,R3
ACALL DL0;延时,确保数据操作有效稳定
RET
RD1:CLR P1.2;RS=0,选择指令寄存器
CLR P1.1;RW=1,读“忙”标志
BUSYD:MOV A,P0
RLC A
JC BUSYD;BF=1,进行等待
SETB P1.2;RS=1,选择数据寄存器
SETB P1.1;RW=0,单片机向液晶显示模块写数据
CLR P1.0
SETB P1.0
MOV A,@R0;从单片机的显示缓冲区中取出数据
MOV P0,A;将数据写入到液晶显示模块,进行显示
CLR P1.0
ACALL DL0;延时,确保数据操作有效稳定
RET
DL0:MOV R2,#7FH;延时约128ms,设振荡频率为6MHz
DL1:MOV R4,#0FAH
DL2:DJNZ R4,DL2;延时约1ms
DJNZ R2,DL1
RET
TAB:DB 57H,45H,4CH,4CH,43H,4FH,4DH,45H
DB 20H,54H,4FH,20H,20H,55H,53H,45H
DB 54H,48H,45H,20H,20H,20H,20H,20H
DB 20H,20H,20H,20H,20H,4CH,43H,4DH
END
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。