📄 main.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 + -