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

📄 main.asm

📁 华邦单片机的红外发送源码,已经投入生产。其中的功能主要是把信息通过红外发送到上位机。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 
 
KeyTemp0	DS	1
KeyTemp1	DS	1
KeyBP0	DS	1
KeyBP1	DS	1
CodeTmp	DS	1
CodeVerify	DS	1
IRCode	DS	1       
Count38k	DS	1
SleepTime	DS	2				;0.25s interrupt 
KeyFlag		DS	1
Run_FRIST	DS	1
KeyPressedTime	DS	1			;key pressed alway count
	ENDS

;=======================================================================
;	WRITE PROGRAM CODES & TABLES INSIDE THIS SECTION
;==========================================================================
	CODE: SECTION

FCLK		EQU 		4000000 




SWING	EQU			01H
CODE00	EQU			02H
CODE11	EQU			04H
YELLOW	EQU			08H
BLUE	EQU			10H
GREEN	EQU			20H

UP		EQU			01H
LEFT	EQU			02H
DOWN	EQU			04H
RIGHT	EQU			08H

BIT0	EQU			01H
BIT1	EQU			02H
BIT2	EQU			04H
BIT3	EQU			08H
BIT4	EQU			10H
BIT5	EQU			20H
BIT6	EQU			40H
BIT7	EQU			80H
;==================================================
FXF15_ISR:
	PHA
	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
;	JSR F_GetKeyCode						;User can insert program from here
;	LDX #50
;	JSR IRDelay
;	JSR F_SendIRCode
	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
	LDA #40H
	STA !EFC0						;CLEAR EVF OF TIMERG1
									;User can insert program from here

.ifdef	FW_PWM_TIMER_TMG1
	JMP FW_PWM_TIMER_DOWNCOUNT
FW_TIMER_DWONCOUNT_RET:
.endif

	PLA
	RTI
;===============================================================
;  SR_NAME: TIMERG0_ISR			;
;  INPUT  : ISR0_NEXT_SYNTH_START	;OUTPUT : SP0CLT, SP0CT
;===============================================================
TMG0_ISR:
;LIB_VS0_ISR:
;LIB_VS0A_ISR:
	PHA
	LDA #08H
	STA !EFC0				;CLEAR EVF OF TIMERG

	CLC
	LDA SleepTime				;0.25s interrupt
	ADC #1
	STA SleepTime
	LDA SleepTime+1
	ADC #0
	STA SleepTime+1	

	
	LDA #01H	
	STA !WDTC	
	


.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	
;===============================================================
;  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
;	INC Count38k

.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
	
	INC Count38k

.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

  ;---------------------------SPEECH EQUATION ----------------------------------
  ;       PLAY MANSPEAK_MDM<CH=1/2/3,VOL=8,SR=8000>
            ;MANSPEAK_MDM is speech file name with MDPCM format
   			;CH is speech channel assignment
   			;CH: 1->TIMER0 2:TIMER1 3:TIMERG0 (no tone)
			;CH: 1->TIMERG0 2:TIMER0 3:TIMER1 (has tone)
   			;VOL=4 is volume level(0~8)
   			;SR=8000 is sampling rate,
	        ;if user assign '0' then use the default S.R. in speech file
  ;---------------------------MELODY EQUATION----------------------------------
  ;       PLAY MARCH<TK=MS,VOL=8,TPO=120>
       		;March is melody file name with MIDI format 0
		 	;MS is melody channel assignment
	        ;VOL=5 is volume level(0~8)
			;TPO=120 is tempo value
			;if user assign '0' then use the default tempo in MIDI file

;*****************************************************
;--------------------Remarked-------------------------
;*****************************************************

;Created 2008/11/21 by junson
;1.	MCU:	W588L035 
;	CPUCLK:	4MHZ 
;	LVREN:	Enable (2.0V+-0.2V)
;	WDTEN:	Enable
;2.Encode:  0-----1T:4T
;			1-----4T:1T
;			1T=605us=23/38khz
;3.IRCode Send Sequence:
;  1th   2th    3th    4th    5th     6th    7th    8th    9th  10th  11th
;   |	 |		|	   |	  |       |      |		| 		| 	  | 	|
; GREEN  BLUE  YELLOW  CODE1  CODE0  SWING  RIGHT   DOWN   LEFT   UP   END	
;
;
;
;Updated 2008/11/22 by junson
;1. Change IR Encode	
;		    0-----1T:2T	
;			1-----1T:1T
;			1T=605us=23/38khz
;2.	add StartBit,VeritfyBit.
;
;
;Updated 2008/11/27 by junson
;1. add sleep function if without key change 2 minute
;
;
;Updated 2008/11/28 by junson
;1. add Idle function if no key is pressed
;	this function is not requirement in Customer SPCE 
;	but add this function can achieve a longer battery life.

;2. if any button key alawy been pressed,send IRCode every 150 msec,
;	and if this key have been pressed more than 2 minute,go to sleep mode,
;	after sleep,unit would be wake up by pressed any other key changed
;
;3. changed  IO resister pull High to 830K ohm 
;
;
;4. this program can run between W588D and W588L with 4Mhz.
;	W588D(ROSC=620kohm)	,W588L(ROSC=560kohm)

;Updated 2008/12/15 by junson
;1. add 3 Bytes Verify  function
;2. rechanged resister of IO port pull High to 220K ohm 
;3. CODE0,CODE1被一直按住,不会一直发,只会在按下或者弹起时才发红外。 
;3.IRCode Send Sequence:
;  1th   2th    3th    4th    5th     6th    7th    8th    9th  10th  11th		12th		13th		14th
;   |	 |		|	   |	  |       |      |		| 		| 	  | 	|				|			|				|				|				|
; GREEN  BLUE  YELLOW  CODE1  CODE0  SWING  RIGHT   DOWN   LEFT   UP  Verify1 Verify2 Verify3	 END	

;Updated 2008/12/18 by junson
;1. 增加swing键一直被按下不停发射的功能。
;2. 增加每一帧数据之间的空闲时间:从10ms增加到20ms.  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -