?? main.asm
字號:
;*******************************************************************************
;*
;* (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 + -