⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gclkb.asm

📁 89c52的汇编程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -