📄 gclkb.asm
字号:
;*************************************************
;* General GPS Clock System(Big) *
;*************************************************
;* *
;* Uses AT89C52 *
;* *
;* Main frequency : 11.0592MHZ *
;* *
;*************************************************
;; Updated By: Gou 2001/12/13
;;
;; ===== General GPS Big Clock ======
;; Display : Time/Day/Date
;;
;; RS232: 1-8-1 (mode 1), 9.6kbps
;;
;; Serial Byte Data Format: 55H/AAH ss mm hh ww DD MM YY FF
;; Time format: UTC
;; Data: Binary
;; s/mm -->0 -- 59 hh -->0 -- 23
;; ww=Mon....Sun : 1 --> 7
;; DD --> 1 -- 31 MM --> 1 -- 12 YY = xxYY
;; Beijing Time HH =UTC HH+8
;; Time Mode Lamp: P2.0 -- UTC
;; P2.1 -- Beijing
;; Data Outport:
;; p0.0 -- p0.3 Time-unit/week/date
;; p0.4 -- p0.6 Control addr
;; p0.7 -- Addr. Enable
;; p1.4 -- p1.6 Date control addr
;; p1.7 -- Addr. Enable
;; CONSTANT VALUES
;;
CNTHI EQU 04CH
CNTLO EQU 01H
CNTMS EQU 20 ; 20 int in 1 sec
CLKID EQU 00 ;
;;
;; BIT FLAG
;;
RXOK BIT 00H ;; Serial Rx Time_Date Ready(1)
TTMOD BIT 01H ;; TIME MODE FLAG (1-BEIJING 0 -- UTC)
LEAPY BIT 02H ;; Leap Year Flag ( 1 )
RxInt BIT 03H ;; Rx INT Flag
NHH BIT 04H ;; New Hour
;;
;; The reserved addresses list as follow:
;;
MS20 DATA 30H ;; 20ms Counter
RXBUF DATA 31H ;; RX data Buffer 31H -- 38H
RXSS DATA 32H ;; Rx SS -- YY
RXMM DATA 33H
RXHH DATA 34H
RXWW DATA 35H ;; WeekDay
RXDD DATA 36H
RXEE DATA 37H ;; EE for month
RXYY DATA 38H
RXID DATA 39H ;; Clock ID
RXFF DATA 3AH
;;
CDD DATA 40H ;; Current DD/MM/YY
CEE DATA 41H
CYY DATA 42H
LDD DATA 43H ;; Disp Date BCDBuf for DD/MM
HDD DATA 44H
LEE DATA 45H
HEE DATA 46H
WW DATA 47H ;; WeekDay( 1 -- 7)
;;
WRK DATA 48H
;;
SS DATA 50H ;; CounterTime (BCD) SS/MM/HH
MM DATA 51H
HH DATA 52H
;;
LSS DATA 53H ;; Disp time BCD code(Lo - Hi):SS/MM/HH
HSS DATA 54H
LMM DATA 55H
HMM DATA 56H
LHH DATA 57H
HHH DATA 58H
;;
;;
;;
;; ========== Main ===========
;;
org 0000h
start: ljmp main
org 0003h
nop
reti
org 000bh
nop
reti
org 0013h
nop
reti
org 001bh
nop
reti
org 0023h
ljmp rs232
org 002bh
ljmp timer2
nop
nop
nop
ljmp main
nop
ljmp main
;; ======== Main ========
;; 1. Disable All Interrupts
;; 2. Set Init Time hh:mm:ss to 00:00:00
;; 3. On Lamps
org 0080h
mdays: db 0,31,28,31,30,31,30,31,31,30,31,30,31 ;;
;; 0 for Correct Index
org 0100h
;;
main: clr p2.3
mov ie,#00h ;disable all the interrupts.
mov sp,#60h ;Init stack pointer(Stack deepth=32 bytes)
;; Init Mem Area (30H--5FH)
mov r0,#40h
mov r2,#20h
clrm: mov @r0,#00
inc r0
djnz r2,clrm
;; Disp Init Time
acall disptime
;; Set time mode Flag
jb p2.4,lmode
clr TTMOD ;; UTC
setb p2.0
clr p2.1 ;; OFF Local Time
ajmp flagx
lmode: clr p2.0
setb p2.1
setb TTMOD
flagx: clr RxInt
clr RXOK ;; Data In RxData Buf Not Ready
;; Blank Week & Date LED
mov a, #6fh ;;Blank Week
mov p0,a
setb p0.7
clr p0.7
mov LDD,#0fh
mov HDD,#0fh
mov LEE,#0fh
mov HEE,#0fh
mov WW, #0fh
acall ddate
acall dispwk
;;
;; Set Serial Com. & Timer2 Paras
mov tmod,#20h
mov th1, #0fdh
mov tl1, #0fdh
mov tcon,#40h
mov scon,#40h ;0100 0000
anl pcon,#07fh
;;
mov ip,#10h
mov rcap2l,#CNTLO ;install the resintalling counter
mov rcap2h,#CNTHI ;
mov t2con,#04h ;set timer2
mov MS20,#CNTMS ;every 20 interrupts in One sec
setb ea
setb et2
Rxlop: setb es
setb ren
lops: nop
nop
nop
;; check RxInt,Ready for ACK
jnb RxInt,lops
clr es
clr ren
clr RxInt
mov a,RXID ;; RXID=CLKID,TO ACK
cjne a,#CLKID,Rxlop
setb p2.3 ;; Ready for Tx ACK
nop
nop
nop
nop
jb RXOK, Ok66
acall D100ms ;; Rx Error No MSG Tx
mov a,#33h
ajmp ToTx
Ok66: acall D100ms
mov a,#66h
ToTx: mov sbuf,a
jnb ti,$
clr ti
mov a,#CLKID
mov sbuf,a
jnb ti,$
clr ti
mov a,#0ffH
mov sbuf,a
jnb ti,$
clr ti
clr p2.3 ;; Ready for Rx
clr p2.3
ajmp Rxlop
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
;;
;; End of Main
;;
;; ======= TIMER2 INTERRUPT =======
;; Trigged at every 50ms,20-times in 1 second
;;
;; Used Regs: A, R0
;;
;;
timer2: clr tf2
push psw ;protect the environment.
push acc
; Check the second's INT.
djnz MS20,ret1 ; Not the Second's INT.
mov MS20,#CNTMS ; Reset Second-INT Counter
ajmp xp24
ret1: ajmp adds1
xp24: jb p2.4,ltime
jb TTMOD,utime
ajmp HMSDisp ;; UTC to UTC
utime: clr TTMOD ;; Local To UTC: UTC HH = Local-08
clr p2.1
setb p2.0 ;; On UTC
mov a,HH ;; HH to Binary
mov b,#10h
div ab
jnz utime1
mov a,b
ajmp utime3
utime1: mov r6,a
mov a,b
utime2: add a,#10
djnz r6,utime2
utime3: setb NHH ;; to LastDay ?
add a,#24
subb a,#08
mov WRK,a
subb a,#24
jc utime4
clr NHH ;; In Today
mov WRk,a
utime4: mov a,WRK
mov b,#10
div ab
swap a
orl a,b
mov HH,a
jb NHH,lastd
ajmp HMSDisp
;; Adjust Date
lastd: acall ldate
mov a,WW ;; (WeekDay - 1) -->WeekDay
dec a
jnz wkday
mov WW,#07
wkday: ajmp HMSDisp
;; Do Local Time
ltime: jb TTMOD,HMSDisp ;; Local to Local
setb TTMOD ;; UTC to Local Time
clr p2.0
setb p2.1
mov a,HH ;; Local HH=UTC+8
mov b,#10h
div ab
jnz ltime1
mov a,b
ajmp ltime3
ltime1: mov r6,a
mov a,b
ltime2: add a,#10
djnz r6,ltime2
ltime3: clr NHH ;; MayBe In Today
add a,#08 ;; UTC HH+8 --> Local HH
mov WRK,a
subb a,#24
jc ltime4
mov WRK,a
setb NHH ;; Next Day
ltime4: mov a,WRK
mov b,#10
div ab
swap a
orl a,b
mov HH,a
jnb NHH,HMSDisp
acall xdate ;; renew the Date
inc WW
mov a,WW
cjne a,#08,HMSDisp
mov WW,#01
HMSDisp:acall packtime
acall disptime
jnb RXOK,ret2
acall dispdate
mov a,WW ;; Disp WeekDay
orl a,#60h ;; addr=6
mov p0,a
setb p0.7
clr p0.7
ajmp ret2
;;
adds1: mov a,MS20
cjne a,#1,ret2
mov a,SS ;; ss+1-->ss
add a,#01
da a
mov SS,a
cjne a,#60h,ret2
mov a,#00
mov SS,a
mov a,MM ;; mm+1-->mm
add a,#01
da a
mov MM,a
cjne a,#60h,ret2
mov a,#00
mov MM,a
mov a,HH ;; hh+1-->hh
add a,#01
da a
mov HH,a
cjne a,#24h,ret2
mov a,#00 ;; In Next Day,Renew Date & Week
mov HH,a
;; Renew Date / Weekday
jnb RXOK,ret2
inc WW
mov a,WW
cjne a,#08,newd
mov WW,#01
;; Renew Date
newd: acall xdate
;;
ret2: pop acc
pop psw
reti
;;
;;
;; ===== PACKTIME =====
;; Function :
;; .To Unpack BCD Time(SS:MM:HH)
;; .Put them to Disp Buffer LSS -- HHH
;; Used Regs: A
packtime: mov a,SS ;; Unpack SS
anl a,#0fh
mov LSS,a
mov a,SS
swap a
anl a,#0fh
mov HSS,a
mov a,MM ;; Unpack MM
anl a,#0fh
mov LMM,a
mov a,MM
swap a
anl a,#0fh
mov HMM,a
mov a,HH ;; Unpack HH
anl a,#0fh
mov LHH,a
mov a,HH
swap a
anl a,#0fh
mov HHH,a
ret
;;
;;
;; ==== DISPTIME ====
;;
;; Function: Display Current Time On 6 7-Segment LEDs.
;; Display Time Format(BCD) (Lo - Hi)
;; LSS HSS LMM HMM LHH HHH
;; Disp Control Code 5 4 3 2 1 0
;;
;; REGs Used : A -- Disp Data
;; Port P0
;;
disptime: push acc
push psw
;; Display Second Low & High
mov a,LSS
orl a,#50h ;;addr=05
mov p0,a
setb p0.7
clr p0.7
mov a,HSS
orl a,#40h ;;Addr=04
mov p0,a
setb p0.7
clr p0.7
;; Display Minutes Low & High
mov a,LMM
orl a,#30h ;;Addr=03
mov p0,a
setb p0.7
clr p0.7
mov a,HMM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -