;* 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
'Technology > Embedded' 카테고리의 다른 글
8051 source code / External interrupt (0) | 2009.12.05 |
---|---|
8051 source code / Interupt를 이용한 LED 실험 (0) | 2009.12.05 |
8051 source code / Timer counter mode2를 이용한 실험 (0) | 2009.12.05 |
8051 source code / Timer counter mode를 이용한 LDE 제어 (0) | 2009.12.05 |
8051 source code / DOT MATRIX 글자 좌우 이동하기 "ㄱ(기억자)" (0) | 2009.12.05 |