這是我在大學的時候編的. 記得當時我們開發(fā)小組從下午5點調(diào)試到11點多才成功, 最有成就感的一天!
;=======================================
; Clock programe
; Create date: 2004_05_12
; First Modify: 2004_05_13
; First Modify: 2004_05_13
; Last Modify: 2004_05_20
; Author: Dengjingyue
;=======================================
SDA BIT P0.1 ;定義
SCL BIT P0.0 ;定義
Second_0 EQU 40H ;定義秒個位
Second_1 EQU 41H ;定義秒十位
LED2 EQU 42H ;
Minute_0 EQU 43H ;定義分個位
Minute_1 EQU 44H ;定義分十位
LED5 EQU 45H
Hour_0 EQU 46H ;定義小時個位
Hour_1 EQU 47H ;定義小時十位
SECOND EQU 48H ;定義秒
MINUTE EQU 49H ;定義分
HOUR EQU 50H ;定義小時
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INT_CLOCK ;中斷入口
ORG 0100H
;============主程序開始=======================
MAIN:
MOV R7,#00H ;賦初值
MOV SECOND, #00H ;賦初值
MOV MINUTE, #00H ;賦初值
MOV HOUR, #00H ;賦初值
ACALL Separate ;拆分子程序
ACALL DISPLAY ;顯示子程序
;----------------------------
MOV TMOD,#01H ;設(shè)定時器0為定時方式1(16位)
MOV TH0, #0DBH ;定時初值高8位
MOV TL0, #0F0H ;定時初值低8位
SETB EA ;開總中斷允許
SETB ET0 ;開定時器0允許中斷
SETB TR0 ;啟動定時器
AJMP $
;================中斷服務(wù)子程序=====================
INT_CLOCK:
MOV TH0, #0DBH ;定時初值高8位
MOV TL0, #0F0H ;定時初值低8位
INC R7
CJNE R7,#100, EXIT ;每次中斷時間是0.1秒, 100次是1秒.
MOV R7,#00 ;到1秒, R7清零
;-----------------------------------
INC SECOND ;秒加1
MOV A,SECOND
CJNE A,#60, LP
MOV SECOND, #00H ;秒清0
INC MINUTE ;分加1
MOV A,MINUTE
CJNE A,#60, LP
MOV MINUTE, #00H ;分清0
INC HOUR ;小時1
MOV A,HOUR
CJNE A,#24, LP
MOV HOUR, #00H ;小時清0
LP: ACALL Separate ;拆分子程序
ACALL DISPLAY ;顯示子程序
; ACALL DELAY_1* ;延時約一秒
**IT: RETI
;===主程序結(jié)束===
;==============拆分子程序=====================
Separate:
MOV DPTR,#TAB1
;-------------------
MOV A,SECOND
MOVC A,@A+DPTR ;查表,十六進制轉(zhuǎn)為十進制數(shù)
mov R0,A ;R0暫存A中的數(shù)
ANL A,#0FH ;屏蔽高4位
MOV Second_0, A ;送秒個位
MOV A,R0 ;恢復(fù)A中數(shù)
ANL A, #0F0H ;屏蔽低4位
SWAP A ;高4位與低4位交換
MOV Second_1,A ;送秒十位
;--------------------
MOV LED2,#0FFH ;數(shù)碼管滅的顯示代碼
;--------------------
MOV A,MINUTE
MOVC A,@A+DPTR
mov R0,A
ANL A,#0FH
MOV Minute_0, A
MOV A,R0
ANL A, #0F0H
SWAP A
MOV Minute_1,A
;-----------------------
MOV LED5,#0FFH ;數(shù)碼管滅的顯示代碼
;-----------------------
MOV A,HOUR
MOVC A,@A+DPTR
ANL A,#0FH
MOV Hour_0, A
MOV A,HOUR
ANL A, #0F0H
SWAP A
MOV Hour_1,A
RET
;-----------------------
TAB1: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ; 十六進制轉(zhuǎn)十進制數(shù)表
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H
DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H,88H,89H
DB 90H,91H,92H,93H,94H,95H,96H,97H,98H,99H
;===================顯示子程序=====================
DISPLAY:
MOV DPTR,#TAB2 ;送顯示代碼首地址
MOV A,Second_0 ;秒個位送A
MOVC A,@A+DPTR ;顯示代碼查表
ACALL SHIFT ;調(diào)移位子程序
MOV A,Second_1
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED2
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Minute_0
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Minute_1
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED5
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Hour_0
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,Hour_1
MOVC A,@A+DPTR
ACALL SHIFT
RET
;----------------------------------------------
TAB2: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H ;0,1,2,3,4,5,6,7 顯示代碼
DB 10H,90H,50H,1CH,39H,16H,38H,78H,0FFH ;8,9,A,B,C,D,E,F,滅
;---------------------------------------------
;================移位子程序==================
SHIFT: push a ;A進棧暫存
MOV R2,#8
CLR C
CLR SCL
DL:
RLC A
MOV SDA,C
SETB SCL
CLR SCL
DJNZ R2,DL
pop a ;出棧恢復(fù)A值
RET
;============延時約一秒子程序=============
DELAY_1S: MOV R6,#1FH
LOOP7: MOV R5,#0FFH
LOOP6: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R5,LOOP6
DJNZ R6,LOOP7
RET
END
完整程序請從這里下:http://www.zg4o1577.cn/ziliao/file/shiz.rar ,本人已經(jīng)測試通過.