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

📄 hp_sensor.asm

📁 Holteck HT82M9XX的USB Mouse的Firmware汇编代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;------------------------------------------------------------------------------
; 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 + -