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

📄 main.asm

📁 Holtek ht82a832r USB-PHONE DEMO 源码 ht82a832r 是Holtek开发的USB-PHONE 的OTP SOC芯片,信价比很高
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*******************************************************************************
;*
;*  (c) Copyright 2005, Holtek Semiconductor Inc.
;* 
;******************************************************************************/
;*******************************************************************************
;MODULE:	main.asm

;INITIAL:	04/10/2005

;AUTHOR:	C351  Ansonku.

;NOTE:	 	HT82A832R 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	判斷 token 時,假設遇到setup scmd,要在讀取8 bytes清除scmd與len0
;*******************************************************************************

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

;====================================================================
;Variable Defined , DATA 從 40H 開始放
;====================================================================
DATA		.SECTION		AT	40H		'DATA'
;***************************************************************
;		USB ISR Var (中斷時備份用)
;***************************************************************
isr_usb_acc		DB		?
isr_usb_status		DB		?
isr_usb_mp1		DB		?
isr_usb_mp0		DB		?
isr_usb_tblp		DB		?
;***************************************************************
;		Timer0 ISR Var (中斷時備份用)
;***************************************************************
isr_tmr0_acc		DB		?
isr_tmr0_status		DB		?
isr_tmr0_mp1		DB		?
isr_tmr0_mp0		DB		?
isr_tmr0_tblp		DB		?
;***************************************************************
;		Timer1 ISR Var (中斷時備份用)
;***************************************************************
isr_tmr1_acc		DB		?
isr_tmr1_status		DB		?
isr_tmr1_mp1		DB		?
isr_tmr1_mp0		DB		?
isr_tmr1_tblp		DB		?

;***************************************************************
;		Delay 變數
;***************************************************************
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		?

FIFO_9_16			db	8 DUP(?)
;
;存储EP0 IN OUT Token的数据阶段的数据
;
CMD_Request			label	byte
DATA_Buf			db	32 DUP(?)
;接收缓冲区的接收指针和接收字节数
Data_Length			db		?	;EP0在Setup Token中指定的长度
Data_RCount			db		?
Data_RStart			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

;
;EP0 中OUT Token 的数据剩余中断,在Setup Token 中将bFlag_OutTokenRemainInt置0
;在Out Token中若检查该Bit=0则从接收缓冲区首1字节开始存储,1则从当前位置开始存储
bFlag_OutTokenRemainInt		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
;---------------

;
;数据缓冲区
;
;
CMD_Buf				db	16 DUP(?)	;待处理指令
;CMD_RCount			db	?		;接收的待处理指令的字节数
CMD_SCount			db	?		;待发送处理指令的字节数
CMD_SPtr			db	?
Key_Buf				db	32 DUP(?)	;键码缓冲区
Key_ptr				db	?
Key_Count			db	?		;检测到新的按键
;
;按键IO读取的状态	Key_State00 ,Key_State01  第一列按键
Key_State00 			db	?		;当前状态
Key_State01 			db	?		;前一状态
;			Key_State10 ,Key_State11  第二列按键
Key_State10 			db	?
Key_State11 			db	?
;			Key_State20 ,Key_State21  第三列按键
Key_State20 			db	?
Key_State21 			db	?
;			Key_State30 ,Key_State31  第四列按键
Key_State30 			db	?
Key_State31 			db	?
;			Media Key 的状态
Key_MState0			db	?
Key_MState1			db	?


#define 	AUDIO_8K 		1


DA_R_ENB	EQU	MODE_CTRL.1
DA_L_ENB	EQU	MODE_CTRL.0
AD_ENB		EQU	MODE_CTRL.2

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			Read_FIFO0_EX:NEAR
extern			Read_FIFO1_EX:NEAR
extern			Read_FIFO2_EX:NEAR
extern			Read_FIFO3_EX:NEAR
extern			Read_FIFO4_EX:NEAR
extern			Read_FIFO5_EX: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			Delay_28us: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


;***************************************************************
;		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


	;-----------------------------------------------------------
	; Start : ORG 20H 避開前面 interrupt
	;-----------------------------------------------------------
ORG	20H
Start:
;---------------------------------------
;modify 2006-07-27
ADC_Power_On_Reset:
		set	AD_ENB 		;AD_ENB=1 =>ADC Power Down
		call  	Delay_20ms
		clr	AD_ENB 		;AD_ENB=0 =>ADC Power On
;---------------------------------------
		call	System_Initial
	;-----------------------------------------------------------
	; Main LOOP Function  : 
	;-----------------------------------------------------------
Main:
	;-----------------------------------------------------------
	; Check Suspend Function  :
	; 第一次檢查到 suspend 應要再 delay 1 S 後再檢查一次 , 如果此時 suspend 訊號還在才進入 halt
	; 請檢查 timer 此時是否有開啟 , 若有應暫時關閉 , 待 resume 後再開啟 
	;-----------------------------------------------------------
		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  : 
	; 在此 function 要把 halt 之前的 timer 狀態恢復 , 並且開啟 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	AD_ENB 		;AD_ENB=1 =>ADC Power Down
		call  	Delay_20ms
		clr	AD_ENB 		;AD_ENB=0 =>ADC Power On
		SET	ADC_POR_FG
;---------------------------------------------------
Main_End:
		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
		clr		FIFO_OUT4
		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
		
		CLR		bFlag_RD_HTable
	;-----------------------------------------------------------
	; timer_initial : do timer initial
	;-----------------------------------------------------------
	timer_initial:
		MOV 		A,82H		;  設定 low 到 high 觸發並設為內部計時模式
		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
		kmov		pac,Key_Defined
		clr		pb
		set		pbc
		clr		pc		;for volume control
		set		pcc

		;按键状态扫描寄存器
		MOV		A,0
		MOV		Key_State00,A
		MOV		Key_State10,A
		MOV		Key_State20,A
		MOV		Key_State30,A
		MOV		Key_State01,A
		MOV		Key_State11,A
		MOV		Key_State21,A
		MOV		Key_State31,A

		MOV		Key_MState0,A
		MOV		Key_MState1,A

		mov		Key_Count,A

	;-----------------------------------------------------------
	; 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

⌨️ 快捷键说明

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