📄 ds1302.asm
字号:
ORG 0000H
JMP Main
ORG 0040H
;显示控制
OUTBIT equ 08002h ; 位控制口
OUTSEG equ 08004h ; 段控制口
; 八段管显示码
LEDMAP:
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
;控制量定义
FLAG bit 20H ;标志位,用于显示模块
BitCnt data 30H ;位计数器
Command data 31H ;命令字地址
;寄存器定义
SECOND data 50H ;秒数据发送接收寄存器
MINUTE data 51H ;分
HOUR data 52H ;时
DAY data 53H ;日
MONTH data 54H ;月
DATE data 55H ;星期
YEAR data 56H ;年
;端口位定义
SCLK bit P3.0
IOD bit P3.1
RST bit P3.2
Main:
ACALL Set1302
loop:
ACALL Get1302
ACALL DisplayLED
JMP loop
;**************************************************************
;时间信息设置模块
;名称:Set1302
;描述:设置1302的(秒 分 时 日 月 星期 年)信息
;**************************************************************
Set1302:
;时间信息设定,例 08 年 07 月 01 日 20 时 15 分 30 秒 星期 二
MOV SECOND,#20H
MOV MINUTE,#40H
MOV HOUR, #10H
MOV DAY, #02H
MOV MONTH, #07H
MOV DATE, #03H
MOV YEAR, #08H
;允许写入1302
MOV R0,#8EH ;命令字
ACALL Send_Command ;发送
MOV R0,#00H ;允许写入
ACALL Send_Byte
;时间信息传输
MOV R5,#7 ;秒 分 时 日 月 星期 年
MOV R6,#80H ;初始命令字存于R6中
MOV R1,#SECOND ;秒地址暂存于R1中
nextB_W:
MOV B,R6
MOV R0,B
ACALL Send_Command
MOV B,@R1 ;Send_Byte入口
MOV R0,B
ACALL Send_Byte
INC R6 ;写(秒 分 时 日 月 星期 年)命令字依次差二
INC R6
INC R1
DJNZ R5,nextB_W
RET
;**************************************************************
;时间信息读取模块
;名称:Get1302
;描述:读取1302的(秒 分 时 日 月 星期 年)信息,并存入相应寄存器
;**************************************************************
Get1302:
;时间信息传输
MOV R5,#7 ;秒 分 时 日 月 星期 年
MOV R6,#81H ;初始命令字存于R6中
MOV R1,#SECOND ;秒地址暂存于R7中
nextU_R: ;读下一单元(Unit),单元=命令字+对应数据
MOV B,R6
MOV R0,B
ACALL Send_Command
ACALL Receive_Byte
INC R6 ;写(秒 分 时 日 月 星期 年)命令字依次差二
INC R6
INC R1
DJNZ R5,nextU_R
RET
;*******************************************************
;发送命令字模块
;名称:Send_Command
;描述:发送命令字,完成后RST保持高电平,SCLK为低电平
;入口:MOV R0,Command
;*******************************************************
Send_Command:
CLR RST
NOP
CLR SCLK
NOP
SETB RST
NOP
MOV BitCnt,#8H
MOV A,R0
nextb_S_cmd:
RRC A
MOV IOD,C
SETB SCLK
NOP
CLR SCLK
NOP
DJNZ BitCnt,nextb_S_cmd
RET
;ACALL OSC_Enable ;开振荡器
;**************************************************
;发送数据程序
;名称:Send_Byte
;描述:发送1个字节给被控器DS1302,命令字节
;为[Command],发送数据为[XmtDat]
;入口:
;MOV R0,XmtDat
;**************************************************
Send_Byte:
MOV BitCnt,#8H
MOV A,R0
nextb_S:
RRC A
MOV IOD,C
NOP
SETB SCLK ;在上升沿向1302输入一位,SCLK在传输命令字后已经使变为低电平
NOP
CLR SCLK
NOP
DJNZ BitCnt,nextb_S
CLR RST ;停止数据传输
RET
;*************************************************
;接收数据模块
;名称:Receive_Byte
;描述:从被控器DS1302接收1个字节到[R1]开始的内存单元
;入口:
;mov r1,RcvAddr
;*************************************************
Receive_Byte:
MOV BitCnt,#8
nextb_R:
MOV C,IOD
RRC A
SETB SCLK ;数据移位
NOP
CLR SCLK
NOP
DJNZ BitCnt,nextb_R ;每字节的8位是否传完
MOV @R1,A
MOV P1,A ;del
CLR RST ;停止数据传输
RET
;*********************************************************
; 延时子程序
;*********************************************************
Delay:
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
;*********************************************************
;显示模块
;*********************************************************
DisplayLED:
mov r0, #SECOND
mov r1, #3 ; 显示: 时 分 秒
mov r2, #00000001b ; 从右边开始显示
mov r3,#2 ;读一个时间字节,2次显示
clr FLAG ;先取低四位,再取高四位
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 关所有八段管
loop1:
mov a, @r0
mov b, a ;b暂存数据
Loop2:
jb FLAG,HighB
anl a,#0FH
continue:
mov dptr,#LEDMAP
movc a,@a+dptr
mov dptr, #OUTSEG
movx @dptr,a
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #01
call Delay
mov a, r2 ; 显示下一位
rl a
mov r2, a
setb FLAG
djnz r3,loop2
mov r3,#2 ;R3恢复为2
clr FLAG ;显示低四位
inc r0
djnz r1, Loop1
jmp exit
HighB:
mov a,b
anl a,#0F0H
rr a ;左移四位
rr a
rr a
rr a
clr FLAG
jmp continue
exit:
ret
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -