?? 萬年歷.a51
字號:
;***********************************************
;電子萬年歷程序
;作者:張朋坤
;2007.4.2
;***********************************************
ORG 0000H
AJMP MAIN
ORG 000BH ;T0中斷服務程序入口
LJMP DISPLAY
;***********************************************
;30H~3DH單元顯示緩沖區,定義如下:
;30H 月十位 31H 月個位
;32H 日十位 33H 日個位
;34H 時十位 35H 時個位
;36H 分十位 37H 分個位
;38H 秒十位 39H 秒個位
;3AH 星期位 3BH 未用
;3CH 年十位 3DH 年個位
;************************************************
;編程思想:
;用T0產生一個定時中斷,在中斷服務程序中,顯示14個LED;
;主程序中,讀DS1302的數據。
;主程序中加了一點延時的原因:
;在Proteus中,不停的訪問DS1302所占用CPU的時間太多,;加了延時后,訪問減少,CPU的占有時間大大減少。
;****************************************************************
MAIN: MOV TMOD,#02H ;T0定時,工作方式2
MOV TH0,#00H ;T0計數初值
MOV TL0,#00H
SETB EA
SETB ET0
SETB TR0
MOV R1,#30H
MOV R6,#14
L0:ACALL PR1302
ACALL DELAY
AJMP L0
DELAY: MOV R3,#0
L1: MOV R5,#0
DJNZ R5,$
DJNZ R3,L1
RET
;**********************************************
;顯示程序
;**********************************************
DISPLAY:PUSH ACC
MOV DPTR,#TAB1
MOV A,R6
MOVC A,@A+DPTR
MOV P2,A
MOV DPTR,#TAB2
MOV A,R6
MOVC A,@A+DPTR
MOV P3,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
INC R1
DJNZ R6,LOOP
MOV R1,#30H
MOV R6,#14
LOOP: POP ACC
RETI
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H
TAB1:
DB 00H,00H,00H,00H,00H,00H,00H,80H,40H,20H,10H,08H,04H,02H,01H
TAB2:
DB 00H,20H,10H,08H,04H,02H,01H,00H,00H,00H,00H,00H,00H,00H,00H
;********************************************************
;處理DS1302子程序
;功能:1302得到的時間是以壓縮的BCD碼存在44~49H中,次程序把它們
;分解成單字節的BCD碼,并存入顯示緩沖區
;********************************************************
PR1302:ACALL GET1302
MOV A,44H ;S
SWAP A
ANL A,#0FH
MOV 38H,A
MOV A,44H
ANL A,#0FH
MOV 39H,A
MOV A,45H ;M
SWAP A
ANL A,#0FH
MOV 36H,A
MOV A,45H
ANL A,#0FH
MOV 37H,A
MOV A,46H ;H
SWAP A
ANL A,#0FH
MOV 34H,A
MOV A,46H
ANL A,#0FH
MOV 35H,A
MOV A,47H ;D
SWAP A
ANL A,#0FH
MOV 32H,A
MOV A,47H
ANL A,#0FH
MOV 33H,A
MOV A,48H ;M
SWAP A
ANL A,#0FH
MOV 30H,A
MOV A,48H
ANL A,#0FH
MOV 31H,A
MOV A,49H ;W
ANL A,#0FH
DEC A
MOV 3AH,A
MOV A,4AH ;y
SWAP A
ANL A,#0FH
MOV 3CH,A
MOV A,4AH
ANL A,#0FH
MOV 3DH,A
RET
;**************************************************
;讀DS1302時鐘子程序
;**************************************************
RST EQU P1.0
SCLK EQU P1.1
IO EQU P1.2
GET1302:
MOV R0,#44H;
MOV R7,#7
MOV R2,#81H ;秒地址
G13021: CLR RST
CLR SCLK
SETB RST
MOV B,R2 ;秒 分 時 日 月 星期 年 地址
LCALL RTInputByte
LCALL RTOutputByte
MOV @R0,A ;秒
INC R0
INC R2
INC R2
SETB SCLK
CLR RST
DJNZ R7,G13021
RET
;*********************************************************
RTInputByte:
MOV R4,#8
Inbit1: MOV A,B
RRC A
MOV B,A
MOV IO, C
SETB SCLK
CLR SCLK
DJNZ R4,Inbit1
RET
;***************************************************
RTOutputByte:
MOV R4,#8
Outbit1: MOV C,IO
RRC A
SETB SCLK
CLR SCLK
DJNZ R4,Outbit1
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -