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

📄 main.asm

📁 Holtek audio decoder , Dongle 参考范例
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;*******************************************************************************
;*
;*  (c) Copyright 2005, Holtek Semiconductor Inc.
;* 
;******************************************************************************/
;*******************************************************************************
;MODULE:	main.asm

;INITIAL:	11/14/2006

;AUTHOR:	C351  hongyuan lai

;NOTE:	 	HT82A851R Main Function

;VERSION:	0.01
;Function:
;key debounced	N
;oled		N
;volume adjust	Y
;2005/05/13     Update Key Debounce
;2005/05/25	Modify Pop noise
;2005/06/06     Modify Send_Hand_Shake
;2005/06/10	if setup scmd, clear scmd and len0 when read 8 bytes
;*******************************************************************************

;***************************************************************
;Include File
;const.inc		user defined
;macro.asm		macro function
;***************************************************************
#include		ht82a851r.inc
#include		const.inc
#include		nRF24L01.inc
#include		macro.asm
#define			WaitBias	0

;***************************************************************
;           nRF transmit and receive FIFO  
;           each 64 bytes, 2 ms
;***************************************************************

RAMBank 1      DATA2
DATA2           .section                AT      40H             'DATA'
TX_FIFO_STACK		DB	64 DUP(?)
RX_FIFO_STACK		DB	64 DUP(?)
;====================================================================
;Variable Defined , read/write DATA start from 40H
;====================================================================
RAMBank 0      DATA
DATA		.SECTION		AT	40H		'DATA'
;***************************************************************
;		USB ISR Var (backup for interrupt)
;***************************************************************
isr_usb_acc		DB		?
isr_usb_status		DB		?
isr_usb_mp1		DB		?
isr_usb_mp0		DB		?
isr_usb_tblp		DB		?
isr_usb_bp		DB		?
;***************************************************************
;		Timer0 ISR Var (backup for interrupt)
;***************************************************************
isr_tmr0_acc		DB		?
isr_tmr0_status		DB		?
isr_tmr0_mp1		DB		?
isr_tmr0_mp0		DB		?
isr_tmr0_tblp		DB		?
isr_tmr0_bp		DB		?
;***************************************************************
;		Timer1 ISR Var (backup for interrupt)
;***************************************************************
isr_tmr1_acc		DB		?
isr_tmr1_status		DB		?
isr_tmr1_mp1		DB		?
isr_tmr1_mp0		DB		?
isr_tmr1_tblp		DB		?
isr_tmr1_bp		DB		?
;***************************************************************
;		Play ISR Var (backup for interrupt)
;***************************************************************
isr_play_acc		DB		?
isr_play_status		DB		?
isr_play_mp1		DB		?
isr_play_mp0		DB		?
isr_play_tblp		DB		?
isr_play_bp		DB		?
;***************************************************************
;		Rec ISR Var (backup for interrupt)
;***************************************************************
isr_rec_acc		DB		?
isr_rec_status		DB		?
isr_rec_mp1		DB		?
isr_rec_mp0		DB		?
isr_rec_tblp		DB		?
isr_rec_bp		DB		?
;***************************************************************
;		Delay variable
;***************************************************************
Delay_1			DB		?
Delay_2			DB		?
Delay_3			DB		?

;***************************************************************
;USB FIFO Variable
;USB_Interface : to save usb current interface number
;USB_Interface_Alt : to save usb current alternate of interface number
;USB_Configuration : to save USB configuration number
;FIFO_ADDR     : to save USB ADDRESS
;Loop_Counter , Data_Count , Data_Start : control_read variable
;***************************************************************
;For FIFO Access
;modify 2006-09-22
FIFO_SIZE                       db              ?
;------------------------------------------------
FIFO_SendLen			db		?
FIFO_out1			label	byte
FIFO_Type			db		?
FIFO_out2			label	byte
FIFO_Request			db		?
FIFO_out3			label	byte
FIFO_wValueL			db		?
FIFO_out4			label	byte
FIFO_wValueH			db		?
FIFO_out5			label	byte
FIFO_wIndexL			db		?
FIFO_out6			label	byte
FIFO_wIndexH			db		?
FIFO_out7			label	byte
FIFO_wLengthL			db		?
FIFO_out8			label	byte
FIFO_wLengthH			db		?

USB_Interface			db		?
USB_Interface_Alt		db		?
USB_Configuration		db		?

FIFO_ADDR			db		?


Loop_Counter			db		?
Data_Count			db		?
Data_Start			db		?

;voice control
INC_Counter			db		?
DEC_Counter			db		?


;FIFO
FIFO_TEMP			db		?
bFlag_SetConfiguration_Ready	dbit		
bFlag_SetInterface_Ready	dbit		
bFlag_Real_Cmd			dbit		
bFlag_FIFO_Ready		dbit
bFlag_FIFO_LEN0			dbit
bFlag_RD_HTable			dbit
bFlag_wait_control_out		dbit
bFlag_SET_ADDRESS		dbit
bFlag_SCMD			dbit
bFlag_Enum_Ready		dbit
;Audio
PortC_data			db	?
bFlag_Audio_Mute		dbit
bFlag_Mic_Mute			dbit
Volume1				db	?
Volume2				db	?
bFlag_Mute_Detect		dbit		
bFlag_INC_Detect		dbit		
bFlag_DEC_Detect		dbit	
Flag_Audio_Control		db	?	; 0 0 muteH muteL incH incL decH decL

VolumeH_Save			db	?
VolumeL_Save			db	?

nCmdIndex1			db	?
nCmdIndex2			db	?
nCmdIndex3			db	?


Key_Process			db	?
Key_CheckIn			db	?
Key_Counter			db	?
Key_Temp			db	?
Key_IncCounter			db	?
Key_DecCounter			db	?
MODE_CTRL_TEMP  		db    	?	
TMR1_KEY_FG			dbit

;---------------
ADC_POR_FG			dbit
;---------------


;====== nRF24L01 ========================
;--use for address initial/setup/save/change
TX_FIFO_ADDR			DB	?
TX_FIFO_ADDR1			DB	?
RX_FIFO_ADDR			DB	?
RX_FIFO_ADDR1			DB	?
FIFO_COUNTER			DB	?
DAC_FIFO_COUNTER		DB	?
ADC_FIFO_COUNTER		DB	?

RX_FIFO_ADDR_temp		DB	?
TX_FIFO_ADDR_temp		DB	?
RX_FIFO_Status			DB	?
RX_key_code			DB	?

channel_1			DB	?
channel_2			DB	?

bFlag_TX_FIFO			DBIT
bFlag_TX_FIFO_Select		DBIT
bFlag_TX_FIFO_Select1		DBIT
bFlag_RX_FIFO_Select		DBIT
bFlag_RX_FIFO_Select1		DBIT
bFlag_TX_Mode			DBIT
bFlag_RX_Mode			DBIT
bFlag_RX_SPI			DBIT

;----use for playload
bFlag_End_SPI_Operation   	DBIT	

;---general variant
temp_num			DB		?	;general use for SPI counter
table_data			DB		?	;initial table
COMMAND_L			DB		?	;second send data via SPI
COMMAND_H			DB		?	;first 	send data via SPI
RF_number			DB		?

;---TX/RX ADDR WRITE
TX_ADDRESS_Select		DB	?
RX_ADDRESS_Select		DB	?
nRF_ADDR_value			DB	5  DUP(?)

#define 	AUDIO_8K 		1

extern			control_read_table:NEAR        
extern			device_desc_table:NEAR         
extern			config_desc_table:NEAR         

extern			end_config_desc_table:NEAR  
extern			hid_report_desc_table:NEAR
extern			end_hid_report_desc_table:NEAR

extern			USBStringLanguageDescription:NEAR
extern			USBStringDescription1:NEAR
extern			USBStringDescription2:NEAR

extern			config_desc_length:NEAR
extern			report_desc_length:NEAR
;function
extern			Control_Read:NEAR
extern			FIFO0_RD_CHECK:NEAR
extern			FIFO1_RD_CHECK:NEAR
extern			FIFO2_RD_CHECK:NEAR
extern			FIFO3_RD_CHECK:NEAR
extern			FIFO4_RD_CHECK:NEAR
extern			FIFO5_RD_CHECK:NEAR
extern			FIFO0_WR_CHECK:NEAR
extern			FIFO1_WR_CHECK:NEAR
extern			FIFO2_WR_CHECK:NEAR
extern			FIFO3_WR_CHECK:NEAR
extern			FIFO4_WR_CHECK:NEAR
extern			FIFO5_WR_CHECK:NEAR
extern			Read_FIFO0:NEAR
extern			Read_FIFO1:NEAR
extern			Read_FIFO2:NEAR
extern			Read_FIFO3:NEAR
extern			Read_FIFO4:NEAR
extern			Read_FIFO5:NEAR
extern			Write_FIFO0:NEAR
extern			Write_FIFO1:NEAR
extern			Write_FIFO2:NEAR
extern			Write_FIFO3:NEAR
extern			Write_FIFO4:NEAR
extern			Write_FIFO5:NEAR
extern			Send_Hand_Shake:NEAR
extern			get_descriptor_length:NEAR

extern			SetAddress:NEAR
extern			SetConfiguration:NEAR
extern			SetInterface:NEAR
extern			GetInterface:NEAR
extern			GetDescriptor:NEAR
extern			SetIdle:NEAR
extern			GetDeviceDescriptor:NEAR
extern			GetConfigurationDescriptor:NEAR
extern			GetStringDescriptor:NEAR
extern			GetStatus:NEAR
extern			SetFeature:NEAR
extern			ClearFeature:NEAR
extern			SetReport:NEAR
extern			Execute:NEAR
extern			SendStall0:NEAR
extern			Delay_3us:NEAR

extern			SetFeature_Endpoint:NEAR
extern			ClearFeature_Endpoint:NEAR
extern			GetStatus_Endpoint:NEAR

extern			Check_Real_Cmd:NEAR
extern			GetConfiguration:NEAR


;audio
extern		SetCur:NEAR
extern		GetMin:NEAR
extern		GetMax:NEAR
extern		GetRes:NEAR
extern		GetCur:NEAR

extern		GetPipeBit:NEAR

;nRF 24L01
extern		TX_RX_Switch:NEAR
extern		RX_mode_set:NEAR
extern		nRF_TX_Transmit:NEAR
extern		nRF_RX_Receive:NEAR
extern		nRF_initial:NEAR
extern		nRF_int:NEAR

;***************************************************************
;		MCU Interrupt Table
;***************************************************************


CODE            .section        AT 00H 'code'
		ORG		00H
		jmp		Start
		ORG		04H
		jmp		USB_ISR
		ORG		08H
		jmp		Timer_0_ISR
		ORG		0CH
		jmp		Timer_1_ISR
		ORG		18H
		jmp		RECORD_INT_ISR

	;-----------------------------------------------------------
	; Start : ORG 20H avoid front interrupt
	;-----------------------------------------------------------
ORG	20H
Start:

		call	System_Initial
		call 	nRF_initial
	;-----------------------------------------------------------
	; Main LOOP Function  : 
	;-----------------------------------------------------------
Main:
	;-----------------------------------------------------------
	; Check Suspend Function  :
	; When check suspend first time, need delay 1 second check again
	;-----------------------------------------------------------
		SNZ		USC.@USC_SUSP		;check SUSPEND ?
		JMP		Main_My_Function

		call		wait_about_1s
		SNZ		USC.@USC_SUSP
		JMP		Main_My_Function
		
	
		clr 		wdt	
		clr		TMR1C.4
		clr		USB_LED_ON
		clr		UCC.@UCC_USBCKEN
	;-----------------------------------------------------------
	; Resume  Function  : 
	; recover state, enable USBCKEN
	;-----------------------------------------------------------
		HALT
		set		TMR1C.4		
		set		USB_LED_ON
		set		UCC.@UCC_USBCKEN

Main_My_Function:
	;-----------------------------------------------------------
	; Here to add your another code !!
	;-----------------------------------------------------------
		clr wdt	
		NOP
;---------------------------------------------------	
		;modify 2006-07-27	
		SZ 	ADC_POR_FG
		JMP 	Main_End			
		SNZ	bFlag_SetConfiguration_Ready
		JMP 	Main_End 
		SET	ADC_POR_FG
;---------------------------------------------------
		set	ERECI
		;set	ET0I
Main_End:
		;call	TX_RX_Switch
		;call	nRF_TX_Transmit
		;call	nRF_RX_Receive
		;sz	TMR1_KEY_FG
		;call	Run_Volume_Step		
		JMP	Main

;***************************************************************
;		System Initial
;		1.ram_initial
;		1.Timer Initial
;		2.USB Config
;***************************************************************
System_Initial:
	;-----------------------------------------------------------
	; Debug
	;-----------------------------------------------------------
		clr wdt

	;-----------------------------------------------------------
	; Modify Pop Noise
	;-----------------------------------------------------------
		kmov WDTS,07h
		mov		a,WDTS
		mov		FIFO_TEMP,a

		mov		a,01010111b
		mov		WDTS,a

		clr		[02DH]

		
		mov		a,80H
		mov		[02EH],a
		nop
		nop
		set		[02FH].3
		nop
		nop
		clr		[02FH].3
		nop
		nop

		mov		a,FIFO_TEMP
		mov		WDTS,a
	;-----------------------------------------------------------
	; Wait Bais and ROUT LOUT Capacity rise about 1.98ms
	; delay time = 255*255*30*3(sdz,jmp) cycle * 0.3333us/cycle = 1.98 ms
	;-----------------------------------------------------------
	IF	WaitBias
		clr		pac

		clr		FIFO_OUT1
		clr		FIFO_OUT2
		clr		FIFO_OUT3
		mov		a,9		
		mov		FIFO_OUT3,a
		clr		pa



	System_Initial_Loop:
		clr wdt	
		sdz		FIFO_OUT1
		jmp		System_Initial_Loop
		sdz		FIFO_OUT2
		jmp		System_Initial_Loop		
		sdz		FIFO_OUT3
		jmp		System_Initial_Loop		
		nop
		clr wdt	
		set		pa
	ENDIF
	;-----------------------------------------------------------
	; Codec Limit
	;-----------------------------------------------------------
		clr		[02DH]
		set		[02EH]
	;-----------------------------------------------------------
	; ram_initial : clear the ram of bank 0
	;-----------------------------------------------------------
	ram_initial:	;clear RAM (040H--0FFH)
		MOV		A,040H
		MOV		MP0,A
		MOV		A,192
	ram_initial_next_addr:
		clr		wdt
		CLR		R0
		INC		MP0
		SDZ		acc
		JMP		ram_initial_next_addr

	ram_initial_1:	;clear RAM (040H--0FFH)
		MOV		A,040H
		MOV		MP1,A
		KMOV		TBLP,192
		kmov		BP,001h
	ram_initial_next_addr_1:
		clr		wdt
		KMOV		R1,080h
		INC		MP1
		SDZ		TBLP
		JMP		ram_initial_next_addr_1
		clr		BP	
			
		CLR		bFlag_RD_HTable
	;-----------------------------------------------------------
	; timer_initial : do timer initial
	;-----------------------------------------------------------
	timer_initial:
		MOV 		A,82H		;  low to high edge trigger, internal timer mode
		MOV		TMR0C,A		;
		MOV		A,00H		; 1ms
		MOV		TMR0L,A		
		MOV		A,000H		
		MOV		TMR0H,A		

		mov		a,80H
		mov		TMR1C,a
		mov		a,00H
		mov		TMR1L,a
		mov		TMR1H,a

	;-----------------------------------------------------------
	; config_io_port :
	;-----------------------------------------------------------
		clr		pa
		;kmov		pac,0FEH
		
		IF 		UseMediaKey
			kmov		pac,Key_Defined
		ENDIF
		IFE		UseMediaKey
			kmov		pac,00000000b
		ENDIF
		
		clr		pc		;for volume control
		set		pcc

	;-----------------------------------------------------------
	; config_usb_speaker_register :
	;-----------------------------------------------------------
		clr		USVC		;mute & 0db
	
	;for test
		;set		DA_R_ENB	;Right Channel Disable	
		

	;-----------------------------------------------------------
	; reset variable :
	;-----------------------------------------------------------
		clr		bFlag_Audio_Mute
		clr		bFlag_Mute_Detect
		clr		bFlag_INC_Detect
		clr		bFlag_DEC_Detect
	;-----------------------------------------------------------
	; config_usb : do usb config
	;-----------------------------------------------------------
	config_usb:
		CLR		INTC0
		SET		INTC0.@INTC0_EEI		;enable USB
		SET		INTC0.@INTC0_EMI		;Global interrupt

		set		MISC.@MISC_ISOEN	;ISO Output Interrupt Enable
		set		MISC.@MISC_ISIEN	;ISO Input Interrupt Enable
		clr		STALL
		clr		UCC.@UCC_SUSP2
		
		;SYSCLK
		;set			UCC.6	//set to 6 MHz

		set 		UCC.@UCC_USBCKEN
		nop
		set		USC.@USC_V33C		;//pc start to send command

			
		if	AUDIO_8K
			set		MODE_CTRL.3
		endif
		
		clr wdt		
		RET

;***************************************************************
;		RECORD_INT_ISR
;		
;		
;***************************************************************
RECORD_INT_ISR:
;set pa7
		MOV		isr_rec_acc,A		;save ACC
		MOV		A,STATUS
		MOV		isr_rec_status,A	;save status
		MOV		A,MP1
		MOV		isr_rec_mp1,A		;save mp1
		MOV		A,MP0 
		MOV		isr_rec_mp0,A		;save mp0
		MOV		A,TBLP
		MOV		isr_rec_tblp,A		;save TBLP
		MOV		A,BP
		MOV		isr_rec_bp,A		;save bp

		call		nRF_int			
		
EXIT_RECORD_INT_ISR:
		MOV		A,isr_rec_bp		;restone bp
		MOV		BP,A
		MOV		A,isr_rec_tblp		;restore TBLP
		MOV		TBLP,A
		MOV		A,isr_rec_mp0		;restore MP0
		MOV		MP0,A
		MOV		A,isr_rec_mp1		;restore MP1
		MOV		MP1,A
		MOV		A,isr_rec_status	;restore STATUS
		MOV		STATUS,A
		MOV		A,isr_rec_acc		;restore ACC   	     		
;clr pa7		
		RETI
		
;***************************************************************
;		Timer_0_ISR
;		1.Timer time = 21.2 ms
;		2.Do this procedure is 3.6ms
;***************************************************************
Timer_0_ISR:	
		clr		TMR0C.4
		MOV		isr_tmr0_acc,A		;save ACC
		MOV		A,STATUS
		MOV		isr_tmr0_status,A	;save status
		MOV		A,MP1
		MOV		isr_tmr0_mp1,A		;save mp1
		MOV		A,MP0
		MOV		isr_tmr0_mp0,A		;save mp0
		MOV		A,TBLP
		MOV		isr_tmr0_tblp,A		;save TBLP
		MOV		A,BP
		MOV		isr_tmr0_bp,A		;save bp
		
		clr	BP		
		
Timer_0_My_Function:
	;-----------------------------------------------------------
	; Here to add your another code !!
	;-----------------------------------------------------------

⌨️ 快捷键说明

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