📄 asmsy54.asm
字号:
/*硬件实验*/
/*实验名称: 时钟芯片控制实验
/*版本:TK DPJ-1
/*程序:
/*时间:2005年3月5日
/*修改:
/*版权:
实验说明: */
SECOND XDATA 8000H ; 秒寄存器
SECOND_ALARM XDATA 8001H ; 秒闹钟寄存器
MINUTE XDATA 8002H ; 分寄存器
MINUTE_ALARM XDATA 8003H ; 分闹钟寄存器
HOUR XDATA 8004H ; 时寄存器
HOUR_ALARM XDATA 8005H ; 时闹钟寄存器
WEEK XDATA 8006H ; 星期寄存器
DATE XDATA 8007H ; 日寄存器
MONTH XDATA 8008H ; 月寄存器
YEAR XDATA 8009H ; 年寄存器
REG_A XDATA 800AH ; 寄存器 A
REG_B XDATA 800BH ; 寄存器 B
REG_C XDATA 800CH ; 寄存器 C
REG_D XDATA 800DH ; 寄存器 D
CENTURY XDATA 8032H ; 世纪寄存器
;==================================================
;-------------------------------------------------------
SECOND_BUFFER EQU 51H ;秒缓冲区
MINUTE_BUFFER EQU 52H ;分缓冲区
HOUR_BUFFER EQU 53H ;时缓冲区
WEEK_BUFFER EQU 50H ;星期缓冲区
DATE_BUFFER EQU 54H ;日缓冲区
MONTH_BUFFER EQU 55H ;月缓冲区
YEAR_BUFFER EQU 56H ;年缓冲区
CENTURY_BUFFER EQU 57H ;世纪缓冲区
LEDDBUF EQU 30H
LEDTEMP EQU 40H
;=======================================================
;-------------------------------------------------------
;主程序
ORG 0
AJMP START
ORG 0018H
START:
MOV 53H,#00H ;时
MOV 52H,#00H ;分
MOV 51H,#00H ;秒
MOV 54H,#00H ;日
MOV 55H,#00H ;月
MOV SP,#60H
CALL WRITETIME ;调用时钟写
MLOOP:
CALL READTIME ;调用时钟读
LCALL DISPLAY
LCALL DELAY
call TestKey ;检测键盘
jz MLoop ;有键按下
call GetKey ;读键值
JNB Acc.0 ,JIA1 ;A为偶数键转加一处理
DEC A ;A为奇数键作减一处理
RR A ;A减一除二
MOV R0,#SECOND_BUFFER ;取时间缓冲区首址
ADD A,R0
MOV R0,A
DEC @R0 ;设置减一 1——秒-1 3——分-1 5——时-1
SJMP NEXT
JIA1:
RR A ;A除二
MOV R0,#SECOND_BUFFER ;取时间缓冲区首址
ADD A,R0
MOV R0,A
INC @R0 ;设置加一 0——秒+1 2——分+1 4——时+1
NEXT:
CALL WRITETIME ;调用时钟写
AJMP MLOOP
;========================================================
WRITETIME:
PUSH DPH ;写时间
PUSH DPL
PUSH ACC
MOV DPTR,#REG_A ;开启振荡器和允许计时
MOV A,#00100000B
MOVX @DPTR,A
MOV DPTR,#REG_B ;设定SET=1,禁止更新资料
MOV A,#10000000B
MOVX @DPTR,A
MOV DPTR,#SECOND ;设定秒
MOV A,SECOND_BUFFER
MOVX @DPTR,A
MOV DPTR,#MINUTE ;设定分
MOV A,MINUTE_BUFFER
MOVX @DPTR,A
MOV DPTR,#HOUR ;设定时
MOV A,HOUR_BUFFER
MOVX @DPTR,A
MOV DPTR,#WEEK ;设定星期
MOV A,WEEK_BUFFER
MOVX @DPTR,A
MOV DPTR,#DATE ;设定日
MOV A,DATE_BUFFER
MOVX @DPTR,A
MOV DPTR,#MONTH ;设定月
MOV A,MONTH_BUFFER
MOVX @DPTR,A
MOV DPTR,#YEAR ;设定年
MOV A,YEAR_BUFFER
MOVX @DPTR,A
MOV DPTR,#CENTURY ;设定世纪
MOV A,CENTURY_BUFFER
MOVX @DPTR,A
MOV DPTR,#REG_B ;设定SET=0,BCD模式,24小时制
MOV A,#00000010B
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
;========================================================
READTIME: ;读时间
PUSH DPL
PUSH DPH
PUSH ACC
MOV DPTR,#REG_A ;读取寄存器 A
RTCBUSY:
MOVX A,@DPTR
JB ACC.7,RTCBUSY ;测试UIP位,如果UIP=0;则执行以下程序
MOV DPTR,#SECOND ;读取秒资料
MOVX A,@DPTR
MOV SECOND_BUFFER,A
MOV DPTR,#MINUTE ;读取分数据
MOVX A,@DPTR
MOV MINUTE_BUFFER,A
MOV DPTR,#HOUR ;读取时资料
MOVX A,@DPTR
MOV HOUR_BUFFER,A
MOV DPTR,#WEEK ;读取星期资料
MOVX A,@DPTR
MOV WEEK_BUFFER,A
MOV DPTR,#DATE ;读取日资料
MOVX A,@DPTR
MOV DATE_BUFFER,A
MOV DPTR,#MONTH ;读取月资料
MOVX A,@DPTR
MOV MONTH_BUFFER,A
MOV DPTR,#YEAR ;读取年资料
MOVX A,@DPTR
MOV YEAR_BUFFER,A
MOV DPTR,#CENTURY ;读取世纪资料
MOVX A,@DPTR
MOV CENTURY_BUFFER,A
POP ACC
POP DPH
POP DPL
RET
;==========================================================
DISPLAY: ;10位LED串行静态显示
LCALL TOLED
MOV R0, #LEDDBUF
MOV R1, #LEDTEMP
MOV R2, #4 ;前8位
DP10:MOV DPTR,#SEGTAB1 ;小数点不亮
MOV A, @R0
MOVC A, @A+DPTR
MOV @R1, A
INC R0
INC R1
MOV DPTR,#SEGTAB2 ;小数点亮
MOV A, @R0
MOVC A, @A+DPTR
MOV @R1, A
INC R0
INC R1
DJNZ R2, DP10
MOV R2, #2 ;前2位
DP101:MOV DPTR,#SEGTAB1 ;小数点不亮
MOV A, @R0
MOVC A, @A+DPTR
MOV @R1, A
INC R0
INC R1
DJNZ R2, DP101
MOV R0, #LEDTEMP
MOV R1, #10
DP12:MOV R2, #8
MOV A, @R0
DP13:RLC A
MOV P3.0, C
CLR P3.1
SETB P3.1
DJNZ R2, DP13
INC R0
DJNZ R1, DP12
RET
SEGTAB1: DB 3FH,06H,5BH,4FH,66H,6DH ;小数点不亮的代码
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,7BH,71H,00H,40H
SEGTAB2: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH ;小数点亮的显示代码
DB 0FDH,87H,0FFH,0EFH,0F7H,0FCH
DB 0B9H,0DEH,0FBH,0F1H
ToLED:
mov a, MONTH_BUFFER ;月
mov b, #16
div ab
mov LEDDBuf, a
mov LEDDBuf+1, B
mov a, DATE_BUFFER ;日
mov b, #16
div ab
mov LEDDBuf+2, a
mov LEDDBuf+3, B
mov a, HOUR_BUFFER ;时
mov b, #16
div ab
mov LEDDBuf+4, a
mov LEDDBuf+5, B
mov a, MINUTE_BUFFER ;分
mov b, #16
div ab
mov LEDDBuf+6, a
mov LEDDBuf+7, B
mov a, SECOND_BUFFER ;秒
mov b, #16
div ab
mov LEDDBuf+8, a
mov LEDDBuf+9, B
RET
;========================================================
DELAY: MOV R4,#30 ;延时
AA1: MOV R5,#0FFH
AA: NOP
NOP
DJNZ R5,AA
DJNZ R4,AA1
RET
;========================================================
;P1 键盘读入口
TestKey: ;检测键盘
MOV P1, #0FH
MOV A, P1 ; 读入键状态
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable:DB 0EEH,0DEH,0BEH,07EH
DB 0EDH,0DDH,0BDH,07DH
DB 0EBH,0DBH,0BBH,07BH
DB 0E7H,0D7H,0B7H,077H ; 键码定义
GetKey: ;读键值
MOV P1, #0FH
MOV A, P1
CJNE A, #0FH, K12
LJMP MLOOP
K12: MOV B,A
MOV P1, #0EFH ;
MOV A, P1
CJNE A, #0EFH,K13 ;
MOV P1, #0DFH
MOV A, P1
CJNE A, #0DFH,K13 ;
MOV P1, #0BFH
MOV A, P1
CJNE A, #0BFH,K13;
MOV P1, #7FH
MOV A, P1
CJNE A, #7FH, K13;
LJMP MLOOP
K13: ANL A, #0F0H;
ORL A, B
MOV B, A
MOV R1, #16
MOV R2, #0
MOV DPTR,#KEYTABLE
K14: MOV A,R2
MOVC A,@A+DPTR
CJNE A,B,K16
MOV P1, #0FH;
K15: MOV A, P1
CJNE A, #0FH, K15;
MOV A,R2
RET
K16: INC R2
DJNZ R1,K14
LJMP MLOOP
;========================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -