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

📄 timer.asm

📁 nec demo source code
💻 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 + -