液晶显示与单片机的接口与编程方法
]=peekb(ascii_es,ascii_offset+j); /*读16 字节点阵数据*/
for(m=0;m《16;m++) /*点阵数据转换成LCD 格式数据*/
{ if(m《8) { beginbyte= 7; shiftn=“7”;}
else { beginbyte=“15”; shiftn=“15”;}
for(j=0;j《8;j++)
ascii8x16[m]=(ascii8x16[m]+ (buf[beginbyte-j]》》(shiftn-m))0x01)《《1;
} 也可选用UCDOS 的ASC16 文件做字模库。ASC16 文件的字符为8×16 点阵。所有字符按照ASCII 值从小到大升序排列。计算字符首地址的公式:字符首地址=字符的ASCII 码值×16+字模库首地址。
(2) 建立所用到的16×16 点阵字模库。汉字字符可选用UCDOS 的HZK16 文件做字模库。HZK16 文件的字符为16×16 点阵。所有字符按照区位码从小到大升序排列。计算汉字字符首地址的公式如下:汉字首地址=((区码-1)×94+位码-1)×32。作者用C 语言编写的读取UCDOS 点阵字库字模程序,完成字模读取、
数据重新排列,并按MCS-51 汇编程序的要求写成相应格式的文本文件。
p=((quma-1)*94+weima-1)*32;
cclibfile=“fopen”(“HZK16
”,“rb”);
fseek(cclibfile,(long)p,SEEK_SET);
fread(buf,sizeof(unsigned char),32,cclibfile); /*读32 字节点阵数据*/
for(m=0;m《32;m++){ /*点阵数据转换成LCD 格式数据*/
if(m《8) { beginbyte=“14”; shiftn=“7”;}
else if( m》= 8 m《16 ) { beginbyte=“15”; shiftn=“15”;}
else if( m》=16 m《24 ) { beginbyte=“30”; shiftn=“23”;}
else { beginbyte=“31”; shiftn=“31”;}
for(j=0;j《8;j++)
hzk16x16[m]=(hzk16x16[m]+ (buf[beginbyte-2*j] 》》(shiftn-m))0x01)《《1;
}
(3) 常用图形(如产品商标等)的点阵图形的建立。对已有的图形可采用扫描仪进行扫描,然后用图形处理软件进行处理,再将BMP 格式文件转换成MCS-51 的汇编文件的格式。
以上所有的字模数据都存放在单片机W78E58 的程序存储器中,如用到的汉字、图形较多,可选用较大容量的程序存储器。
通用子程序:通用子程序分左半屏、右半屏写指令代码子程序和写显示数据子程序。液晶显示驱动器HD16202 内部有个忙标志寄存器,当BF=1 时,表示内部操作正在运行,不能接受外部数据或指令。下面子程序中设指令代码寄存器为COMM,数据寄存器为DATA。
(COMM EQU 20H /*指令寄存器*/ DATA EQU 21H /*数据寄存器*/)
(1) 左半屏写指令子程序
WR_CMD1: MOV DPTR,#CRADR1 ;/*读状态字口地址*/ WAIT1: MOVX A,@DPTR ;/* 读状态字 */
JB ACC.7,WAIT1 ;/*判忙标志BF,如BF=1 忙,等待*/
MOV DPTR,#CWADR1 ;/*写指令字口地址*/
MOV A,COMM ;/*取指令代码*/
MOVX @DPTR,A ;/*写指令代码*/
RET
(2)左半屏写数据子程序
WR_DATA1:MOV DPTR,#CRADR1 ;/*读状态字口地址*/
WAIT11: MOVX A,@DPTR ;/* 读状态字 */
JB ACC.7,WAIT11 ;/*判忙标志BF,如BF=1 忙,等待*/
MOV DPTR,#DWADR1 ;/*写数据字口地址*/
MOV A,DATA ;/*取数据/
MOVX @DPTR,A ;/*写数据*/
RET
(3)右半屏写指令子程序WR_CMD2 和右半屏写数据子程序WR_DATA2 的编制同左半屏子程序相同,只是对应口地址不同。
8X16 字符显示子程序:MGLS12864 液晶显示屏由二片HD61202 控制,LCD 显示中应尽量避免一个字符一半在左半屏显示,另一半在右半屏显示的情况。设列地址寄存器为COLUMN,页地址寄存器为PAGE,要显示的字符代码寄存器为ASCIICODE,W78E58 内R AM28H-RAM37H 共16 个字节存放8×16 的点阵数据,生成的8×16 点阵库文件存放在单片机W78E58 存储器中的首地址定义为ASCII_DOT816。
DISP_ASCII816: MOV DPTR,#ASCII_DOT816 ;8×16 点阵库首地址
MOV A,ASCIICODE ;显示字符代码ASCIICODE
MOV B,#16 ;每个字符点阵占16 个字节
MUL AB ;计算显示字符在字库的首地址
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,B
MOV DPH,A
;MOV R0,#28H ;将点阵数据放到RAM28H-RAM37H
MOV R2,#00H
LP_MOVDOT16: MOV A,R2
MOVC A,@A+DPTR
MOV @R0,A ;如要将字符反显(黑底白字),则读出点
INC R0 ;阵数据后求反放入单片机的RAM 中
INC R2
CJNE R2,#16,LP_MOVDOT16
;
PUSH COLUMN
MOV A,COLUMN ;显示列数COLUMN 是否在右半屏
CJNE A,#64,ASCII_IF64
ASCII_IF64: JNC ASCII_YGE64
MOV DPTR ,#CWADR1 ;在左半屏时,选择左半屏写指令代码地址
CLR FIRST0_SECOND1_BIT ;左半屏列数标志BIT=0
SJMP ALL_COLUMN
ASCII_YGE64: CLR C
SUBB A,#64
MOV COLUMN,A
MOV DPTR,#CWADR2 ;在右半
- 便携式单片机控制液晶显示型心率计(03-12)
- 基于NIOSⅡ的液晶显示器控制研究(11-16)
- 全高清电视的电源发展趋势解析(04-16)
- 飞思卡尔LED 驱动器消除液晶显示屏噪音和拖影(06-01)
- 宽带放大器的设计与仿真(03-21)
- OLED 显示器技术及功能:电源供应是否会影响显示器画质(04-11)