📄 gclkb.asm
字号:
orl a,#20h ;;addr=02
mov p0,a
setb p0.7
clr p0.7
;; Display Hours Low & High
mov a,LHH
orl a,#10h ;;Addr=01
mov p0,a
setb p0.7
clr p0.7
mov a,HHH
orl a,#00 ;;Addr=00
mov p0,a
setb p0.7
clr p0.7
pop psw
pop acc
ret
;;
;;
;; ==== Function: wkdisp ====
;; To Disp Weekday in WW
;;
dispwk: mov a,WW
cjne a,#00,wkd
mov a,#6fh ;; (DWW)=0,the Blank Week Display
wkd: orl a,#60h
mov p0,a
setb p0.7
clr p0.7
ret
;;
;;
;;
;; ===== Rx Time/Week/Date ====
;; Used Regs: A, B, R1, R2
;; Function : 1. Check Rx Data legal
;; 2. Rx Overtime Control
;; 3. Save BCD-Time to Unpacked BCD buffer
;; 4. Reset Timer2 Time Constant
;; 5. Set Time-mode & RxData-ready Flag
;; Received Data Format: ControlByte ss mm hh WW DD MM YY FF
;; ControlByte : 55H - UTC TimeSource
;; AAH - Beijing TimeSource
;;
;; Data -- BinaryCode
;; WW = Mon - Sun (1 - 7)
;; FF = End Flag
rs232: push psw
push acc
push 01h
push 02h
clr es ;; Disable Serial Comm. INT
clr ri
clr RXOK ;; Clear Rx data ready flag
clr RxInt
mov r1,#RXBUF ;; RxBuf=31H -- 38H
mov a,sbuf
cjne a,#55H,HAA
ajmp rxdata
HAA: cjne a,#0AAH,HCC
ajmp rxdata
HCC: cjne a,#0CCH,ERRM
ajmp rxdata
ERRM: ajmp outrx
;; Rx Binary ss/mm/hh/ww/DD/MM/YY/FF to RxBuf
rxdata: mov @r1,a
inc r1
mov r2,#0ffh ;; Max Waiting time Laps
wtrx: jbc ri,rx1
nop
nop
nop
jbc ri,rx1
nop
nop
nop
djnz r2,wtrx
;; RxData Overtime
setb RxInt
ajmp outrx
rx1: mov a,sbuf ;; Read 1 Byte from sbuf
mov @r1,a
inc r1
mov r2,#0ffh
cjne a,#0ffh,wtrx
;; End of RX,check Head
mov a,RXBUF
cjne a,#0CCH,chktime
clr RxInt
ajmp outrx
chktime:mov a,RXSS
clr c
subb a,#60 ;; SS<60
jc ckmm
ajmp outrx
ckmm: clr c
mov a,RXMM
subb a,#60 ;; MM<60
jc ckhh
ajmp outrx
ckhh: mov a,RXHH
clr c
subb a,#24 ;; HH<24
jc chkdate
ajmp outrx
;; Check Date
;; Get yy ,Check Leap Year (2000,2004,2008 ...)
chkdate:mov a,RXYY
anl a,#03h
jz leapyy
clr LEAPY ;; Not Leap Year
ajmp month
leapyy: setb LEAPY
;; Check Month
month: mov a,RXEE ;; Check 0<mm<13
anl a,#0fh
mov RXEE,a
jnz mm13
merr: ajmp outrx ;; month=0 Err.
mm13: clr c
subb a,#13
jnc merr
;; Get No. of Days In Month
mov dptr,#0080H
mov a,RXEE
mov r2,a
movc a,@a+dptr ;; Days In A
;; Check Leap Year
cjne r2,#02,chkdd ;;check Feb.
jnb LEAPY,chkdd
mov a,#29 ;; 29 in Feb
chkdd: mov r2,a
inc r2 ;; DD+1 for Check
mov a,RXDD ;; Current Date
anl a,#1fh
jnz ddno
dderr: ajmp outrx
ddno: clr c
subb a, r2
jnc dderr
;; Check Weekday
mov a,RXWW
anl a,#07h ;; WeekDay=1 -- 7
jnz wkok
ajmp outrx ;; Week Err
wkok: mov WW,a
;; Reset System Time & Date
clr tr2 ;; Reset Timer2 init value
mov th2,rcap2h
mov tl2,rcap2l
mov MS20,#18 ;; Less 100ms
setb tr2
mov CDD,RXDD
mov CEE,RXEE
mov CYY,RXYY
;; if TTMOD = 1, then HH + 8 --> HH
jnb TTMOD,ttpack
mov a,RXHH
add a,#08
mov RXHH,a
clr c
subb a,#24
jc ttpack
mov RXHH,a
acall xdate ;; DD+1 --> DD
inc WW ;; WW+1 --> WW
mov a,WW
cjne a,#08,ttpack
mov WW,#01
;; Binary Time to Unpack BCD and Disp
ttpack: mov a,RXSS ;; Pack SS
mov b,#10
div ab
mov HSS,a
mov LSS,b
swap a
orl a,b
mov SS,a
mov a,RXMM ;; Pack MM
mov b,#10
div ab
mov HMM,a
mov LMM,b
swap a
orl a,b
mov MM,a
mov a,RXHH ;; Pack to BCD HH
mov b,#10
div ab
mov HHH,a
mov LHH,b
swap a
orl a,b
mov HH,a
acall disptime
;; Disp Date
acall dispdate
;; Disp Week
acall dispwk
setb RXOK
setb RxInt
outrx: setb es
pop 02h
pop 01h
pop acc
pop psw
reti
;;
;;
;; ======= DISPDATE ========
;; FUNCTION: 1.Convert Current Date(CDD/CEE) to Date BCDBuf
; 2.Disp BCD Date
dispdate:mov a,CDD ;; CDD to BCD
mov b,#10
div ab
mov HDD,a
mov LDD,b
mov a,CEE ;; CMM to BCD
mov b,#10
div ab
mov HEE,a
mov LEE,b
acall ddate
ret
;;
;; ready to Disp: Data-->p0 Addr-->p1.4--p1.6
ddate: mov a,LDD
orl a,#70h ;; form 0111 xxxx data for p0
mov p0,a
mov a,#00
mov p1,a
setb p1.7
clr p1.7
mov a,HDD
orl a,#70h ;; form 0111 xxxx data for p0
mov p0,a
mov a,#10h
mov p1,a
setb p1.7
clr p1.7
mov a,LEE
orl a,#70h ;; form 0111 xxxx data for p0
mov p0,a
mov a,#20h
mov p1,a
setb p1.7
clr p1.7
mov a,HEE
orl a,#70h ;; form 0111 xxxx data for p0
mov p0,a
mov a,#30h
mov p1,a
setb p1.7
clr p1.7
ret
;;
;; ====== XDATE =======
;;
;; Function: when hour=24,Auto Renew Date
;;
xdate: push acc
push psw
;; Get Days In Month
mov dptr,#0080h
mov a,CEE
mov r4,a ;; Month -->r4
movc a,@a+dptr ;; Max_Days in month -->A
cjne r4,#02,getday
;; Month=2 & Leap Year,Days=29
jnb LEAPY,getday
inc a ;; 29Day in Frb.
getday: cjne a,CDD,adday ;; Today is not the Final-day,day+1
;; check month=12
cjne r4,#12,newmm
;; New Year !
mov CDD,#01
mov CEE,#01
inc CYY
ajmp xdout
adday: inc CDD
ajmp xdout
newmm: mov CDD,#01
inc CEE
xdout: pop psw
pop acc
ret
;;
;; ==== ldate ====
;; function: According to CurrentDate
;; To Compute lastday's YY/MM/DD
;;
ldate: push 04h
mov a,CDD
dec a
mov CDD,a
jnz lEDok
;; CDD=0, renew CDD and CEE
mov a,CEE ;; CEE-1 -->CEE
dec a
jnz ldays
mov CEE,#12
mov CDD,#31
dec CYY ;; CYY-1 --> CYY
ajmp lEDok
ldays: mov CEE,a
mov r4,a ;; Month -->r4
mov dptr,#0080h
movc a,@a+dptr ;; Max_Days in month -->A
mov CDD,a
cjne r4,#02,lEDok
;; Month=2,to check Year !
mov a,CYY
anl a,#03 ;; Check Leap Year
jnz lEDok
mov CDD,#29 ;; 29Day in Frb.
lEDok: pop 04h
ret
;;
;; === lWeek ===
;; To Dec WeeKDay
lweek: mov a,WW
dec a
jnz lwkout
mov WW,#07
lwkout:ret
;;
;; === BCDBin ====
;; Function: Trans HH BCD to Binary,Save to A
;;
BCDBin: mov a,HH
mov b,#10h
div ab
jnz BCD1
mov a,b
ajmp BCD3
BCD1: mov r6,a
mov a,b
BCD2: add a,#10
djnz r6,BCD2
BCD3: ret
;;
;; === Delay Time 100ms ====
;; Regs Used: R4,R5
D100ms:push 04H ;; Save R4,R5
push 05H
mov R4,#80
Dms1: mov R5,#250
Dms2: nop
nop
nop
nop
djnz R5,Dms2
djnz R4,Dms1
pop 05H
pop 04H
ret
;;
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
nop
nop
nop
ljmp main
END
;; ===== End of Program ====
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -