;* MAIN 루틴에서는 계속 포트다이오드만 돌고 있다가
;* 1초에 타임인터럽트가 발생하여
;* SERVICE 루틴에서는 세그먼트를 작동시킨다.
;* made by lettory@gmail.com

ORG      8000H
SEGL            EQU    0FFC3H
SEGM            EQU    0FFC2H
SEGR            EQU    0FFC1H

  MOV TMOD,#00000001B  ;GATE =0,TIMER MODE,RUN MODE 01
  MOV PSW, #18H ; 01 BANK
  MOV SP, #50H
  MOV PSW, #08H
  MOV     IE,#10000010B   ; EA 1, ET0 1

  MOV  R3, #00000001B   ; PORT DIODE
  MOV 40H, #100 ; 10ms X 100 = 1secS

  CALL SEGCLR  ; SEGMENT CLEAR 
  CALL DIS
  MOV TH0,#0D8H  ; FFFF - 2710(10000) = D8EF
  MOV     TL0,#0EFH
  SETB    TCON.TR0  ; Timer Start
MAIN:  
  MOV A, R3  ; 포트다이오드 ROTATE
  MOV     P1, A  ; PORT DIODE ON
  RL A
  MOV R3, A

  CALL DELAY

           JMP MAIN   

SERVICE:     PUSH PSW
  PUSH A
  MOV PSW, #18H
  CLR     TCON.TR0  ; Timer Stop
  MOV TH0,#0D8H  ; 65535 - 10000 + 4 = D8F3
  MOV     TL0,#0F3H   ; 4CYCLE 소요 = 0.004ms
  SETB    TCON.TR0  ; Timer Start
  DJNZ 40H, RETURN ; if(100번반복이 아니면 RETURN)
  MOV 40H, #100 ; 10ms X 100 = 1sec
  CALL DIS
  CLR C
  JMP SEGMENT

SEGMENT:          ; SEGMENT CONTROL
  INC R0
  MOV A, R0
  DA A
  MOV R0, A
  CJNE R0, #60H, RETURN
  CLR A   ; 60초가 되면 초기화
  MOV R0, A
  
  INC R1
  MOV A, R1
  DA A
  MOV R1, A
  CJNE R1, #60H, RETURN
  CLR A   ; 60분이 되면 초기화
  MOV R1, A

  INC R2
  MOV A, R1
  DA A
  MOV R1, A
  CJNE R2, #24H, RETURN  
  CALL SEGCLR  ; 24시가 넘어가게 되면 모두 초기화

RETURN:  
  POP A
  POP PSW
  RETI   ;인터럽트발생 부분으로 리턴

SEGCLR:     ; SEGMENT CLEAR
  CLR A
  MOV R0, A
  MOV R1, A
  MOV R2, A
  RET

DIS:               ; SEGMENT DISPLAY
  MOV    A,R2          
                MOV    DPTR,#SEGL
                MOVX   @DPTR,A

                MOV    A,R1
                MOV    DPTR,#SEGM
                MOVX   @DPTR,A

                MOV    A,R0
                MOV    DPTR,#SEGR
                MOVX   @DPTR,A
                RET

DELAY:  MOV R7, #0FFH
DELAY1:  MOV R6, #0FFH
DELAY2:  DJNZ R6, DELAY2
  DJNZ R7, DELAY1
  RET

             ORG      9F0BH
             JMP      SERVICE

END

+ Recent posts