📄 lcd12864_serial_char_img_cgram.asm
字号:
;12864的8位控制方式
;内置8192个16*16点阵字符,128个16*8个ASCII字符,可显示8*4行行16*16点汉字
;4或8位并行控制
;8位通讯的设置,PSB端要置1,E在通信过程中一直要有效
;显示图形时,先写入水平(0到15)与垂直(0到32)的坐标,再写入两个8位的资料
;控制位定义
CS EQU P2.0
SID EQU P2.1
SCLK EQU P2.2
PSB EQU P2.3
RST EQU P2.5
LCD_X EQU 20H ;GDRAM水平坐标
LCD_Y EQU 21H ;GDRAM垂直坐标
;--------------------------
ORG 0000H
AJMP MAIN
;--------------------------
ORG 0030H
MAIN:
MOV SP,#5FH
LCALL LCD12864_INI ;初始化LCD
MOV DPTR,#CGRAM1 ;将装入第一个CGRAM1
MOV A,#40H
LCALL LCD12864_CGRAM ;
MOV DPTR,#CGRAM2 ;将装入第二个CGRAM2
MOV A,#50H
LCALL LCD12864_CGRAM
MOV DPTR,#CGRAM3 ;将装入第三个CGRAM3
MOV A,#60H
LCALL LCD12864_CGRAM
MOV DPTR,#CGRAM4 ;将装入第四个CGRAM4
MOV A,#70H
LCALL LCD12864_CGRAM
;------------------------
MAIN_LP:
LCALL LCD12864_CHRS ;将四行字都显示出来
MOV R4,#0FFH
LCALL DELAYMS
MOV R4,#0FFH
LCALL DELAYMS
MOV R4,#0FFH
LCALL DELAYMS
;--------------------------
MOV DPTR,#DIS_IMG ;将DPTR所指的图片都装入GDRAM并显示出来
LCALL LCD12864_IMG
MOV R4,#0FFH
LCALL DELAYMS
MOV R4,#0FFH
LCALL DELAYMS
MOV R4,#0FFH
LCALL DELAYMS
;-------------------------
LCALL LCD12864_CGRAM_SHOW
MOV R4,#0FFH
LCALL DELAYMS
MOV R4,#0FFH
LCALL DELAYMS
MOV R4,#0FFH
LCALL DELAYMS
;-------------------------
AJMP MAIN_LP
;END OF MAIN
;*********************************LCD12864**********************************************
;初始化程序,写指令,写数据,写行,忙检测
;------------------------
LCD12864_INI:
;初始化
CLR PSB ;串口方式
SETB CS ;令LCD12864被选中,高电平有效
CLR SCLK ;时钟置于低电平
CLR RST ;复位
MOV R4,#60
LCALL DELAYMS
SETB RST
NOP
MOV B,#20H ;基本指令操作(当并行时是4位并口方式,如果8位就是30H)
LCALL LCD12864_WR_OP_NO_CHK
MOV A,#01H ;清屏
LCALL LCD12864_WR_OP
MOV A,#06H ;指定资料写入或读取时,光标移动方向,AC自加1
LCALL LCD12864_WR_OP
MOV A,#0CH ;开显示,关光标,不闪烁
LCALL LCD12864_WR_OP
CLR CS
RET
;-----------------------失败,下面的程序没有效,不知道ICON RAM是怎么用的,理解有误
LCD12864_IRAM_SHOW:
;将"我爱你!"字符分别写在IRAM里并显示出来
MOV A,#01H ;清屏
LCALL LCD12864_WR_OP
MOV R4,#01H
LCALL DELAYMS
MOV A,#80H ;移动到第一行
LCALL LCD12864_WR_OP
MOV A,#34H ;用扩展命令
LCALL LCD12864_WR_OP
MOV A,#02H ;允许输入IRAM地址
LCALL LCD12864_WR_OP
MOV A,#40H ;输入IRAM地址,一个ICON RAM有16个双字节构成
LCALL LCD12864_WR_OP
MOV DPTR,#CGRAM1 ;字节储存空间
MOV R1,#32
LIS_LP:
CLR A
MOVC A,@A+DPTR
LCALL LCD12864_WR_DAT
INC DPTR
DJNZ R1,LIS_LP ;输入16个双字节,即输入32个字节
; MOV A,#30H ;用基本指令
; LCALL LCD12864_WR_OP
RET
;-----------------------
LCD12864_CGRAM:
;入口参数1--DPTR,有16个双字节的用户自定义符号的CGRAM参数表的入口
;入口参数2--A,要写入CGRAM的哪一组(40H,50H,60H或70H可选)
;40H到4FH在0000显示
;50H到5FH在0002显示
;60H到6FH在0004显示
;70H到7FH在0006显示
;返回:无
LCALL LCD12864_WR_OP ;将要CGRAM的首地址写入
MOV R1,#32
LCRAM_LP:
CLR A
MOVC A,@A+DPTR
LCALL LCD12864_WR_DAT ;写入第一个字节
INC DPTR
DJNZ R1,LCRAM_LP ;一直到写入16个双字节
RET
;------------------------
LCD12864_CGRAM_SHOW:
;将写入的CGRAM显示在第一行开始的四个单元
MOV A,#01H ;清屏
LCALL LCD12864_WR_OP
MOV R4,#01H
LCALL DELAYMS
MOV A,#80H ;AC移动到第一行第一列
LCALL LCD12864_WR_OP
;------
MOV A,#00H ;写入CGRAM双字节地址的第一个字节
LCALL LCD12864_WR_DAT
MOV A,#00H ;写入CGRAM双字节地址的第二个字节
LCALL LCD12864_WR_DAT
;------
MOV A,#00H ;写入CGRAM双字节地址的第一个字节
LCALL LCD12864_WR_DAT
MOV A,#02H ;写入CGRAM双字节地址的第二个字节
LCALL LCD12864_WR_DAT
;------
MOV A,#00H ;写入CGRAM双字节地址的第一个字节
LCALL LCD12864_WR_DAT
MOV A,#04H ;写入CGRAM双字节地址的第二个字节
LCALL LCD12864_WR_DAT
;------
MOV A,#00H ;写入CGRAM双字节地址的第一个字节
LCALL LCD12864_WR_DAT
MOV A,#06H ;写入CGRAM双字节地址的第二个字节
LCALL LCD12864_WR_DAT
;--------------------
;下面送字库的代码,显示我爱你!
MOV DPTR,#DDROM
MOV R1,#8
LCS_LP:
CLR A
MOVC A,@A+DPTR
LCALL LCD12864_WR_DAT
INC DPTR
DJNZ R1,LCS_LP
RET
;------------------------
LCD12864_IMG:
;把DPTR所指向的表里面的512个双字节数据装进GDRAM里,使其显示出来
;入口参数:DPTR
;返回:无
MOV A,#01H ;清除屏幕
LCALL LCD12864_WR_OP
MOV R4,#01H
LCALL DELAYMS
MOV A,#34H ;选择扩充指令,在写入GDRAM时要关闭绘图显示
LCALL LCD12864_WR_OP
MOV LCD_X,#80H
MOV LCD_Y,#80H ;设定坐标在(0,0)处
MOV R6,#2 ;上下半区,写后上半区后R6为1,写完下半区后R6为0,由此判断结束
MOV R2,#32 ;写上(下)半区共32行
LI_LP2:
MOV A,LCD_Y ;先写垂直坐标
LCALL LCD12864_WR_OP
MOV A,LCD_X ;后写水平坐标,返回开始处
LCALL LCD12864_WR_OP
MOV R1,#8 ;一行要写入8个双字节
LI_LP1:
CLR A ;写第一个字节
MOVC A,@A+DPTR
LCALL LCD12864_WR_DAT
CLR A ;写第二个字节
INC DPTR
MOVC A,@A+DPTR
LCALL LCD12864_WR_DAT
INC DPTR
DJNZ R1,LI_LP1 ;写完一行
MOV A,LCD_Y ;使垂直坐标增加1,因为LCD不会自动对垂直坐标计算,只能在程序中作计算
INC A
MOV LCD_Y,A
DJNZ R2,LI_LP2 ;写完上半区
MOV LCD_X,#88H ;指向下半区第一列
MOV LCD_Y,#80H ;重新回到第一行
MOV R2,#32 ;再次写入32行
DJNZ R6,LI_LP2
MOV A,#36H ;扩充指令,打开绘图显示
LCALL LCD12864_WR_OP
MOV A,#30H ;改回基本指令,并关闭绘图显示
LCALL LCD12864_WR_OP
RET
;-----------------------
LCD12864_CHRS:
;将表中的四行字都显示出来
MOV A,#01H
LCALL LCD12864_WR_OP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -