?? main.asm
字號:
;===============================================================================
;IC Body: W588C020
;項目名:Fiber optic lamp
;功能:
; 2pcs Led for Eye (BP00,BP01)
; 4pcs Led for Mouth (BP02~BP05)
; Key: 1pc (BP10)
; Speaker:
; DAC mode
;播放兩個聲音,播放聲音時,嘴形和眼睛要和聲音同步。
;-------------------------------------------------------------------------------
;BP00控制睜眼,BP01控制瞇眼。
;BP02控制閉嘴,BP03控制大嘴下,BP04控制小嘴下,BP05控制小嘴上。
;===============================================================================
CHIP W588
INCLUDE PGM_HEAD_588.INI
EXTERN FXF_ISR_DELAY_COUNT_DEFAULT
EXTERN STOP_TM_FXF_PROC
EXTERN INIT_TM_FXF_PROC
EXTERN VC_TMV_TABLE
EXTERN VC_TMC_TABLE
.ifdef FW_PWM_TIMER_TM0
EXTERN FW_PWM_TIMER_DOWNCOUNT
PUBLIC FW_TIMER_DWONCOUNT_RET
.endif
.ifdef FW_PWM_TIMER_TM1
EXTERN FW_PWM_TIMER_DOWNCOUNT
PUBLIC FW_TIMER_DWONCOUNT_RET
.endif
.ifdef FW_PWM_TIMER_TMG0
EXTERN FW_PWM_TIMER_DOWNCOUNT
PUBLIC FW_TIMER_DWONCOUNT_RET
.endif
.ifdef FW_PWM_TIMER_TMG1
EXTERN FW_PWM_TIMER_DOWNCOUNT
PUBLIC FW_TIMER_DWONCOUNT_RET
.endif
PUBLIC QUIT_LIB_ISR
;==========================================================================
; Initial For Main.asm Macro
;--------------------------------------------------------------------------
;==========================================================================
; DECLARE VARIABLES INSIDE THIS SECTION
; EXAMPLE => VAR1 DS 3
; VAR2 DS 1
;==========================================================================
USER_RAM: SECTION
gTime10ms DS 1 ; 時間標志
FTime10ms DS 1
gTime100ms DS 1
FTime100ms DS 1
gTime500ms DS 1
FTime500ms DS 1
gSTOP_Counter DS 1 ;STOP工作定時
FKEY_CHECK DS 1 ;鍵按下標志
gKEY_Times DS 1 ;記錄鍵按下的次數
g1KEY_Filter DS 1
FKEY_Manage DS 1
gLED_FLASH500ms DS 1
;FTime1test DS 1 ;測試1秒用
ENDS
;=======================================================================
; WRITE PROGRAM CODES & TABLES INSIDE THIS SECTION
;==========================================================================
CODE: SECTION
;==================================================
FXF15_ISR:
LDA #02H
STA !EFC1 ;CLEAR EVF OF FXF15
;User can insert program from here
PLA
RTI
;=================================================================
;PORT ISR
;==================================================================
PORT_ISR:
PHA
LDA #01H
STA !EFC0
;User can insert program from here
PLA
RTI
;***************************************************************
; INTERRUPT SERVICE ROUTINES
; EVF0 = [XX SI_INT FXF_INT TMG_INT TM1_INT TM0_INT POR_INT]
;***************************************************************
IRQ_ISR:
PHA
LDA !IEF0
AND !EVF0
BIT #10H
BNE FXF_ISR ;1S2T
LDA !IEF1
AND !EVF1
BIT #02H
BEQ PLA_RTI
JMP FXF15_ISR
PLA_RTI:
PLA
RTI
;===============================================================
; SR_NAME: FXF13_ISR ;FXF13_ISR FOR MELODY
; INPUT : MS_DATA_ADDR ;OUTPUT : SP0AT, SP0BT
;===============================================================
FXF_ISR:
LDA #10H
STA !EFC0 ;CLEAR EVF OF FXF13
.IF(WITH_MS .EQ. 1).OR.(WITH_EVO .EQ. 1)
PHX
PHY
STORE_SW_CS
LDA !BANK
PHA
LDA !IEF1 ;DISABLE FXF15
PHA
STZ !IEF1
LDA !IEF0
PHA
AND #01001110B ;KEEP TMG/0/1 INTERRUPT ONLY
STA !IEF0
CLI ;ENABLE INTERRUPT
FXF13_ISR_PROC
;-------------------------------------------------------------------------
PUBLIC QUIT_LIB_FXF_ISR
QUIT_LIB_FXF_ISR:
SEI
PLA
AND #10110001B ;RESTORE IEF0 INTERRUPT
ORA !IEF0
STA !IEF0
QUIT_LIB_FXF_ISR_CONT
QUIT_LIB_FXF_ISR_END:
PLA ;RESTORE FXF15
STA !IEF1
PLA
STA !BANK
RELOAD_SW_CS
PLY
PLX
.ENDIF
PLA
RTI
;===============================================================
; SR_NAME: TIMERG1_ISR ;
;===============================================================
TMG1_ISR:
PHA
;User can insert program from here
LDA #01H
STA !WDTC
INC gTime10ms
LDA gTime10ms
CMP #0AH
BNE QUIT_TimerG_ISR
LDA #01H
STA FTime10ms
STZ gTime10ms
INC gTime100ms
LDA gTime100ms
CMP #0AH
BNE QUIT_TimerG_ISR
LDA #01H
STA FTime100ms
INC gLED_FLASH500ms
STZ gTime100ms
INC gTime500ms
LDA gTime500ms
CMP #10H
BNE QUIT_TimerG_ISR
LDA #01H
STA FTime500ms
STZ gTime500ms
QUIT_TimerG_ISR:
;.ifdef FW_PWM_TIMER_TMG1
; JMP FW_PWM_TIMER_DOWNCOUNT
;FW_TIMER_DWONCOUNT_RET:
;.endif
LDA #40H
STA !EFC0 ;CLEAR EVF OF TIMERG1
PLA
RTI
;===============================================================
; SR_NAME: TIMERG0_ISR ;
; INPUT : ISR0_NEXT_SYNTH_START ;OUTPUT : SP0CLT, SP0CT
;===============================================================
.IF (CHIPSERIES = 'W588D')
TMG0_ISR:
LIB_VS0_ISR:
LIB_VS0A_ISR:
PHA
LDA #08H
STA !EFC0 ;CLEAR EVF OF TIMERG
.ifdef FW_PWM_TIMER_TMG0
JMP FW_PWM_TIMER_DOWNCOUNT
FW_TIMER_DWONCOUNT_RET:
.endif
.IF (WITH_VS0A .EQ. 1H)
PHX
PHY
STORE_SW_CS
LDA !BANK
PHA
.IF (WITH_VOL_REDUCE .EQ. 1)
LDA #CHANNEL_VS0A
PHA
.ENDIF
JMP_CH1_ISR_ACTION
.ENDIF
PLA
RTI
.ENDIF
;===============================================================
; SR_NAME: TIMER0_ISR ;
; INPUT : ISR1_NEXT_SYNTH_START ;OUTPUT : SP0ALT, SP0AT
;===============================================================
TM0_ISR:
LIB_VS1_ISR:
LIB_VS1A_ISR:
PHA
LDA #02H
STA !EFC0 ;CLEAR EVF OF TIMERG
.ifdef FW_PWM_TIMER_TM0
JMP FW_PWM_TIMER_DOWNCOUNT
FW_TIMER_DWONCOUNT_RET:
.endif
.IF (WITH_VS1A .EQ. 1H)
PHX
PHY
STORE_SW_CS
LDA !BANK
PHA
.IF (WITH_VOL_REDUCE .EQ. 1)
LDA #CHANNEL_VS1A
PHA
.ENDIF
JMP_CH2_ISR_ACTION
.ENDIF
PLA
RTI
;===============================================================
; SR_NAME: TIMER2_ISR ;
; INPUT : ISR2_NEXT_SYNTH_START ;OUTPUT : SP0BLT, SP0BT
;===============================================================
TM1_ISR:
LIB_VS2_ISR:
LIB_VS2A_ISR:
PHA
LDA #04H
STA !EFC0 ;CLEAR EVF OF TIMER1
.ifdef FW_PWM_TIMER_TM1
JMP FW_PWM_TIMER_DOWNCOUNT
FW_TIMER_DWONCOUNT_RET:
.endif
.IF (WITH_VS2A .EQ. 1H)
PHX
PHY
STORE_SW_CS
LDA !BANK
PHA
.IF (WITH_VOL_REDUCE .EQ. 1)
LDA #CHANNEL_VS2A
PHA
.ENDIF
JMP_CH3_ISR_ACTION
.ENDIF
PLA
RTI
;===============================================================
; Quit Libary ISR Lable
;===============================================================
QUIT_LIB_ISR:
SP_VOLUME_REDUCE
PLA
STA !BANK
RELOAD_SW_CS
PLY
PLX
PLA
RTI
;===============================================
; Main program start here after resetting
;===============================================
MAIN_START:
SYSTEM_INIT_PROCEDURE_W588 ;SYSTEM INITIALIZATION PROCEDURE
SET_STACK_POINTER_TO STACK_END ;USER CAN CHANGE THE VALUE
CLEAR_RAM_FROM_00H_TO RAM_END ;USER CAN CHANGE THE VALUE
CLI
SPECIAL_REGISTERS_INIT
LDA #00H
STA BP0D ;設置BP0[5:0]為輸出口,用于控制6個LED燈
LDA #1FH
STA BP1D ;設置BP1[0]為輸入口,用于按鍵觸發。
LDA #0FH
STA BP1EN_F
LDA #0FH
STA BP1EN_R ;設置BP1[0]口有電壓跳變,將喚醒STOP模式
LDA IEF0
ORA #40H
STA IEF0
LDA #3CH
STA TMG1V ;設置1MS的TimerG1中斷
LDA #05H
STA TMG1C ;TimerG1的時鐘為Fsys/64,并激活TimerG1
;==============================================================
LDA #1H ;初始化鍵值;目的使按鍵只有兩種狀態(2、3)
STA gKEY_Times ;初始化為0,可以有三種狀態(1、2、3)。
;==============================================================
MAIN_END:
S_Time10ms:
LDA FTime10ms
BIT #01H
BEQ S_Time100ms
STZ FTime10ms
LDA #01H
STA !WDTC
JSR MKEY_CHECK
S_Time100ms:
LDA FTime100ms
BIT #01H
BEQ S_Time500ms
STZ FTime100ms
JSR MKEY_Manage
S_Time500ms:
LDA FTime500ms
BIT #01H
BEQ SMAIN_END
STZ FTime500ms
INC gSTOP_Counter
LDA gSTOP_Counter
CMP #1EH
BCC SMAIN_END
STZ gSTOP_Counter
LDA #01H
STA STOP ;沒有操作15s左右及進入STOP狀態
STA EFC0
SMAIN_END:
JMP MAIN_END
;==========================================================================
;按鍵檢測子程序,
;有鍵按下,FKEY_CHECK = 1,gKEY_Times加1,記錄鍵按下的次數。
;==========================================================================
MKEY_CHECK:
LDA BP1
BIT #01H
BNE SKEY_END
LDA FKEY_CHECK
BNE SKEY_END
STZ gSTOP_Counter
INC g1KEY_Filter
LDA g1KEY_Filter
CMP #03H
BCC SKEY_END
STZ g1KEY_Filter
LDA #01H
STA FKEY_CHECK ;有鍵按下即為1。
INC gKEY_Times ;計數來分別是第幾次按下鍵
BRA SKEY_END
SKEY_OFF:
; STZ FKEY_CHECK
STZ g1KEY_Filter
SKEY_END:
RTS
;==========================================================================
;按鍵處理子程序
;==========================================================================
MKEY_Manage:
LDA FKEY_CHECK
BEQ SKEY_Manage_END
LDA FKEY_Manage
BNE SKEY_Manage_END
LDA #01
STA FKEY_Manage
;------------------------------------
SKEY_3SEC:
LDA gKEY_Times
AND #03H
CMP #03H
BCC SKEY_2SEC
LDA #1H
STA gKEY_Times
PLAY Phrase2
JSR MCheck_sp2
BRA SKEY_Manage_END
SKEY_2SEC:
CMP #02H
BCC SKEY_1SEC
PLAY Phrase1
JSR MCheck_sp1
BRA SKEY_Manage_END
;*****************************************
SKEY_1SEC:
CMP #01H
BCC SKEY_Manage_END ;當前沒用。
JSR MMouth_Close
;*****************************************
SKEY_Manage_END:
;-----------------------------------------
LDA BP1
BIT #01H
BEQ SKEY_MANA_RTS
LDA FKEY_Manage ;保證一次按下鍵,僅有效一次。
BEQ SKEY_MANA_RTS
STZ FKEY_Manage
STZ FKEY_CHECK
;-----------------------------------------
SKEY_MANA_RTS:
RTS
;============================================================================
;檢測聲音Phrase2是否播放完。
;============================================================================
MCheck_sp2:
STZ gLED_FLASH500ms
SPH2_BUSY_LOOP:
STZ gSTOP_Counter
LDA gLED_FLASH500ms
CMP #35
BCS SPH2_CLOSE
JSR MMouth_Big
BRA SPH2_END
SPH2_CLOSE:
LDA gLED_FLASH500ms
CMP #42
BCS SPH2_SMALL
JSR MMouth_Close
BRA SPH2_END
SPH2_SMALL:
LDA gLED_FLASH500ms
CMP #50
BCS SPH2_First
JSR MMouth_ROUND
BRA SPH2_END
SPH2_First:
LDA gLED_FLASH500ms
CMP #50
BCC SPH2_END
STZ gLED_FLASH500ms
;------------------------------
SPH2_END:
LDA #SP_BZ
AND <CH1_STATUS
BNE SPH2_BUSY_LOOP
JSR MLED_TURN_OFF
RTS
;==============================================================
;檢測聲音是否播放完。
;==============================================================
MCheck_sp:
SP_BUSY_LOOP:
; LDA #1
; STA !WDTC
LDA #SP_BZ
AND <CH1_STATUS
BNE SP_BUSY_LOOP
RTS
;==============================================================
;檢測聲音Phrase1是否播放完。
;==============================================================
MCheck_sp1:
STZ gLED_FLASH500ms
SPH1_BUSY_LOOP:
STZ gSTOP_Counter
LDA gLED_FLASH500ms
CMP #00
BNE SPH1_SMALL
SPH1_ROUND:
;------------------------------
JSR MMouth_ROUND ;圓口
;------------------------------
SPH1_SMALL:
LDA gLED_FLASH500ms
CMP #01
BNE SPH1_BIG
;------------------------------
JSR MMouth_SMALL ;小口
;------------------------------
SPH1_BIG:
LDA gLED_FLASH500ms
CMP #02
BNE SPH1_SM2
;------------------------------
JSR MMouth_Big ;大口
;------------------------------
SPH1_SM2:
LDA gLED_FLASH500ms
CMP #03
BNE SPH1_R2
;------------------------------
JSR MMouth_SMALL ;小口
;------------------------------
SPH1_R2:
LDA gLED_FLASH500ms
CMP #04
BNE SPH1_CLOSE
;------------------------------
JSR MMouth_ROUND ;圓口
;------------------------------
SPH1_CLOSE:
LDA gLED_FLASH500ms
CMP #05
BNE SPH1_First
;------------------------------
JSR MMouth_Close ;閉口
;------------------------------
SPH1_First:
LDA gLED_FLASH500ms
CMP #06
BCC SPH1_END
STZ gLED_FLASH500ms
SPH1_END:
LDA #SP_BZ
AND <CH1_STATUS
BNE SPH1_BUSY_LOOP
; JSR MMouth_Close
JSR MLED_TURN_OFF
RTS
;============================================================================
;嘴巴狀態控制,BP02控制閉嘴(C),BP03控制大嘴下(D),BP04控制小嘴下(E),
; BP05控制小嘴上(F)
;嘴巴狀態分為:閉嘴(C)、大嘴巴(C+D)、細嘴巴(C+E)、小嘴巴(E+F)
;BP00控制睜眼(A). BP01控制瞇眼(B).
;==============================================================================
;閉嘴+睜眼 (A+C)1111,1010
;=================================
MMouth_Close:
LDA #FAH
STA BP0
RTS
;=================================
;大嘴巴+瞇眼 (B+C+D)1111,0001
;=================================
MMouth_Big:
LDA #F1H
STA BP0
RTS
;=================================
;小嘴巴+睜眼(A+C+E)1110,1010
;=================================
MMouth_SMALL:
LDA #EAH
STA BP0
RTS
;=================================
;圓嘴巴+睜眼(A+E+F)1100,1110
;=================================
MMouth_ROUND:
LDA #CEH
STA BP0
RTS
;=================================
;圓嘴巴+睜眼(A+E+F)1100,1110
;=================================
MLED_TURN_OFF:
LDA #FFH
STA BP0
RTS
ENDS
;==========================================================================
; ASSIGN INTERRUPT VECTORS INSIDE THIS SECTION
;==========================================================================
VECTOR: SECTION
ORG 1000H
DW 0040H ;DO NOT REMOVE
DW 0000H ;DO NOT REMOVE
ORG 100EH
DW 0990H ;IV OF BRK
ORG 1010H
DW TM0_ISR ;TIMER 0 ISR ;DO NOT REMOVE
DW TM1_ISR ;TIMER 1 ISR ;DO NOT REMOVE
.IF (CHIPSERIES = 'W588D')
DW TMG0_ISR ;TIEMRG 0 ISR ;DO NOT REMOVE
.ELSE
DW 0000
.ENDIF
DW TMG1_ISR ;TIMERG 1 ISR
DW PORT_ISR ;DO NOT REMOVE
ORG 101AH
DW 0000H
DW MAIN_START ;IV OF RESET
DW IRQ_ISR ;IV OF IRQ
ORG 102EH
DW 0584H ;DO NOT REMOVE
ENDS
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -