/*********************************************************************/
/*文件名称:12864-01-8x8.asm SIDE: 128 X 64 DOTS */
/*模 块 名:12864-1 模块 CONTROLLER: KS0108 */
/*创 建 人:zmlceo 日期:2008-12-01 */
/*qq:527717539 日期:2008-12-01 */
/*功能描述: */
/*其他说明: */
/*版 本:V1.0 */
/*********************************************************************/
/*
/
/12864 lcd
/
/
/ */
;****************************************************************************************
;RS REG P2.0 DEFINE LCM DATA/INSTRUCTION PIN
;R/W REG P2.1 DEFINE LCM READ/WRITE PIN
;E REG P2.2 DEFINE LCM CHIP ENABLE PIN
;CS1 REG P2.3 DEFINE LCM CHIP 1 SELECT PIN
;CS2 REG P2.4 DEFINE LCM CHIP 2 SELECT PIN
;RSTB REG P2.5 DEFINE LCM /RESET PIN
;DB0~DB7 REG P0.0~P0.7 DEFINE LCM DATA BUS PIN
;0011 1000
;***********************LCD**************************************************************
E1FLAG EQU 0X20
SBDATA EQU E1FLAG+1 ;存放显示数据
CLMADD EQU E1FLAG+2 ;存放列地址
PAGEADD EQU E1FLAG+3 ;存放页地址
PAGENUM EQU E1FLAG+4 ;存放总页数
CLMSUM EQU E1FLAG+5 ;存放总列数
INTSCODE EQU E1FLAG+6 ;存放指令代码
TEMP EQU E1FLAG+7 ;以下为其它通用寄存器
COUNT EQU E1FLAG+8
COUNT1 EQU COUNT+1
COUNT2 EQU COUNT+2
;****************************************************************************************
ORG 0000H
AJMP BEGIN
ORG 0050H
BEGIN: NOP
CALL DELAY
NOP
SETB P2.5 ;复位液晶
CALL INITIAL_LCD
STAR:
;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#58H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_1 ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E1
;***********************在液晶的右(E2)半屏显示一个8*16点符号子程序************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#60H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_2 ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E1
;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#68H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_8 ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E1
;***********************在液晶的右(E2)半屏显示一个8*16点符号子程序************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#70H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_6 ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E1
;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#78H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_4 ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E1
;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#48H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_L ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E2
;***********************在液晶的右(E2)半屏显示一个8*16点符号子程序************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#50H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_C ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E2
;***********************在液晶的左(E1)半屏显示一个8*16点符号子程序*************************
MOV PAGEADD,#0BBH ;显示起始页;B8,B9,BA,BB,BC,BD,BE,BF
MOV CLMADD,#58H ;显示起始列,列地址 Y Address 设置
MOV DPTR,#ADATA816_D ;取得TABLE地址的高字节
MOV 67H,DPH
MOV 68H,DPL
CALL DISP_char816_E2
stop: jmp stop
;*******************LCD系统初始化子程序**************************************************
INITIAL_LCD:
;*********初始化子程序(E1边)***********
CALL DISOFF1 ;关显示E1
CALL CLEAR1 ;清屏
CALL LCDSTA1
CALL DISP1 ;开显示
;*********初始化子程序(E2边)***********
CALL DISOFF2 ;关显示E2
CALL CLEAR2 ;清屏
CALL LCDSTA2
CALL DISP2 ;开显示
RET
;*******************以上为系统初始化子程序***********************************************
;*****************读液晶显示器状态子程序(E1边)*****************************************
LCDSTA1: NOP
BUSY1: ORL P0,#0FFH ;P0 INPUT MODE ;设置P0口为输入
SETB P2.3
CLR P2.4
SETB P2.1
CLR P2.0 ;设置CSA=1,CSB=0,RW=1,DI=0
SETB P2.2 ;E=1
MOV C,P0.7
CLR P2.2 ;E=0
JC BUSY1
RET
;*****************读液晶显示器状态子程序(E2边)*****************************************
LCDSTA2: NOP
BUSY2: ORL P0,#0FFH ;P0 INPUT MODE ;设置P0口为输入
CLR P2.3
SETB P2.4
SETB P2.1
CLR P2.0 ;设置CSA=0,CSB=1,RW=1,DI=0
SETB P2.2 ;E=1
MOV C,P0.7
CLR P2.2 ;E=0
JC BUSY2
RET
;*******对液晶显示器发指令子程序(指令保存在W寄存器中,E1边)******************************
SEND1: NOP
MOV INTSCODE,A ;指令暂存INTSCODE
CALL LCDSTA1 ;判断液晶是否为忙?
SETB P2.3
CLR P2.4
CLR P2.1
CLR P2.0 ;设置CSA=1,CSB=0,RW=0,DI=0
MOV A,INTSCODE
MOV P0,A
SETB P2.2 ;E=1
NOP
CLR P2.2 ;E=0
RET
;*******对液晶显示器发指令子程序(指令保存在W寄存器中,E2边)******************************
SEND2: NOP
MOV INTSCODE,A ;指令暂存INTSCODE
CALL LCDSTA2 ;判断液晶是否为忙?
CLR P2.3
SETB P2.4
CLR P2.1
CLR P2.0 ;设置CSA=0,CSB=1,RW=0,DI=0
MOV A,INTSCODE
MOV P0,A
SETB P2.2 ;E=1
NOP
CLR P2.2 ;E=0
RET
;******对液晶显示器写数据子程序(数据保存在W寄存器中,E1 边)*****************************
WRITE1: NOP
MOV SBDATA,A ;数据暂存SBDATA
MOV A,CLMADD ;设置列地址
CALL SEND1
CALL LCDSTA1
SETB P2.3
CLR P2.4
CLR P2.1
SETB P2.0 ;设置CSA=1,CSB=0,RW=0,DI=1
MOV A,SBDATA
MOV P0,A
SETB P2.2 ;E=1
NOP
NOP
CLR P2.2 ;E=0
RET
;******对液晶显示器写数据子程序(数据保存在W寄存器中,E2 边)*****************************
WRITE2: NOP
MOV SBDATA,A ;数据暂存SBDATA
MOV A,CLMADD ;设置列地址
CALL SEND2
CALL LCDSTA2
CLR P2.3
SETB P2.4
CLR P2.1
SETB P2.0 ;设置CSA=0,CSB=1,RW=0,DI=1
MOV A,SBDATA
MOV P0,A
SETB P2.2 ;E=1
NOP
CLR P2.2 ;E=0
RET
;***********液晶显示器开显示(E1边)*****************************************************
DISP1: NOP ;开E1显示
BUSY3: MOV A,#3FH ;将控制命令放在W中
CALL SEND1 ;送出控制命令
CALL LCDSTA1 ;判断其是否空闲
ORL P0,#0FFH ;设置P0口为输入
SETB P2.3
CLR P2.4
SETB P2.1
CLR P2.0 ;设置CSA=1,CSB=0,RW=1,DI=0
SETB P2.2 ;E=1
MOV C,P0.7 ;读入状态并查询
CLR P2.2 ;E=0
JC BUSY3 ;是否确实打开;如果没有打开,则继续打开
RET
;***********液晶显示器开显示(E2边)*****************************************************
DISP2: NOP ;开E1显示
BUSY4:
MOV A,#3FH ;将控制命令放在A中
CALL SEND2 ;送出控制命令
CALL LCDSTA2 ;判断其是否空闲
ORL P0,#0FFH ;设置P0口为输入
CLR P2.3
SETB P2.4
SETB P2.1
CLR P2.0 ;设置CSA=0,CSB=1,RW=1,DI=0
SETB P2.2 ;E=1
MOV C,P0.7
CLR P2.2 ;E=0
JC BUSY4
RET
;***********液晶显示器关显示(E1边)*****************************************************
DISOFF1: NOP ;关E1显示
BUSY5: MOV A,#3EH ;将控制命令放在A中
CALL SEND1 ;送出控制命令
CALL LCDSTA1 ;判断其是否空闲
ORL P0,#0FFH ;设置P0口为输入
SETB P2.3
CLR P2.4
SETB P2.1
CLR P2.0 ;设置CSA=1,CSB=0,RW=1,DI=0
SETB P2.2 ;E=1
MOV C,P0.7 ;读入液晶的状态时,不需要判断其是否为忙;读入状态并查询
CLR P2.2 ;E=0
JC BUSY5 ;判是否关闭;如果没有关闭则继续关
RET
;***********液晶显示器关显示(E2边)*****************************************************
DISOFF2: NOP ;关E2显示
BUSY6: MOV A,#3EH ;将控制命令放在A中
CALL SEND2 ;送出控制命令
CALL LCDSTA2 ;判断其是否空闲
ORL P0,#0FFH ;P0 INPUT MODE ;设置P0口为输入
CLR P2.3
SETB P2.4
SETB P2.1
CLR P2.0 ;设置CSA=1,CSB=0,RW=1,DI=0
SETB P2.2 ;E=1
MOV C,P0.7 ;读入液晶的状态时,不需要判断其是否为忙;读入状态并查询
CLR P2.2 ;E=0
JC BUSY6 ;判是否关闭;如果没有关闭则继续关
RET
;***********液晶显示器清屏子程序(E1边)*************************************************
CLEAR1: NOP ;E1边清屏
MOV PAGEADD,#0B8H ;设置页地址代码
MOV PAGENUM,#08H ;设置总页数
CLR11: MOV A,PAGEADD
CALL SEND1
MOV CLMSUM,#40H ;设置总列数 ;64列
MOV CLMADD,#00H ;设置起始列
CLR12: CALL LCDSTA1
MOV A,#00H
CALL WRITE1 ;写入00H
DJNZ CLMSUM,CLR12 ;本页未清完 ;返回继续
INC PAGEADD ;页号增1
DJNZ PAGENUM,CLR11 ;八页未清完 ;返回继续
RET
;***********液晶显示器清屏子程序(E2边)*************************************************
CLEAR2: NOP ;E2边清屏
MOV PAGEADD,#0B8H;设置页地址代码
MOV PAGENUM,#08H;设置总页数
CLR21: MOV A,PAGEADD
CALL SEND2
MOV CLMSUM,#40H;设置总列数 ;64列
MOV CLMADD,#00H;设置起始列
CLR22: CALL LCDSTA2
MOV A,#00H
CALL WRITE2 ;写入00H
DJNZ CLMSUM,CLR22 ;本页未清完;返回继续
INC PAGEADD ;页号增1
DJNZ PAGENUM,CLR21 ;八页未清完;返回继续
RET
;***********************8*16字符0123456789点阵库*****************************************
ADATA816_0: ;8*16字符点阵
;-- 文字: 0 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H
ADATA816_1:
;-- 文字: 1 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,010H,010H,0F8H,000H,000H,000H,000H,000H,020H,020H,03FH,020H,020H,000H,000H
ADATA816_2:
;-- 文字: 2 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,070H,008H,008H,008H,088H,070H,000H,000H,030H,028H,024H,022H,021H,030H,000H
ADATA816_3:
;-- 文字: 3 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,030H,008H,088H,088H,048H,030H,000H,000H,018H,020H,020H,020H,011H,00EH,000H
ADATA816_4:
;-- 文字: 4 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,000H,0C0H,020H,010H,0F8H,000H,000H,000H,007H,004H,024H,024H,03FH,024H,000H
ADATA816_5:
;-- 文字: 5 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0F8H,008H,088H,088H,008H,008H,000H,000H,019H,021H,020H,020H,011H,00EH,000H
ADATA816_6:
;-- 文字: 6 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0E0H,010H,088H,088H,018H,000H,000H,000H,00FH,011H,020H,020H,011H,00EH,000H
ADATA816_7:
;-- 文字: 7 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,038H,008H,008H,0C8H,038H,008H,000H,000H,000H,000H,03FH,000H,000H,000H,000H
ADATA816_8:
;-- 文字: 8 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,070H,088H,008H,008H,088H,070H,000H,000H,01CH,022H,021H,021H,022H,01CH,000H
ADATA816_9:
;-- 文字: 9 --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,000H,031H,022H,022H,011H,00FH,000H
;***********************8*16字符0123456789点阵库*****************************************
ADATA816_L:
;-- 文字: L --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 008H,0F8H,008H,000H,000H,000H,000H,000H,020H,03FH,020H,020H,020H,020H,030H,000H
ADATA816_C:
;-- 文字: C --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 0C0H,030H,008H,008H,008H,008H,038H,000H,007H,018H,020H,020H,020H,010H,008H,000H
ADATA816_D:
;-- 文字: D --
;-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --
DB 008H,0F8H,008H,008H,008H,010H,0E0H,000H,020H,03FH,020H,020H,020H,010H,00FH,000H
END
文章评论(0条评论)
登录后参与讨论