📄 wds12887.asm
字号:
;参考程序A.汇编程序WDS12887.ASM. 程序功能:读取时钟值,并将时,分,秒显示在
;数码管上. 可以实现时钟初始化(授时)操作.
;运行初始化程序DS12INIT之前,要先用当前时间值(年、月、日、时、分、秒)改
;写DS12887的时间寄存器(0000H~0009H)内的数据,见表XX。要先修改程序中的
;初始化子程序DS12INIT中的当前时间值,并在主程序WDS12887.ASM中将< ; Lcall
;DS12INIT>语句的<;>取消(即运行初始化子程序DS12INIT),主程序即被修改成为时
;钟初始化程序.完成初始化后,再将< ; Lcall DS12INIT>语句的<;>加上(即注销初
;始化子程序),即可恢复主程序WDS12887.ASM.再次运行主程序,就可以实现实时时钟
;在六位数码管上显示.
;WDS12887.ASM.
$INCLUDE (C8051F020.inc)
CS12887 EQU 8300H ;时钟DS12887的端口地址
CS12887A EQU 830AH ;
CS12887B EQU 830BH
CS12887C EQU 830CH
PPA EQU 8000H ;8255的端口地址
PPB EQU 8001H
PPC EQU 8002H
CWR EQU 8003H
ORG 0
STAR: MOV WDTCN,#0DEH ;关闭看门狗
MOV WDTCN,#0ADH
MOV 0E3H,#40H; /*使能交叉开关,弱上拉*/
MOV 0B5H,#0C0H ;/*设置P7为推拉模式,P4,P5,P6为漏极开路
MOV 0A3H,#2CH ;/*EMIF工作在地址/数据复用方式,只用外部存储器,
;ALE高/低脉宽占1个SYSCLK周期*/
MOV 0A1H,#6DH ;/*地址建立/保持时间占1个SYSCLK周期,
;/WR和/RD占12个SYSCLK周期*/
ACALL C8255 ;8255初始化
; Lcall DS12INIT ; DS12887初始化,授时:设定初始值:年,月,日,时,分,秒
MAIN: Lcall DS12T ;从DS12887读出当前时钟值:年,月,日,时,分,秒
LCALL EXCHANG ;变换数据存放格式
LCALL DISPLED ;用六位数码管显示时,分,秒
AJMP MAIN
DS12INIT: MOV DPTR,#CS12887B
MOV A, #080H ;设置 SET=1,禁止时间更新
MOVX @DPTR,A
MOV DPTR,#CS12887 ;CS12887=8F00H
MOV A,#00H ;写入当前秒值:"00"
MOVX @DPTR,A
INC DPTR
MOV A,#0FFH ;NONE ALARM秒不报警(不闹秒)
MOVX @DPTR,A
INC DPTR
MOV A,#30H
MOVX @DPTR,A ; 写入当前分值:"30"分
INC DPTR
MOV A,#0FFH
MOVX @DPTR,A ;NONE ALARM 分不报警(不闹分)
INC DPTR
MOV A,#11H
MOVX @DPTR,A ; 写入当前时值:"11"时 ;HOURS
INC DPTR
MOV A,#0FFH ;NONE HOUR ALARM时不报警(不闹时)
MOVX @DPTR,A
INC DPTR
MOV A,#5H ;DAY OF THE WEEK写入当前周日:"6"
MOVX @DPTR,A
INC DPTR
MOV A,#24H
MOVX @DPTR,A ;DATA OF THE MONTH写入当前日期:"24"
INC DPTR
MOV A,#08H
MOVX @DPTR,A ;MONTH 写入当前月份:"09"月
INC DPTR
MOV A,#05 ;YEAR 写入当前年份:" 05 "年
MOVX @DPTR,A
MOV DPTR,#CS12887C ;CS12887C=830CH
MOVX A,@DPTR ;CLEAR C
INC DPTR
MOVX A,@DPTR ;CLEAR D
MOV DPTR,#CS12887B ;更新周期正常运行,禁止中断,BCD码格式,24小时制
MOV A,#02H ;不用夏时制
MOVX @DPTR,A
RET
;读出年、月、日、时、分、秒及周日的子程序DS12T:
DS12T: ACALL TDU ;读出DS12887时钟数据,存放在外部SRAM(62256)的00-09H单元中.
RET
RD0: MOV DPTR,#CS12887A ;从DS12887读出数据,先判更新周期结束否?查询UIP位
MOVX A,@DPTR ; UIP=0,时钟更新周期已结束.
JBC ACC.7,RD0 ; UIP=1,时钟更新周期未结束.
RET
TDU: ACALL RD0
MOV R0,#0H
MOV DPTR,#CS12887
RR0: MOVX A,@DPTR
MOV P6,#0 ;从DS12887读出数据:年,月,日,时,分,秒,存如片外RAM(62256),
MOVX @R0,A ;的00H--09H单元中去
INC DPTR
INC R0
CJNE R0,#9,RR0
MOV DPTR,#CS12887A
MOV A,#20H
MOVX @DPTR,A
INC DPTR
INC DPTR
MOVX A,@DPTR
INC DPTR
MOVX A,@DPTR
MOV DPTR,#CS12887B
MOV A,#02H ;设定24小时制,禁止中断,禁止报警
MOVX @DPTR,A
RET
;数据转换子程序
EXCHANG: MOV DPTR,#0009H ;外部SRAM的09单元中.存放年(YEAR)的压缩BCD码;
MOV R0,#7DH ;(00 05);7CH-7DH 中存十年、年(BCD码)
LCALL YMD
MOV DPTR,#0008H ;外部SRAM的08单元中.存放月(MONTH)的压缩BCD码;
MOV R0,#7BH ;7BH-7AH存月份(BCD码)
LCALL YMD
MOV DPTR,#0007H ;外部SRAM的07单元中存放日(DATE)的压缩BCD码
MOV R0,#79H ;79H-78H存日期(BCD码)
LCALL YMD
MOV DPTR,#0006H ;外部SRAM的06单元中存放周日的压缩BCD码
MOVX A,@DPTR ;77H存周日(BCD码)
MOV 77H,A
MOV DPTR,#0004H;将外扩SRAM 04H单元内存放时的压缩BCD码的值传给
MOV R0,#72h ;72H~71H存时值(BCD码)
LCALL YMD
MOV DPTR, #0002 ;外部SRAM的02单元中存放分(MINUTE)的压缩BCD码
MOV R0, #74H ;74H~73H存分值(BCD码)
LCALL YMD
MOV DPTR, #0000H;外部SRAM的00单元中存放秒(SECOND)的压缩BCD码
MOV R0, #76H ;76H-75H存秒值(BCD码)
LCALL YMD
RET
YMD: MOVX A,@DPTR
;YMD将压缩BCD码(一字节存两位数)转化为BCD码(一字节存一位数)
MOV B,A
ANL A, #0FH
MOV @R0, A
DEC R0
MOV A ,B
SWAP A
ANL A, #0FH
MOV @R0,A
RET
;显示功能子程序,要显示的数据在内部RAM的71H--76H 中(BCD码)
DISPLED: ACALL C8255
MOV R2,#01H
MOV R5,#6
MOV R0,#71H
DSP1: MOV DPTR,#PPB
MOV A,R2
MOVX @DPTR,A
MOV A,@R0
ANL A,#0FH
DSP2: MOV DPTR,#BCD
MOVC A,@A+DPTR
MOV B,A
MOV DPTR,#PPC
MOV A,R5
ANL A,#1
CJNE A,#1,SS0
MOV A,B
ADD A,#80H
AJMP SS1
SS0: MOV A,B
SS1: MOVX @DPTR,A
ACALL DEL0
MOV A,R2
RL A
MOV R2,A
INC R0
DJNZ R5,DSP1
RET
BCD: DB 3FH,06H,5BH,4FH ;显示数值,0,1,2,3
DB 66H,6DH,7DH,07H ;4,5,6,7
DB 7FH,6FH,77H,7CH ;8,9,A,B
DB 39H,5EH,79H,71H ;C,D,E,F
DB 73H,3EH,31H,6EH ;P,U,Z,Y
DB 0FFH,00H ;8,灭
DEL0:MOV 08H,#0FH ;延时子程序
TM: MOV 07H,#20H
DJNZ 07H,$
DJNZ 08H,TM
RET
;初始化8255
C8255:MOV A,#80H ; 设置PC口,PB口为输出,PA口为输入
MOV DPTR,#8003H ;#8003H为8255的控制寄存器地址
MOVX @DPTR,A
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -