📄 ex10-3.asm
字号:
;*********************************************************************/
T_RST Bit P1.5 ;实时时钟复位线引脚
T_CLK Bit P1.6 ;实时时钟时钟线引脚
T_IO Bit P1.7 ;实时时钟数据线引脚
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
DAY EQU 33H
MONTH EQU 34H
WEEK EQU 35H
YEARL EQU 36H
;*********************************************************************/
ORG 0000H
START: LJMP MAIN
ORG 0060H
MAIN: MOV SP,#60H ;修改堆栈
;*********************************************************************
MOV SECOND,#55H ;初始时间设为23:59:55
MOV MINUTE,#59H
MOV HOUR,#23H
MOV DAY,#31H ;初始日期设为07年12月31日第一周
MOV MONTH,#12H
MOV WEEK,#01H
MOV YEARL,#07H
LCALL SETDS1302
LCALL LCD_INIT ;调用液晶模块初始化子程序
MOV R3,#20
MOV TMOD,#01H
MOV TH0,#3CH ;置定时器初值(定时50ms)
MOV TL0,#0B0H
SETB TR0 ;启动定时器0
LP1: JBC TF0,LP2 ;查询计数溢出
SJMP LP1 ;未到50 ms继续计数
LP2: MOV TH0,#3CH ;重新置定时器初值
MOV TL0,#0B0H
MOV R2,#81H ;从第1行第2位开始,设置DDRAM地址
LCALL WRTC
MOV DPTR,#ZIFU1 ;指向显示字符代码首地址
MOV R4,#06H
LCALL WP1 ;第1行字符代码写入DDRAM
LCALL DISPYMD ;显示年月日
MOV R2,#0C1H ;设置第2行DDRAM地址
LCALL WRTC
MOV DPTR,#ZIFU2 ;指向显示字符代码首地址
MOV R4,#06H
LCALL WP1 ;第1行字符代码写入DDRAM
LCALL DISPHMS ;显示时分秒
DJNZ R3,LP1 ;未到1s继续循环
LCALL GET1302 ;每到1s从DS1302读取一次时间
mov r3,#20
SJMP lp1
ZIFU1: DB "Date: "
ZIFU2: DB "Time: "
;*******************************************
DISPHMS:MOV A,HOUR ;时分秒显示子程序
SWAP A
ANL A,#03H
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV A,HOUR
ANL A,#0FH
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV R2,#2DH
LCALL WRTD
MOV A,MINUTE ;显示分
SWAP A
ANL A,#07H
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV A,MINUTE
ANL A,#0FH
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV R2,#2DH
LCALL WRTD
MOV A,SECOND ;显示秒
SWAP A
ANL A,#07H
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV A,SECOND
ANL A,#0FH
ADD A,#30H
MOV R2,A
LCALL WRTD
RET
;*****************************************
DISPYMD:MOV A,YEARL ;年月日显示子程序
SWAP A
ANL A,#03H
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV A,YEARL
ANL A,#0FH
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV R2,#2DH
LCALL WRTD
MOV A,MONTH ;显示月
SWAP A
ANL A,#07H
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV A,MONTH
ANL A,#0FH
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV R2,#2DH
LCALL WRTD
MOV A,DAY ;显示日
SWAP A
ANL A,#07H
ADD A,#30H
MOV R2,A
LCALL WRTD
MOV A,DAY
ANL A,#0FH
ADD A,#30H
MOV R2,A
LCALL WRTD
RET
;*****************************************************************
SETDS1302: CLR T_RST ;设置DS1302初始时间,并启动计时
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH ;写控制命令字
LCALL INPUTBYTE
MOV B,#00H ;写保护关闭
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
MOV R0,#SECOND ;内存中的时间首地址
MOV R1,#80H ;DS1302中的时间首地址
MOV R7,#7 ;字节数
SETLOOP:CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1 ;写命令字
LCALL INPUTBYTE
MOV A,@R0 ;设置时间
MOV B,A
LCALL INPUTBYTE
INC R0
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,SETLOOP
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH
LCALL INPUTBYTE
MOV B,#80H ;开写保护
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
nop
RET
;*****************************************************************
GET1302: ;从DS1302读取时间
MOV R0,#SECOND
MOV R1,#81H ;DS1302中读时间的首地址
MOV R7,#7
GETLOOP:CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1
LCALL INPUTBYTE ;写命令字
LCALL OUTPUTBYTE ;读时间
MOV @R0,A ;将从DS1302中读取的时间从内存中保存
INC R0 ;修改地址指针
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,GETLOOP
RET
;*****************************************************************
INPUTBYTE:MOV R4,#8 ;向DS1302写一个字节
INPUTLOOP:MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
NOP
CLR T_CLK
DJNZ R4,INPUTLOOP
RET
;*****************************************************************
OUTPUTBYTE:clr a ;从DS1302读一个字节
clr c
MOV R4,#8
OUTPUTLOOP:NOP
MOV C,T_IO
RRC A
SETB T_CLK
NOP
CLR T_CLK
DJNZ R4,OUTPUTLOOP
RET
;*****************************************************************
LCD_INIT: LCALL TIM1 ;LCD初始化子程序
MOV R2,#38H ;功能设置命令,设定8位字长,2行,5*7点阵
LCALL WRTC ;写入
LCALL TIM3 ;延时100us
MOV R2,#38H
LCALL WRTC ;写入
LCALL TIM3 ;延时100us
MOV R2,#38H
LCALL WRTC ;写入
LCALL TIM3 ;延时100us
MOV R2,#01H ;清屏命令
LCALL WRTC ;写入
MOV R2,#06H ;输入方式命令
LCALL WRTC ;写入
MOV R2,#0EH ;开显示、光标不闪命令
LCALL WRTC ;写入
RET
;*****************************************************************
WAIT: MOV P2,#7FH ;忙标志判断子程序
MOV R0,#0F1H ;读忙标志地址
MOVX A,@R0
JB ACC.7,WAIT
RET
;*****************************************************************
WRTC: LCALL WAIT ;写指令代码子程序
MOV A,R2
MOV R0,#0F0H ;写指令地址
MOVX @R0,A
RET
;*****************************************************************
WRTD: LCALL WAIT ;写数据子程序
MOV R0,#0F2H ;写数据地址
MOV A,R2
MOVX @R0,A
RET
;*****************************************************************
WP1: CLR A
MOVC A,@A+DPTR
MOV R2,A
LCALL WRTD ;写入1字节字模数据
INC DPTR
DJNZ R4,WP1
RET
;*****************************************************************
TIM1: MOV R5,#03H ;延时15ms子程序
TT1: LCALL TIM2
DJNZ R5,TT1
RET
;*****************************************************************
TIM2: MOV R4,#50 ;延时5ms子程序
TT2: LCALL TIM3
DJNZ R4,TT2
RET
;*****************************************************************
TIM3: MOV R3,#50 ;延时100us子程序
TT3: DJNZ R3,TT3
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -