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

📄 gclkb.asm

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