📄 hp_sensor.asm
字号:
;------------------------------------------------------------------------------
; Filename : HP_SENSOR-9.ASM(叁合一)
; Remark :
;------------------------------------------------------------------------------
#include HT82K96E.INC
#include HP_SENSOR.INC
;------------------------------------------------------------------------------
#define CF C ;
#define ZF Z ;
;------------------------------------------------------------------------------
#define SDIO 6 ; Bit position
#define SCLK 7 ; Bit position
#define SENSOR_SELECT 0 ; Bit position
#define HP_SENSOR_PORT PB ;
#define HP_SENSOR_SDIO_PIN PB.6 ; SDIO pin
#define HP_SENSOR_SCLK_PIN PB.7 ; SCLK pin
#define SELECT0_PIN PC.0 ; DPI selection
#define HP_SENSOR_SDIO_CONTROL PBC.6 ; Set SDIO INPUT/OUTPUT
#define HP_SENSOR_SCLK_CONTROL PBC.7 ; Set SCLK INPUT/OUTPUT
#define SELECT0_PIN_CONTROL PCC.0 ; DPI selection INPUT/OUTPUT
;------------------------------------------------------------------------------
#define MOUSE_EVENT_PORT PA ;
#define Z0_PIN PA.0 ;
#define Z1_PIN PA.1 ;
#define L_BUTTON_PIN PA.2 ;
#define R_BUTTON_PIN PA.3 ;
#define M_BUTTON_PIN PA.4 ;
#define RB0_BUTTON_PIN PA.5 ;
#define RB1_BUTTON_PIN PA.6 ;
#define LED_PIN PA.7 ;
#define SELECT1_PIN PD.4 ;
#define MOUSE_EVENT_PORT_CONTROL PAC ;
#define Z0_CONTROL PAC.0 ;
#define Z1_CONTROL PAC.1 ;
#define L_BUTTON_CONTROL PAC.2 ;
#define R_BUTTON_CONTROL PAC.3 ;
#define M_BUTTON_CONTROL PAC.4 ;
#define RB0_BUTTON_CONTROL PAC.5 ;
#define RB1_BUTTON_CONTROL PAC.6 ;
#define LED_PIN_CONTROL PAC.7 ;
#define SELECT1_PIN_CONTROL PDC.4 ;
#define Z_AXIS_MASK 00000011B ;
#define Z_CONSISTENCY_DURATION 02 ;20 ;
#define BUTTON_CONSISTENCY_DURATION 20 ;50 ;
#define BUTTON_EVENT_MASK 01111100B ;
#define MOUSE_EVENT_MASK 00011111B ;
;------------------------------------------------------------------------------
HPSensorDataArea .section 'data'
HPSensorAddress db ? ; Address parameter
HPSensorData db ? ; Data parameter(Input/Output)
HPSensorAddressBackup db ? ; Save HPSensorAddress
HPSensorDataBackup db ? ; Save HPSensorData
HPSensorLoopCounter db ? ; Loop counter
;-- ButtonStatus of LB,RB,MB,RB0,and RB1. 1==>pressed; 0==>unchanged
MouseEvent label byte ;
F_LButton dbit ; Bit 0 of MouseEvent
F_RButton dbit ; Bit 1 of MouseEvent
F_MButton dbit ; Bit 2 of MouseEvent
F_RB0Button dbit ; Bit 3 of MouseEvent
F_RB1Button dbit ; Bit 4 of MouseEvent
F_Reserved0 dbit ; 最好不要使用,避免影响到ButtonStatus的判断
F_Reserved1 dbit ; 最好不要使用,避免影响到ButtonStatus的判断
F_Reserved2 dbit ; 最好不要使用,避免影响到ButtonStatus的判断
F_Sensor2030 dbit ; 1:Sensor2030 is selected
F_ZDirection dbit ; Used in WheelCheck
F_MouseChange dbit ; Determine whether mouse changed
F_ButtonChange dbit ; Determine whether button changed
DeltaXCounter db ? ; Keep DeltaX from HP_SENSOR
DeltaYCounter db ? ; Keep DeltaY from HP_SENSOR
DeltaZCounter db ? ; Keep DeltaZ from polling wheel
ZCurrentStatus db ? ; Used in WheelCheck
ZHistoryStatus db ? ; Used in WheelCheck
ButtonHistoryStatus db ? ; Used in ButtonCheck
ButtonCurrentStatus db ? ; Used in ButtonCheck
ButtonDebounceTime db ? ; Used while debouncing button
WheelDebounceTime db ? ; Used while debouncing wheel
WheelFlag db ? ; Used in WheelCheck
ZDivider db ? ; Used in WheelCheck
;------------------------------------------------------------------------------
tempA db ? ; temp variable
tempB db ? ; temp variable
BackupACC db ? ;
BackupSTATUS db ? ;
;------------------------------------------------------------------------------
public F_MouseChange
public F_ButtonChange
public F_Sensor2030
public MoveMouseData
public MouseSuspend
public InitializeMouseSensor
public CheckHPSensorProductID
public SetHPSensorDPI
public GetMouseDeltaXY
public WheelCheck
public wheel_pcl_17
public ButtonCheck
public DeltaXCounter
public DeltaYCounter
public DeltaZCounter
public MouseEvent
public tempA
public tempB
extern fifo_out1:byte
extern fifo_out2:byte
extern fifo_out3:byte
extern fifo_out4:byte
extern DetermineMouseChange : near
;------------------------------------------------------------------------------
HP_SENSOR_CODE .section 'code'
;------------------------------------------------------------------------------
; Function : WriteHPSensor
; Input : HPSensorAddress, HPSensorData
; Output : None
; Remark : Write HP sensor operation.大约用掉375个指令时间
;------------------------------------------------------------------------------
WriteHPSensor:
clr WDT ; Clear WDT
clr INTC.0 ; Turn off INT
mov HPSensorDataBackup, A ; Save HPSensorData
mov A, HPSensorAddress ;
mov HPSensorAddressBackup, A; Save HPSensorAddress
clr HP_SENSOR_SDIO_CONTROL ; Set SDIO pin to OUTPUT for later Write operation
set HP_SENSOR_SDIO_PIN ; SDIO HIGH
set HP_SENSOR_SCLK_PIN ; SCLK HIGH
;----------------------------------------------------------------------
; Remark : Set to Write operation
;----------------------------------------------------------------------
set HPSensorAddressBackup.7 ; Set to Write operation
;----------------------------------------------------------------------
; Remark : Serial out HPSensorAddress
;----------------------------------------------------------------------
mov A, 08 ;
SerialOutWriteAddressLoop:
clr HP_SENSOR_SCLK_PIN ; SCLK LOW
rlc HPSensorAddressBackup ;
sz CF ;
jmp $+3
clr HP_SENSOR_SDIO_PIN ; Default to output SDIO=LOW
jmp $+2
set HP_SENSOR_SDIO_PIN ; Output is toggled to SDIO=HIGH
set HP_SENSOR_SCLK_PIN ; SCLK HIGH
sdz ACC ;
jmp SerialOutWriteAddressLoop
;----------------------------------------------------------------------
; Remark : Serial out HPSensorData
;----------------------------------------------------------------------
mov A, 08 ;
SerialOutWriteDataLoop:
clr HP_SENSOR_SCLK_PIN ; SCLK LOW
rlc HPSensorDataBackup ;
sz CF ;
jmp $+3
clr HP_SENSOR_SDIO_PIN ; Default to output SDIO=LOW
jmp $+2
set HP_SENSOR_SDIO_PIN ; Output is toggled to SDIO=HIGH
set HP_SENSOR_SCLK_PIN ; SCLK HIGH
sdz ACC ;
jmp SerialOutWriteDataLoop
set HP_SENSOR_SCLK_PIN ; SCLK HIGH
set HP_SENSOR_SDIO_CONTROL ; Set SDIO pin to INPUT
ExitWriteHPSensor:
mov A, 050 ;
sdz ACC ;
jmp $-1 ;
set INTC.0 ; Turn on INT
ret
;------------------------------------------------------------------------------
; Function : ReadHPSensor
; Input : HPSensorAddress
; Output : ACC
; Remark : Read HP sensor operation.大约用掉470个指令时间
;------------------------------------------------------------------------------
ReadHPSensor:
clr WDT ; Clear WDT
clr INTC.0 ; Turn off INT
mov A, HPSensorAddress ;
mov HPSensorAddressBackup, A; Save HPSensorAddress
clr HP_SENSOR_SDIO_CONTROL ; Set SDIO pin to OUTPUT for later Write operation
set HP_SENSOR_SDIO_PIN ; SDIO HIGH
set HP_SENSOR_SCLK_PIN ; SCLK HIGH
;----------------------------------------------------------------------
; Remark : Set to Read operation
;----------------------------------------------------------------------
clr HPSensorAddressBackup.7 ; Set to Read operation
;----------------------------------------------------------------------
; Remark : Serial out HPSensorAddress
;----------------------------------------------------------------------
mov A, 08 ;
SerialOutReadAddressLoop:
clr HP_SENSOR_SCLK_PIN ; SCLK LOW
rlc HPSensorAddressBackup ;
sz CF ;
jmp $+3
clr HP_SENSOR_SDIO_PIN ; Default to output SDIO=LOW
jmp $+2
set HP_SENSOR_SDIO_PIN ; Output is toggled to SDIO=HIGH
set HP_SENSOR_SCLK_PIN ; SCLK HIGH
sdz ACC ;
jmp SerialOutReadAddressLoop
set HP_SENSOR_SDIO_CONTROL ; Set SDIO pin to INPUT for later Read operation
;----------------------------------------------------------------------
; Remark : Wait 100uSec for data ready
;----------------------------------------------------------------------
mov A, 060 ;
sdz ACC ;
jmp $-1 ;
mov A, 08 ;
mov HPSensorLoopCounter, A ; HPSensorLoopCounter=08
SerialInReadDataLoop:
clr HP_SENSOR_SCLK_PIN ; SCLK LOW
set HP_SENSOR_SCLK_PIN ; SCLK HIGH
clr CF ; Default CF to LOW
sz HP_SENSOR_SDIO_PIN ; Polling SDIO_PIN
set CF ; Toggle CF to HIGH
rlc ACC ; Shift left to ACC
sdz HPSensorLoopCounter ; Decrement HPSensorLoopCounter
jmp SerialInReadDataLoop
;clr HP_SENSOR_SDIO_CONTROL ; Set SDIO pin to OUTPUT for later Write operation
mov HPSensorDataBackup, A ; Save ACC
mov A, 060 ;
sdz ACC ;
jmp $-1 ;
mov A, HPSensorDataBackup ; Restore ACC
ExitReadHPSensor:
set INTC.0 ; Turn on INT
ret
;------------------------------------------------------------------------------
; Function : InitializeMouseSensor
; Input : None
; Output : None
; Remark : Power down ADNS for 100uSec
;------------------------------------------------------------------------------
InitializeMouseSensor:
clr F_MouseChange ; Clear F_MouseChange
clr F_ZDirection ; Clear F_ZDirection
clr MouseEvent ; Clear F_L/M/R/RB0/RB1Button
clr DeltaZCounter ; Clear DeltaZCounter
RePowerOnSensor:
clr DeltaXCounter ; Clear DeltaXCounter
clr DeltaYCounter ; Clear DeltaYCounter
set SELECT0_PIN_CONTROL ; Set SELECT0_PIN pin to INPUT
set SELECT1_PIN_CONTROL ; Set SELECT1_PIN pin to INPUT
;----------------------------------------------------------------------
; Remark : 先关sensor电源50mSec,再上电40mSec之後,才检查SensorID(02-25-2003)
; Note : The SDIO and SCLK must be remain HIGH before PowerUp to prevent
; PowerDown command fail while using ADNS-26X0
;----------------------------------------------------------------------
clr LED_PIN_CONTROL ; Set LED to OUTPUT mode
set LED_PIN ; Output LED=1 to turn off HP_SENSOR
mov A, 100 ;60 ; ACC=10 for 5mSec, ACC=60 for 30mSec
set HPSensorLoopCounter ; HPSensorLoopCounter=255
sdz HPSensorLoopCounter ; Decrement LoopCounter
jmp $-1 ;
sdz ACC ;
jmp $-4 ;
clr HP_SENSOR_SDIO_CONTROL ; Set SDIO to OUTPUT
clr HP_SENSOR_SCLK_CONTROL ; Set SCLK to OUTPUT
clr LED_PIN ; Output LED=0 to turn on HP_SENSOR
mov A, 080;180 ;60 ; ACC=10 for 5mSec, ACC=60 for 30mSec
set HPSensorLoopCounter ; HPSensorLoopCounter=255
sdz HPSensorLoopCounter ; Decrement LoopCounter
jmp $-1 ;
sdz ACC ;
jmp $-4 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -