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