📄 lcd.asm
字号:
;;;;;;;;;LCD万年历时钟源程序;;;;;;;;;
;;;;;;;;;名 称:LCD_Z1.asm ;;;;;;;;;;
;;;;;按键定义
;K1 BIT P3.2
K2 BIT P3.3
K3 BIT P3.4
K4 BIT P3.5
;;;;;LCD接口定义
RS BIT P2.4
RW BIT P2.6
E BIT P2.5
DAT EQU P0
HD BIT P2.2
JD BIT P2.3
;;;;;变量定义
TLL EQU 25H
M50 EQU 26H
XZ EQU 27H
HOUR EQU 28H
SEC EQU 29H
SECO EQU 2AH
X EQU 2BH
Y EQU 2CH
MIN EQU 2DH
Z EQU 2EH
WEEK EQU 2FH ;周
DAY EQU 30H ;?
MOU EQU 31H ;月
YEAY EQU 32H ;年
SO EQU 33H
DSS EQU 34H
MS EQU 35H
HHH EQU 36H
MMH EQU 37H
HHJ EQU 38H
MMJ EQU 39H
M30 EQU 3AH
;;;;;;;;;;主程序;;;;;;;;;;;
;;;;名 称: main;;;;;;;;
ORG 0000H
JMP MAIN
ORG 0003H
RETI
ORG 000BH
JMP WT0
ORG 0013H
RETI
ORG 001BH
JMP WT1
ORG 0023H
RETI
ORG 0040H
MAIN: CLR HD
MOV R1,#8
LL1: CALL D_10MS
DJNZ R1,LL1
SETB HD
MOV SP,#70H
MOV SO,#54H
MOV DSS,#0
MOV 20H,#0
MOV 21H,#0
MOV 22H,#0
MOV TMOD,#11H
MOV TL0,#0B0H
MOV TH0,#3CH
MOV TL1,#0B0H
MOV TH1,#3CH
CLR TR0
CLR ET1
SETB ET0
SETB TR0
MOV MMH,#1
MOV HHH,#2
MOV HHJ,#3
MOV MMJ,#4
MOV M50,#20
MOV M30,#4
MOV XZ,#50
MOV TLL,#0AAH
MOV MS,#0
MOV SEC,#23 ;秒
MOV MIN,#58 ;分
MOV HOUR,#23 ;时
MOV WEEK,#31H ;周
MOV DAY,#1 ;日
MOV MOU,#10 ;月
MOV YEAY,#6 ;年
SETB EA
CALL CSH_LCM ;LCD启动
CALL LCDXS_1
CALL LCDXS_2
LOOP: JNB 21H.1,LOOP2
CLR 21H.1
CALL DYA
LOOP2:CALL KEY
CALL TBJ
JMP LOOP
;;;;;;;;;;按键处理程序;;;;;;
;;;;;;模块名称: KEY.asm;;;;
KEY: JB K2,S01
CLR HD
CALL D_10MS
SETB HD
JB K2,S01
JNB K2,$
CLR TR0
CLR ET0
SETB TR1
SETB ET1
MOV 20H,#0
MOV SEC,#0
INC MS
MOV A,MS
CJNE A,#8,S00
MOV MS,#0
MOV 20H,#0
CLR TR1
CLR ET1
SETB TR0
SETB ET0
S00: RET
S01: MOV A,MS
JZ S00
CJNE A,#1,S02
SETB 20H.0
;;;;;;;年加一;;;;;;;
S01_N:JB K3,S01_D
CLR HD
CALL D_10MS
SETB HD
JB K3,S01_D
JNB K3,$
INC YEAY
MOV A,YEAY
CJNE A,#100,S01_N
MOV YEAY,#0
JMP S01_N
;;;;;;;年减一;;;;;;;
S01_D:JB K4,S01_RET
CLR HD
CALL D_10MS
SETB HD
JB K4,S01_RET
JNB K4,$
DEC YEAY
MOV A,YEAY
CJNE A,#255,S01_D
MOV YEAY,#99
S01_RET: RET
;;;;;;;月加一;;;;;;
S02: CJNE A,#2,S03
SETB 20H.1
S02_N:JB K3,S02_D
CLR HD
CALL D_10MS
SETB HD
JB K3,S02_D
JNB K3,$
INC MOU
MOV A,MOU
CJNE A,#13,S02_N
MOV MOU,#1
JMP S02_N
;;;;;;;月减一;;;;;
S02_D:JB K4,S02_RET
CLR HD
CALL D_10MS
SETB HD
JB K4,S02_RET
JNB K4,$
DEC MOU
MOV A,MOU
CJNE A,#0,S02_D
MOV MOU,#12
S02_RET: RET
;;;;;;;日加一;;;;;;
S03: CJNE A,#3,S04
SETB 20H.2
S03_N:JB K3,S03_D
CLR HD
CALL D_10MS
SETB HD
JB K3,S03_D
JNB K3,$
INC DAY
MOV A,DAY
CJNE A,#32,S03_N
MOV DAY,#1
JMP S03_N
;;;;;;日减一;;;;;;
S03_D:JB K4,S03_RET
CLR HD
CALL D_10MS
SETB HD
JB K4,S03_RET
JNB K4,$
DEC DAY
MOV A,DAY
CJNE A,#0,S03_D
MOV DAY,#31
S03_RET: RET
;;;;;;星期加一;;;;;;;
S04: CJNE A,#4,S05
SETB 20H.3
S04_N:JB K3,S04_D
CLR HD
CALL D_10MS
SETB HD
JB K3,S04_D
JNB K3,$
INC WEEK
MOV A,WEEK
CJNE A,#38H,S04_N
MOV WEEK,#31H
JMP S04_N
;;;;;;;星期减一;;;;;;
S04_D:JB K4,S04_RET
CLR HD
CALL D_10MS
SETB HD
JB K4,S04_RET
JNB K4,$
DEC WEEK
MOV A,WEEK
CJNE A,#30H,S04_D
MOV WEEK,#37H
S04_RET: RET
;;;;;;;微调加一;;;;;;;
S05: CJNE A,#5,S06
SETB 20H.4
S05_N:JB K3,S05_D
CLR HD
CALL D_10MS
SETB HD
JB K3,S05_D
JNB K3,$
INC XZ
MOV A,XZ
CJNE A,#100,S05_N
MOV XZ,#1
JMP S05_N
;;;;;;;微调减一;;;;;;
S05_D:JB K4,S05_RET
CLR HD
CALL D_10MS
SETB HD
JB K4,S05_RET
JNB K4,$
DEC XZ
MOV A,XZ
CJNE A,#255,S05_D
MOV XZ,#99
S05_RET: CALL TZL
RET
;;;;;;;时加一;;;;;;
S06: CJNE A,#6,S07
SETB 20H.5
S06_N:JB K3,S06_D
CLR HD
CALL D_10MS
SETB HD
JB K3,S06_D
JNB K3,$
INC HOUR
MOV A,HOUR
CJNE A,#24,S06_N
MOV HOUR,#0
JMP S06_N
;;;;;;;时减一;;;;;;
S06_D:JB K4,S06_RET
CLR HD
CALL D_10MS
SETB HD
JB K4,S06_RET
JNB K4,$
DEC HOUR
MOV A,HOUR
CJNE A,#255,S06_D
MOV HOUR,#23
S06_RET: RET
;;;;;;;分加一;;;;;;
S07: CJNE A,#7,S08
SETB 20H.6
S07_N:JB K3,S07_D
CLR HD
CALL D_10MS
SETB HD
JB K3,S07_D
JNB K3,$
INC MIN
MOV A,MIN
CJNE A,#60,S07_N
MOV MIN,#0
JMP S07_N
;;;;;;;;分减一;;;;;;
S07_D:JB K4,S07_RET
CLR HD
CALL D_10MS
SETB HD
JB K4,S07_RET
JNB K4,$
DEC MIN
MOV A,MIN
CJNE A,#255,S07_D
MOV MIN,#59
S07_RET:RET
S08: RET
;;;;;;;;;时间处理程序;;;;;;;;
;;;;模块名称: LCDXS_1.asm;;;
;;;;功 能: 时间处理;;;;;;
;LCD第二项显示时分秒
LCDXS_1: MOV X,#0 ;"s00"
MOV A,SO
MOV B,X
CALL LCDP1
INC X
MOV A,XZ
CALL SHOW_DIG1
CALL LCDP1
MOV A,HOUR ;时
MOV X,#4
CALL SHOW_DIG1
CALL LCDP1
INC X
MOV A,#':'
MOV B,X
CALL LCDP1
MOV A,MIN ;分
INC X
CALL SHOW_DIG1
CALL LCDP1
INC X
MOV A,#':'
MOV B,X
CALL LCDP1
MOV A,SEC ;秒
INC X
CALL SHOW_DIG1
LCDP1:MOV Y,A
MOV A,B
ADD A,#0C0H
CALL WR_LCM
MOV A,Y
CALL WR_DATA
RET
SHOW_DIG1: MOV B,#10
DIV AB
ADD A,#30H
MOV Z, B
MOV B,X
CALL LCDP1
MOV B,Z
MOV A,B
ADD A,#30H
INC X
MOV B,X
RET
;LCD第一项显示 “年月日星期”
LCDXS_2: MOV X,#2
MOV A,#'2'
MOV B,X
CALL LCDP2
INC X
MOV A,#'0'
MOV B,X
CALL LCDP2
MOV A,YEAY ;年
MOV X,#4
CALL SHOW_DIG2
CALL LCDP2
INC X
MOV A,#'-'
MOV B,X
CALL LCDP2
MOV A,MOU ;月
INC X
CALL SHOW_DIG2
CALL LCDP2
INC X
MOV A,#'-'
MOV B,X
CALL LCDP2
MOV A,DAY ;日
INC X
CALL SHOW_DIG2
CALL LCDP2
INC X
MOV A,#' '
MOV B,X
CALL LCDP2
INC X
MOV A,#' '
MOV B,X
CALL LCDP2
INC X
MOV A,#' '
MOV B,X
CALL LCDP2
MOV A,WEEK
MOV B,X
CALL LCDP2
LCDP2:MOV Y,A
MOV A,B
ADD A,#80H
CALL WR_LCM
MOV A,Y
CALL WR_DATA
RET
SHOW_DIG2: MOV B,#10
DIV AB
ADD A,#30H
MOV Z, B
MOV B,X
CALL LCDP2
MOV B,Z
MOV A,B
ADD A,#30H
INC X
MOV B,X
RET
;时间校正输入处理
TZL: CLR C
MOV A,#0AAH
SUBB A,#50
ADD A,XZ
MOV TLL,A
RET ;时间比较
TBJ: MOV A,SEC
MOV B,SECO
CJNE A,B,TBJ_1
JMP TBJ_2
TBJ_1:CALL LCDXS_1
CALL LCDXS_2
MOV SECO,SEC
TBJ_2:RET
;;;;;;;;年月日处理程序;;;;;
;;;模块名称: day.asm;;;;;;
;;;功 能: 年月日处理;;
DYA: MOV DPTR,#MOU_12
MOV A,MOU ;月
XRL A,#12
JNZ MM_4
MOV A,DAY
INC A
CJNE A,#32,MM_4
JMP MM_3
MM_4: MOV DPTR,#MOU_12
MOV A,MOU
XRL A,#2
JNZ MM_1
MOV A,MOU
CALL MOU_J
JMP MM_2
MM_1:MOVC A,@A+DPTR
MM_2:MOV B,A
INC B
INC DAY
MOV A,DAY
CJNE A,B,T1_END
MM_3: MOV DAY,#01H
INC MOU
MOV A,MOU
CJNE A,#13,T1_END
MOV MOU,#1
INC YEAY
MOV A,YEAY
CJNE A,#100,T1_END
MOV YEAY,#0
INC YEAY
MOV A,YEAY
CJNE A,#100 ,T1_END
MOV YEAY,#0
T1_END:
MOU_J:MOV DPTR,#YEAR_D
MOV A,YEAY
MOVC A,@A+DPTR
MOV B,A
RET
MOU_12:
db 00h
db 31d
db 28d
db 31d
db 30d
db 31d
db 30d
db 31d
db 31d
db 30d
db 31d
db 30d
db 31d
YEAR_D:
db 29d
db 28d
db 28d
db 28d
db 29d
db 28d
db 28d
db 28d
db 29d
db 28d
db 28d
db 28d
db 29d
db 28d
db 28d
db 28d
db 29d
db 28d
db 28d
db 28d
;;;;;;;;LCD1602显示程序;;;;;;;;
;模块名称: LCD16.asm (csh_lcm;
;芯片型号: HD;;;;;;;;;;;;;;;;
;;;;;;;;;启动;;;;;;;;
CSH_LCM: MOV A,#00111000B ;(16*2,5*7点阵,8位数据接口)
CALL WR_LCM ;写入指令
MOV A,#08H
CALL WR_LCM ;写入指令
MOV A,#0000110B ;(开显示,显示光标不闪耀)
CALL WR_LCM ;写入指令
MOV A,#00001100B ;(N=1当读或写一个字符后地址指针加一,光标加一。S=0写一字符,屏示动
CALL WR_LCM ;写入指令
RET
;;;;;;;;;写入指令;;;;;;;;;
WR_LCM: CALL RD_BF ;判LCD忙
CLR E ;注意:E设低电平主要是为后产生一高电平脉冲
CLR RS ;参阅使用说明中:1.2节 RS=L
CLR RW ;RS=L
SETB E ;E=高脉冲
MOV DAT,A ;d0-d7指令码
CLR E ;允许端恢复低电平
RET
;;;;;;;;;判LCD忙;;;;;;;;;;;;
;说明:MCU处理一个指令,仅需若干个uS,而LCD得化40uS
RD_BF: PUSH ACC ;ACC入栈
BF_LOOP: SETB RW ;RW-H
CLR RS ;RS-L
SETB E ;E=H
MOV A,DAT ;读数据
CLR E ;允许端恢复低电平
JB ACC.7,BF_LOOP ;参阅使用说明中:2-状态字说明:对控制器读写之前,必须进行读写检测,确保ACC.7=0;;;
POP ACC ;ACC出栈
CALL D_2500 ;转延时
RET
;*****写入数据
WR_DATA: CALL RD_BF ;判LCD忙
CLR E ;拉低电平
SETB RS ;参阅使用说明中:1-4 RS=H
CLR RW ;RW=L
SETB E ;E=高电平
MOV DAT,A ;写入数据
CLR E
RET
;;;;;;;;;延时2.5MS;;;;;;
D_2500: MOV R6,#5
LD1: MOV R7,#250
DJNZ R7,$
DJNZ R6,LD1
RET
D_10MS: MOV R5,#4
LD2: CALL D_2500
DJNZ R5,LD2
RET
;;;;;;;;;T0中断程序;;;;;;;;
;;;;模块名称: wt0.asm;;;;;
;;;;功 能: 计时;;;;;;;;
WT0: PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
DJNZ M50,SRET
MOV TL0,TLL
MOV TH0,#3CH
MOV M50,#20
INC SEC
MOV A,SEC
CJNE A,#60,SRET
MOV SEC,#0
SJ1M: INC MIN
MOV A,MIN
CJNE A,#60,SRET
MOV MIN,#0
INC HOUR
MOV A,HOUR
CJNE A,#24,SRET
MOV HOUR,#0
INC WEEK
SETB 21H.1
MOV A,WEEK
CJNE A,#38H,SRET
MOV WEEK,#31H
SRET: MOV TL0,#0AAH
MOV TH0,#3CH
POP PSW
POP ACC
SETB ET0
SETB TR0
RETI
;;;;;;;;;;T1中断程序;;;;;;;;
;;;;;模块名称: wt1.asm ;;;;
;;;;;功 能: 计时;;;;;;;;
WT1: PUSH ACC
PUSH PSW
CLR ET1
CLR TR1
DJNZ M30,SRETAA
MOV TL0,#0B0H
MOV TH0,#3CH
MOV M30,#4
CPL 21H.0
JB 20H.0,WT1_1
JB 20H.1,WT1_2
JB 20H.2,WT1_3
JB 20H.3,WT1_4
JB 20H.4,WT1_5
JB 20H.5,WT1_6A
JB 20H.6,WT1_7A
SRETAA:JMP SRETA
WT1_6A:JMP WT1_6
WT1_7A:JMP WT1_7
WT1_1:JB 21H.0,WT1_CPL
MOV X,#4
MOV A,#' '
MOV B,X
CALL LCDP2
INC X
MOV A,#' '
MOV B,X
CALL LCDP2
JMP SRETA
WT1_CPL:CALL LCDXS_2
JMP SRETA
WT1_2:JB 21H.0,WT2_CPL
MOV X,#7
MOV A,#' '
MOV B,X
CALL LCDP2
INC X
MOV A,#' '
MOV B,X
CALL LCDP2
JMP SRETA
WT2_CPL:CALL LCDXS_2
JMP SRETA
WT1_3:JB 21H.0,WT3_CPL
MOV X,#10
MOV A,#' '
MOV B,X
CALL LCDP2
INC X
MOV A,#' '
MOV B,X
CALL LCDP2
JMP SRETA
WT3_CPL:CALL LCDXS_2
JMP SRETA
WT1_4:JB 21H.0,WT4_CPL
MOV X,#14
MOV A,#' '
MOV B,X
CALL LCDP2
JMP SRETA
WT4_CPL:CALL LCDXS_2
JMP SRETA
WT1_5:JB 21H.0,WT5_CPL
MOV X,#1
MOV A,#' '
MOV B,X
CALL LCDP1
INC X
MOV A,#' '
MOV B,X
CALL LCDP1
JMP SRETA
WT5_CPL:CALL LCDXS_1
JMP SRETA
WT1_6:JB 21H.0,WT6_CPL
MOV X,#4
MOV A,#' '
MOV B,X
CALL LCDP1
INC X
MOV A,#' '
MOV B,X
CALL LCDP1
JMP SRETA
WT6_CPL:CALL LCDXS_1
JMP SRETA
WT1_7:JB 21H.0,WT7_CPL
MOV X,#7
MOV A,#' '
MOV B,X
CALL LCDP1
INC X
MOV A,#' '
MOV B,X
CALL LCDP1
JMP SRETA
WT7_CPL:CALL LCDXS_1
JMP SRETA
SRETA:POP PSW
POP ACC
SETB ET1
SETB TR1
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -