📄 lf9111t.asm
字号:
; 伪彩320*240 LCD控制板(QX3224RGB1.1) 技巧演示例程
; 通过这个例程你可以知道怎样显示图形和中文的技巧
; 从上一个例程LF9111.ASM你可以看出,以三个字节(8个像素)为一个寻址单元时,编程更加方便。
; 通过调用下面的地址换算子程序和颜色设置子程序你可以像为单色LCD编程一样简单。
CSEG AT 0000H
;LCD控制板接口
;P1 为数据线
AOO EQU P3.0 ;AO 高电平时写入的数据是地址,低电平时写入的数据是显示数据。
WRR EQU P3.2 ;WR 当P1口的数据有效时,WR产生一个下降沿,写一个数据完成。
D12 EQU P3.1 ;D12 显示RAW分为二页,D12高电平时显示第一页,D12为低电平时显示第二页。
WRDATA EQU 28H ;数据变量
ADDRL EQU 30H ;地址低位变量
ADDRH EQU 31H ;地址高位变量..................以一个字节为单元(8/3个像素)
ADDBL EQU 32H ;地址低位
ADDBH EQU 33H ;地址高位 .....................以三个字节为单元(8个像素)
TEMP1 EQU 3AH ;
TEMP2 EQU 39H ;通用变量
TEMP3 EQU 38H ;
TEMP4 EQU 3BH ;
TEMP5 EQU 3CH
TEMP6 EQU 3DH
CODEN EQU 3EH ; 中文字模位置代码
FCOLOR EQU 40H ; 前景颜色
BCOLOR EQU 41H ; 背景颜色
MAIN:
NOP
NOP
MAIN1:
NOP
LCALL CLREA ; 调用清屏子程序,
NOP
SETB D12
LCALL DISFORM ; 在第一区显示表格
CLR D12
LCALL CONT ; 在第二区显示文字说明和彩条
NOP
NOP
NOP
;轮流显示第一区和第二区的内容
PLAY:
LCALL DELAY
SETB D12 ;D12=0 显示第一区
LCALL DELAY
CLR D12 ;D12=1 显示第二区
LJMP PLAY
;=======================================================
;延时子程序
DELAY:
MOV R5,#0
MOV R6,#0
MOV R7,#150
DEL:
DJNZ R5,DEL
DJNZ R6,DEL
DJNZ R7,DEL
RET
;;==================================================================
; 调用前先预置CODEN,ADDBH,ADDBL,FCOLOR,BCOLOR
WRCHINA: ;写一个16*16的中文到LCD子程序
MOV TEMP5,ADDBL
MOV TEMP6,ADDBH
MOV DPTR,#CHINTAB
MOV A,CODEN ;
MOV B,#32 ;通过中文代码算出每个中文字模的首地址=CHINTAB+32*CODEN
MUL AB ;因为一个16*16的中文占用32个字节
ADD A,DPL ;
MOV DPL,A ;
MOV A,B ;
ADDC A,DPH ;
MOV DPH,A ;
MOV R5,#16
LCALL FORADDR
LCALL SETADDR
WRCHIN1:
CLR A
MOVC A,@A+DPTR
MOV WRDATA,A
LCALL SETCOLOR ;调用颜色设置子程序把8个像素写入LCD
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV WRDATA,A
LCALL SETCOLOR ;调用颜色设置子程序把8个像素写入LCD
MOV A,#40 ;
ADD A,ADDBL ;
MOV ADDBL,A ;
CLR A ;用ADDBH,ADDBL=ADDBH,ADDL+40实现换一行
ADDC A,ADDBH ;
MOV ADDBH,A ;
LCALL FORADDR ;
LCALL SETADDR ;
INC DPTR
DJNZ R5,WRCHIN1 ;连续写16行
INC CODEN
MOV A,#2
ADD A,TEMP5
MOV ADDBL,A
CLR A
ADDC A,TEMP6
MOV ADDBH,A
RET
;;==================================================================
;地址换算子程序
;
FORADDR:
MOV A,ADDBH
JB ACC.7,FORADDR1
FORADDR1: ;第一区的换算: ADDRH,ADDRL=ADDBH,ADDBL*3
MOV B,#3
MOV A,ADDBL
MUL AB
MOV ADDRL,A
MOV TEMP1,B
MOV B,#3
MOV A,ADDBH
MUL AB
ADD A,TEMP1
MOV ADDRH,A
RET
FORADDR2: ;第二区的换算: 先ADDBH的最高位置0,然后是ADDRH,ADDRL=ADDBH,ADDBL*3
CLR ACC.7 ;最后再把ADDRH的最高位置1。
MOV ADDBH,A
MOV B,#3
MOV A,ADDBL
MUL AB
MOV ADDRL,A
MOV TEMP1,B
MOV B,#3
MOV A,ADDBH
MUL AB
ADD A,TEMP1
SETB ACC.7
MOV ADDRH,A
RET
;;==============================================================================
;设置颜色子程序(同时把数据写入LCD)
;入口: 变量BCOLOR 是背景颜色,FCOLOR 是前景颜色,大小为00H~07H, 其中00H为黑色,FFH为白色,
; 04H为红色, 02H为绿色,01H为蓝色.........
;设置颜色,一个字节WRDATA(单色)扩展到三个字节TEMP3,TEMP2,TEMP1(RGB 8色)
;实现的原理是检查WEDATA的每一位,为0时用背景颜色填充,为1时用前景颜色填充。
SETCOLOR:
MOV R6,#8
SETSRT:
JB WRDATA.0,SETC1
MOV A,BCOLOR
LJMP SETC2
SETC1:
MOV A,FCOLOR
SETC2:
MOV R7,#3
LCALL LOOP
MOV A,WRDATA
RRC A
MOV WRDATA,A
DJNZ R6,SETSRT
MOV P1,TEMP3
CLR WRR
SETB WRR
MOV P1,TEMP2
CLR WRR
SETB WRR
MOV P1,TEMP1
CLR WRR
SETB WRR
RET
LOOP:
RRC A
MOV TEMP4,A
MOV A,TEMP3
RRC A
MOV TEMP3,A
MOV A,TEMP2
RRC A
MOV TEMP2,A
MOV A,TEMP1
RRC A
MOV TEMP1,A
MOV A,TEMP4
DJNZ R7,LOOP
RET
;==========================================================
;显示文字说明和彩条子程序
CONT:
MOV ADDBL,#248
MOV ADDBH,#080H
MOV FCOLOR,#1
MOV BCOLOR,#6
MOV CODEN,#0
LCALL WRCHINA24
LCALL WRCHINA24
LCALL WRCHINA24
LCALL WRCHINA24
LCALL WRCHINA24
LCALL WRCHINA24
LCALL WRCHINA24
MOV ADDBL,#043H
MOV ADDBH,#086H
MOV FCOLOR,#0
MOV BCOLOR,#0FFH
MOV CODEN,#05
MOV R0,#13
CONT1:
LCALL WRCHINA
DJNZ R0,CONT1
MOV CODEN,#3
LCALL WRNUN
MOV CODEN,#2
LCALL WRNUN
MOV CODEN,#0
LCALL WRNUN
MOV CODEN,#13H
LCALL WRNUN
LCALL WRNUN
LCALL WRNUN
MOV CODEN,#0BH
LCALL WRNUN
MOV CODEN,#13H
LCALL WRNUN
MOV CODEN,#2
LCALL WRNUN
MOV CODEN,#4
LCALL WRNUN
MOV CODEN,#0
LCALL WRNUN
MOV ADDBL,#0B0H
MOV ADDBH,#089H
MOV CODEN,#18
MOV R0,#7
CONT2:
LCALL WRCHINA
DJNZ R0,CONT2
DEC ADDBL
MOV CODEN,#0CH
LCALL WRNUN
LCALL WRNUN
MOV CODEN,#25
LCALL WRCHINA
LCALL WRCHINA
LCALL WRCHINA
LCALL WRCHINA
LCALL DISCOLOR
RET
;;==================================================================
WRCHINA24: ;写一个24*20的中文到LCD子程序
MOV DPTR,#CHIN24TAB
MOV A,CODEN
MOV B,#60
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV R5,#20
LCALL FORADDR
LCALL SETADDR
WRCHIN241:
CLR A
MOVC A,@A+DPTR
MOV WRDATA,A
LCALL SETCOLOR
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV WRDATA,A
LCALL SETCOLOR
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV WRDATA,A
LCALL SETCOLOR
MOV A,#120 ;
ADD A,ADDRL ;
MOV ADDRL,A ;也可以像16*16的中文子程序那样用ADDBH,ADDBL+40换行
CLR A ;这里用ADDRH,ADDRL+120换行,作用是一样的
ADDC A,ADDRH ;
MOV ADDRH,A ;
LCALL SETADDR ;
INC DPTR
DJNZ R5,WRCHIN241
INC CODEN
MOV A,#3
ADD A,ADDBL
MOV ADDBL,A
CLR A
ADDC A,ADDBH
MOV ADDBH,A
RET
;;==========================================================================
WRNUN: ;写一个8*8的数字或字母到LCD子程序
MOV DPTR,#NUNTAB
MOV A,CODEN
MOV B,#16
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
MOV R5,#16
LCALL FORADDR
LCALL SETADDR
WRNUN1:
CLR A
MOVC A,@A+DPTR
MOV WRDATA,A
LCALL SETCOLOR
MOV A,#120
ADD A,ADDRL
MOV ADDRL,A
CLR A
ADDC A,ADDRH
MOV ADDRH,A
LCALL SETADDR
INC DPTR
DJNZ R5,WRNUN1
INC CODEN
MOV A,#1
ADD A,ADDBL
MOV ADDBL,A
CLR A
ADDC A,ADDBH
MOV ADDBH,A
RET
;;======================================================================================
DISFORM: ;显示演示表格子程序
MOV R5,#160
MOV ADDRL,#0D1H
MOV ADDRH,#12H
DISCUL1:
LCALL SETADDR
MOV P1,#01H
CLR WRR
SETB WRR
MOV A,#120
ADD A,ADDRL
MOV ADDRL,A
CLR A
ADDC A,ADDRH
MOV ADDRH,A
DJNZ R5,DISCUL1
MOV R5,#95
MOV ADDRL,#0D1H
MOV ADDRH,#05DH
LCALL SETADDR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -