📄 timer.asm
字号:
;============================================================================
; PROJECT = 78K0S/KA1+ Low Pin Count - DemoKit-KA1
; MODULE = Timer.asm
; DEVICE = uPD78F9222
; DATE = 29.07.2005
; ====================================================================================
; Description: This sample program simulates a darkroom timer. The board starts
; after reset flashing all LED's. After first key press of SW1, the
; board starts counting up expose times in unit of minutes (binary
; output format). By pressing SW1 a second time the shown elapse time
; is selected and counting is started. After the selected time is
; finished the elapse time is displayed by flashing the LED's twenty
; times and the stop mode is entered. By pressing SW1 stop mode can
; be released.
;
; ====================================================================================
;--------------------------------
;- MACRO DEFINITION -
;--------------------------------
PUSH_STACK MACRO
PUSH AX
PUSH HL
PUSH BC
PUSH DE
ENDM
POP_STACK MACRO
POP DE
POP BC
POP HL
POP AX
ENDM
;--------------------------------
;- I/O DEFINE -
;--------------------------------
LED1 EQU P2.3
LED2 EQU P13.0
LED3 EQU P4.5
LED4 EQU P12.3
SW1 EQU P3.0
;--------------------------------
;- SYMBOL DECLARATION -
;--------------------------------
ram_start EQU 0FE7FH
ram_end EQU 0FEFFH
stack EQU 0FEFFH
;--------------------------------
;- RAM DECLARATION -
;--------------------------------
DATA DSEG at 0FE80H
Timer80Flag: DS 1
IntP0Flag: DS 1
TimerH1Flag: DS 1
value: DS 1
number: DS 1
LED_pattern: DS 1
Flash_number: DS 1
elapse_time: DS 1
hour: DS 1
minute: DS 1
second: DS 1
ucState: DS 1
interval: DS 1
match_Flag: DS 1
i: DS 1
;--------------------------------
;- VECTOR TABLE -
;--------------------------------
INT0 CSEG at 0000H
DW Start
INT1 CSEG at 001AH
INTTM80: DW Inttm80
INT2 CSEG at 0008H
INTP0: DW Intp0
INT3 CSEG at 000CH
INTTMH1: DW Inttmh1
;--------------------------------
OPT DSEG at 80H
OPTION: DB 10011010b
PROG CSEG at 82H
Start:
DI
Initial:
MOV PCC, #0
MOV PPCC, #0
MOV IF0, #00
MOV IF1, #00
MOV MK0, #0FFH
MOV MK1, #0FFH
MOV LSRCM,#01H
MOV OSTS, #0
MOV WDTM, #70H
CLR1 TCE80
MOV TMC80,#06H
; MOV CR80, #06H
CLR1 TMIF80
CLR1 TMMK80
MOV INTM0,#00
CLR1 PMK0
CLR1 PMC2.3
CLR1 PM2.3
CLR1 PM4.5
CLR1 PM12.3
CLR1 LED1
CLR1 LED2
CLR1 LED3
CLR1 LED4
SET1 LED1
SET1 LED2
SET1 LED3
SET1 LED4
MOVW AX, #stack
MOVW SP, AX
MOVW HL, #ram_start
Ram_clear:
MOV A,#0
MOV [HL],A
INCW HL
MOVW AX,HL
CMPW AX,#ram_end
BC $Ram_clear
EI
Main_loop:
MOV A, ucState
CMP A, #00H
BZ $Main_loop0
CMP A, #01H
BZ $Main_loop1
CMP A, #02H
BZ $Main_loop2
CMP A, #03H
BZ $Main_loop3
MOV ucState, #00H
BR Main_exit
Main_loop0:
CALL !Starting
BR Main_exit
Main_loop1:
CALL !Input
BR Main_exit
Main_loop2:
CALL !TIMER
BR Main_exit
Main_loop3:
CALL !TimerEnd
Main_exit:
BR Main_loop
;================================
;- SUB-program -
;================================
Wait:
CALL !Restart_TMH1
Wait_Loop1:
MOV A, number
CMP A, #00H
BZ $Wait_exit
Wait_Loop0:
MOV A, TimerH1Flag
CMP A, #00H
BZ $Wait_Loop0
MOV TimerH1Flag, #00H
DEC number
MOV A, number
CMP A, #00H
BNZ $Wait_Loop1
Wait_exit:
RET
;--------------------------------
Restart_TM80:
CLR1 TCE80
SET1 TCE80
RET
;---------------------------------------
Restart_TMH1:
MOV TimerH1Flag, #00H
CLR1 TMHE1
SET1 TMHE1
RET
;---------------------------------
Drive_LED:
MOV A, value
ROR A,1
ROR A,1
ROR A,1
RORC A,1
BNC $LED1_off
CLR1 LED1
BR Next1
LED1_off:
SET1 LED1
Next1:
MOV A, value
ROR A,1
ROR A,1
RORC A,1
BNC $LED2_off
CLR1 LED2
BR Next2
LED2_off:
SET1 LED2
Next2:
MOV A, value
ROR A,1
RORC A,1
BNC $LED3_off
CLR1 LED3
BR Next3
LED3_off:
SET1 LED3
Next3:
MOV A, value
RORC A,1
BNC $LED4_off
CLR1 LED4
BR Next4
LED4_off:
SET1 LED4
Next4:
RET
;-----------------------------------
Flash_LED:
MOV A, Flash_number
CMP A, #00H
BZ $Flash_exit
CALL !Drive_LED
MOV number, #05H
CALL !Wait
MOV value, #00H
CALL !Drive_LED
MOV number, #05H
CALL !Wait
DEC Flash_number
MOV A, Flash_number
CMP A, #00H
BNZ $Flash_LED
Flash_exit:
RET
;---------------------------------
Inttm80:
PUSH_STACK
MOV Timer80Flag, #01H
INC second
MOV A, second
CMP A, #03CH
BNZ $Set_matchFlag
MOV second, #00H
INC minute
MOV A, minute
CMP A, #03CH
BNZ $Set_matchFlag
MOV minute, #00H
INC hour
MOV A, hour
CMP A, #018H
BNZ $Set_matchFlag
MOV hour, #00H
Set_matchFlag:
MOV A, minute
MOV X, A
MOV A, elapse_time
CMP A, X
BNZ $Inttm80_exit
MOV match_Flag, #01H
Inttm80_exit:
POP_STACK
RETI
;-----------------------------------------
Inttmh1:
PUSH_STACK
MOV TimerH1Flag, #01H
POP_STACK
RETI
;----------------------------------------
Intp0:
PUSH_STACK
MOV IntP0Flag, #01H
POP_STACK
RETI
;-----------------------------------------
Starting:
MOV Flash_number, #01H
MOV value, #00FH
CALL !Flash_LED
MOV A, IntP0Flag
CMP A, #01H
BNZ $Starting_exit
MOV ucState, #01H
MOV IntP0Flag, #00H
Starting_exit:
RET
;----------------------------------------------
Input:
MOV number, #0AH
CALL !Wait
MOV A, IntP0Flag
CMP A, #01H
BNZ $Input_loop0
MOV ucState, #02H
MOV IntP0Flag, #00H
MOV A, elapse_time
MOV value, A
MOV Flash_number, #03H
CALL !Flash_LED
CALL !Restart_TM80
MOV LED_pattern, #01H
BR Input_exit
Input_loop0:
INC elapse_time
MOV A, elapse_time
CMP A, #0F0H
BNZ $Input_loop1
MOV elapse_time, #00H
Input_loop1:
MOV A, elapse_time
MOV value, A
CALL !Drive_LED
Input_exit:
RET
;--------------------------------------------
TIMER:
MOV A, match_Flag
CMP A, #01H
BNZ $TIMER_loop0
MOV ucState, #03H
CLR1 TCE80
BR Main_exit
TIMER_loop0:
MOV A, Timer80Flag
CMP A, #01H
BNZ $TIMER_exit
MOV Timer80Flag, #00H
MOV A, LED_pattern
MOV value, A
CALL !Drive_LED
MOV A, LED_pattern
ROL A, 1
ADD A, #01H
MOV LED_pattern, A
CMP A, #01FH
BNZ $TIMER_exit
MOV LED_pattern, #00H
TIMER_exit:
RET
;---------------------------------------------
TimerEnd:
MOV i, #00H
Show8_loop2:
MOV value, #03H
CALL !Drive_LED
MOV number, #01H
CALL !Wait
MOV value, #00H
CALL !Drive_LED
MOV number, #01H
CALL !Wait
INC i
MOV A, i
CMP A, #014H
BNZ $Show8_loop2
RET
;--------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -