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

📄 main.asm

📁 holtek mouse .asm firewave
💻 ASM
字号:
INCLUDE	REG_DEF.INC

PUBLIC	START

EXTERN	MICROC_INIT				:NEAR
EXTERN	SEN_INIT				:NEAR
EXTERN	SEN_READ_MONTION		:NEAR
EXTERN	SEN_ENTRY_SLEEP_MODE	:NEAR
EXTERN	SEN_RESUME				:NEAR
EXTERN	DELAY_100US				:NEAR

EXTERN	INIT_RF					:NEAR
EXTERN	WAIT_FSP				:NEAR
EXTERN	RF_CHANGE_TO_RX			:NEAR
EXTERN	RF_CHANGE_TO_TX			:NEAR
EXTERN	RF_FIFO_WRITE			:NEAR
EXTERN	RF_FIFO_READ			:NEAR
EXTERN	CHECK_FSP				:NEAR
EXTERN	RF_REFILL_DATA			:NEAR

EXTERN	DRAW_CIRCLE				:NEAR

EXTERN	TEST_RF					:NEAR

EXTERN	SCAN_KEY				:NEAR

EXTERN	INIT_TIMER				:NEAR

EXTERN	COMM_SYNC				:NEAR
EXTERN	GET_NEXT_CHANNEL		:NEAR

EXTERN	POWER_CTRL				:NEAR


BOOT_CODE	.SECTION	AT 0000H	'CODE'

	JMP		START

MAIN_CODE	.SECTION 	AT 0010H 	'CODE'

START:
		CALL	MICROC_INIT					; INITIALIZE THE MCU RAM AND I/O
		CALL	INIT_TIMER					; INITIALIZE THE TIMER
		CALL	SEN_INIT					; INITIALIZE THE OPTICAL SENSOR
		CALL	INIT_RF						; INITIALIZE THE ARF2496K

		; CHECK IF THE USER WANT TO ENTRY TEST MODE OR NOT
		; IF LEFT-BUTTON, RIGHT-BUTTON AND MIDDLE-BUTTON ARE PRESSED, THEN 
		; ENTRY CIRCLE TEST MODE
		SET		CIRCLE_TEST
		SZ		R_BUT	;PA.2
		JMP		NOT_CIRCLE_TEST
		SZ		L_BUT	;PA.3
		JMP		NOT_CIRCLE_TEST
		SZ		M_BUT	;PA.4
		JMP		NOT_CIRCLE_TEST

		; ENTRY CIRCLE TEST MODE, SENSOR SHOULD BE OFF
		CALL	SEN_ENTRY_SLEEP_MODE
		JMP		UN_SYNC

	NOT_CIRCLE_TEST:
		CLR		CIRCLE_TEST

	UN_SYNC:
		; ENABLE TIMER AND SEEK FOR FSP FOR SYNC WITH DONGLE
		SET		TIMER_ENABLE
		CALL	COMM_SYNC
		SZ		RESUME_FROM_HALT
		JMP		START
		CALL	RF_FIFO_READ

		JMP		SYNCED
;====================================================================================
	MAIN_LOOP:
		;Still wait for FSP, even the RF chip is shuted down;
		;To maintain the clock ticking for 8ms period
		CALL	WAIT_FSP

	SYNCED:
		; IF RF IS NOT SHUTTED DOWN, THEN CHECK THE FSP PACKET
		SZ		POWER_MODE.0

                JMP		POWER_MODE_0_2

		CALL	CHECK_FSP

		SZ		VALID_FSP
		JMP		VALID_FSP_GOT

		SZ		POWER_MODE.2
		JMP		AA2

		SNZ		DONGLE_LINKED
		JMP		UN_SYNC

	AA2:

		INC		NO_FSP_COUNT
		MOV		A, 6
		XOR		A, NO_FSP_COUNT
		SZ		ACC
		JMP		NOT_VALID_FSP_GOT

		CLR		NO_FSP_COUNT
		CLR		DONGLE_LINKED
		SNZ		POWER_MODE.2
		JMP		UN_SYNC

		SZ		POWER_MODE.2 
		DEC		NO_FSP_COUNT 

		SZ		POWER_MODE.2 
		JMP		POWER_MODE_0_2

	VALID_FSP_GOT:

		; IF VALID FSP IS RECEIVED, RESET NO_FSP_COUNT		
		CLR		NO_FSP_COUNT

	NOT_VALID_FSP_GOT:

		SZ		POWER_MODE.2
		JMP		AA3

                SNZ		POWER_MODE.0
		; NO_FSP_COUNT < 6, THEN STILL SYNC WITH DONGLE, STILL SEND OUT THE DATA 
		; PACKET.
		CALL	RF_CHANGE_TO_TX

	AA3:
	
	POWER_MODE_0_2:
		SNZ		CIRCLE_TEST
		CALL	SEN_READ_MONTION
		SZ		CIRCLE_TEST
		CALL	DRAW_CIRCLE

		CALL	SCAN_KEY

		SZ		POWER_MODE.2
		JMP		AA1

		SNZ		POWER_MODE.0
		CALL	RF_REFILL_DATA

	AA1:

		;TIME GATE, HOLD TO TRANSMIT MOUSE DATA TO THE DONGLE,
		;TO MEET THE TIME SLOT REQUIREMENT
	WAIT_TG_0:
		MOV		A, 30
		XOR		A, TIMER_COUNT
		SZ		ACC
		JMP		WAIT_TG_0

		; IF OVER 100 COMMUNICATION HAS NO EVENT FROM BUTTONS, WHEEL AND SENSOR,
		; STOP TO SEND DATA TO THE DONGLE
		SZ		XYZ_ZERO_FLAG
		JMP		NOT_CHECK_FSP

		; IF RF IS SHUTTED DOWN, NOT TO WRITE DATA TO THE RF
		SNZ		POWER_MODE.0
		CALL	RF_FIFO_WRITE
		
	NOT_CHECK_FSP:
                ; IF IT IS CIRCLE TEST MODE, THEN DO NOT HANDLE POWER SAVING CONTROL
		SNZ		CIRCLE_TEST
		CALL	POWER_CTRL
		SZ		RESUME_FROM_HALT
		JMP		START

		SZ		POWER_MODE.2
		JMP		AA4
		; IF RF IS SHUTTED DOWN, NOT TO CHANGE CHANNEL
		SNZ		POWER_MODE.0
		CALL	GET_NEXT_CHANNEL

		; IF RF IS SHUTTED DOWN, NOT TO SWITCH RF TO RX MODE
		SNZ		POWER_MODE.0
		CALL	RF_CHANGE_TO_RX

	AA4:



		;TIME GATE, HOLD TO TURN ON RF-FRONT CIRCUIT,
		;TO MEET THE TIME SLOT REQUIREMENT FOR POWER CONSUMPTION REDUCTION
	WAIT_TG_1:
		MOV		A, 73
		XOR		A, TIMER_COUNT
		SZ		ACC
		JMP		WAIT_TG_1
	
		JMP		MAIN_LOOP

		RET

⌨️ 快捷键说明

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