📄 myproj.asm
字号:
T_CLK Bit P3.4
T_IO Bit P3.5
T_RST Bit p3.6
RS EQU P2.0
RW EQU P2.1
E EQU P2.2
ORG 0000H
LJMP Main
ORG 0100H
Main:
lcall InitLCD;LCD初始化
mov 30H,#00h
mov 31H,#08h
mov 32H,#18h
mov 33H,#01h
mov 34H,#08h
mov 35H,#05h
mov 36H,#08h
mov R0,#30H
lCALL SET1302;给1302赋初值
C2C:
mov R0,#30H
lCALL GET1302;从1302读数据
lcall ShowDATE;在LCD循环显示年月日
AJMP C2C
ShowDATE:
MOV A,#80H ;设置显示地址,从第1行第1列开始显示
ADD A,#40H
ACALL EnterI
mov r0,#36h
L1:
mov a,@r0
ANL A,#0F0H
swap A
orl a,#30h
lcall EnterD
mov a,@r0
ANL A,#0FH
orl a,#30h
lcall EnterD
lcall TME0
dec r0
cjne r0,#2fh,l1
ret
;设置1302七个字节数据R0表示数据起始缓冲区
SET1302:
MOV R1,#8EH
MOV R2,#00H
LCALL SetRTByte
MOV R7,#7
MOV R1,#80H
SetByte:
mov A,@R0
mov R2,A
LCALL SetRTByte
inc R0
inc R1
inc R1
DJNZ R7,SetByte
MOV R1,#8EH
MOV R2,#80H
LCALL SetRTByte
RET
;为时钟设定一个字节 R1为命令 R2为数据
SetRTByte:
CLR T_RST
ClR T_CLK
clr T_IO
SetB T_RST
;先设定命令
MOV R4,#8
MOV A,R1
SetBitS:
RRC A
MOV T_IO,C
SETB T_CLK
CLR T_CLK
DJNZ R4,SetBitS
;设定数据
MOV R4,#8
MOV A,R2
SetBitD:
RRC A
MOV T_IO,C
SETB T_CLK
CLR T_CLK
DJNZ R4,SetBitD
Clr T_RST
RET
;取1302七个字节数据 R0表示数据起始缓冲区
GET1302:
MOV R7, #07H
MOV R1, #81H
GetByte:
LCALL GetRTByte
MOV @R0,A
INC R0
INC R1
INC R1
DJNZ R7,GetByte
RET
;从时钟取一个字节 R1为命令 A为所取数据
GetRTByte:
;先设定命令
CLR T_RST
ClR T_CLK
clr T_IO
SetB T_RST
MOV R4,#8
MOV A,R1
SetBitG:
RRC A
MOV T_IO,C
SETB T_CLK
CLR T_CLK
DJNZ R4,SetBitG
;设定数据
MOV R4,#8
GetBitD:
mov C,T_IO
RRC A
SETB T_CLK
CLR T_CLK
DJNZ R4,GetBitD
Clr T_RST
RET
;----------------------------------
;初始化LCD夜晶并用软件复位
;----------------------------------
InitLCD:
MOV A,#038H
LCALL EnterI
LCALL LcdBUSY ;判忙
MOV A,#038H ;设置为8总线16*2 5*8点阵
LCALL EnterI
MOV A,#01H ;清屏
LCALL EnterI
MOV A,#06H ;设读写字符时地址加1,且整屏显示不移动
LCALL EnterI
MOV A,#0CH ;开显示,不开开光标显示,光标和光标所在的字符闪烁
LCALL EnterI
LCALL Delay
ret
;------------------------------------
;判忙子程序[用于判断LCD是否在忙于写入,如LCD在忙于别的事情,那就等LCD忙完后才操作]
;入口参数:无
;出口参数:无
;-------------------------------------
LcdBUSY:
PUSH ACC
CLR RS
SETB RW
TT0:
SETB E
MOV A,P1
CLR E
ANL A,#80H
JNZ TT0
POP ACC
RET
;-----------------------------------
;写命令子程序[将A寄存器命令内容发送到P1口]
;入口参数:A
;出口参数:无
;见用资源 A 寄存器
;-----------------------------------
;显示表结构数据 R0位置 DPTR字符首址 R2个数
WriteStrC:
mov R4,#00h
Write:
mov A,R4
movc A,@A+DPTR
mov R3,A
Call WriteByte
inc R0
inc R4
DJNZ R2,Write
ret
;显示内存中数据R0位置 R1源地址 R2个数
WriteStrD:
mov A,@R1
mov R3,A
Call WriteByte
inc R0
inc R1
DJNZ R2,WriteStrD
ret
;R0位置 R3字符
WriteByte: ;送单个字符
mov A,R0
add A,#80H
Call EnterI
mov A,R3
Call EnterD
ret
EnterI: ;送命令
Clr RS
CLR RW
SETB E
MOV P1,A
CLR E
Call Delay
RET
EnterD: ;送数据
SETB RS
CLR RW
SETB E
MOV P1,A
CLR E
Call Delay
RET
;---------------------------------------
;延时子程序132ms
;---------------------------------------
MS39:MOV R3,#003H ;7*132=924
MS40:MOV R4,#0FFH ;延时时间为132ms
MS2: MOV R5,#0FFH
MS1: DJNZ R5,MS1
DJNZ R4,MS2
DJNZ R3,MS40
RET
;-------------------------------
; 延时子程序R11=01H 为0.5ms
;入口参数:R11
;出口参数:无
;--------------------------------
TME0: MOV R4,#0AH ;延时 5ms
TME1: MOV R5,#0FFH
TME2: DJNZ R5,TME2
DJNZ R4,TME1
RET
;--------------------------------
Delay: ;延时子程序
mov r7,#2H
d1:mov r6,#255
d2:djnz r6,d2
djnz r7,d1
ret
;6)字模数据
;***************************************************************
;字模数据定义代码
;****************************************************************
;为自编写字模用WRCGRAM子程序写入1602LCD夜晶显示器CGRAM存储器
TBZI: DB 08H,0FH,12H,0FH,0AH,1FH,02H,02H ;年
DB 0FH,09H,0FH,09H,0FH,09H,11H,00H ;月
DB 0FH,09H,09H,0FH,09H,09H,0FH,00H ;日
db 00h,17h,0ch,14h,0ch,0ch,17h,00h ;汇
db 04h,1fh,08h,0fh,0eh,0dh,00h,00h ;友
db 00h,1fh,04h,0fh,05h,05h,1fh,00h ;五
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -