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

📄 csd_1hl.asm

📁 cypresscy74294ic键盘和鼠标原码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;;*****************************************************************************
;;  FILENAME: CSD_1HL.asm
;;   @Versions@
;;  Generated by PSoC Designer ver 4.4  b1884 : 14 Jan, 2007
;;
;;  DESCRIPTION: CSD User Module high level software
;;                implementation file for the 21x34 PSoC family of devices.
;;-----------------------------------------------------------------------------
;;  Copyright (c) Cypress Semiconductor 2000-2006. All Rights Reserved.
;;*****************************************************************************
;;*****************************************************************************

include "m8c.inc"
include "memory.inc"
include "CSD_1.inc"

;-----------------------------------------------
; Global Symbols
;-----------------------------------------------

export _CSD_1_UpdateSensorBaseline
export  CSD_1_UpdateSensorBaseline
export _CSD_1_InitializeSensorBaseline
export  CSD_1_InitializeSensorBaseline 
export _CSD_1_bIsSensorActive
export  CSD_1_bIsSensorActive
export _CSD_1_bIsAnySensorActive
export  CSD_1_bIsAnySensorActive
export _CSD_1_SetDefaultFingerThresholds
export  CSD_1_SetDefaultFingerThresholds
export _CSD_1_InitializeBaselines
export  CSD_1_InitializeBaselines
export _CSD_1_UpdateAllBaselines
export  CSD_1_UpdateAllBaselines
IF CSD_1_SLIDERS_EXIST
export _CSD_1_wGetCentroidPos
export  CSD_1_wGetCentroidPos
ENDIF
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
AREA InterruptRAM (RAM, REL, CON)

; Local variables
_CSD_1_bEndOfArray:                               ; Temp pointer variable
 CSD_1_bEndOfArray:                       BLK  1  
_CSD_1_fIsPressed:                                ; Temp variable for if any sensor is pressed
 CSD_1_fIsPressed:                        BLK  1
_CSD_1_bCurPos:                                   ; Temp position variable
 CSD_1_bCurPos:                           BLK  1  
_CSD_1_bSnsMaskPtr:                               ; Temp sensor mask pointer used in centroid calculation
 CSD_1_bSnsMaskPtr:                       BLK  1
_CSD_1_bStartIndex:                               ; Temp Start index
 CSD_1_bStartIndex:						 BLK  1
_CSD_1_wTmpBtnFThreshold:                         ; Temp Difference
 CSD_1_wTmpBtnFThreshold:				 BLK  2

IF CSD_1_SLIDERS_EXIST
; Local slider variables
_CSD_1_wDenom:                                    ; Denominator is also the Ctrd Pos
 CSD_1_wDenom:                            BLK  2
_CSD_1_dNumer:                                    ; Numerator also contains the Ctrd Pos
 CSD_1_dNumer:                            BLK  2                   
_CSD_1_wCtrdPos:                                  ; Ctrd Pos is LMSB and LLSB of the numerator
 CSD_1_wCtrdPos:                          BLK  2                            
_CSD_1_dMultTempX:                                ; Temp multiplication register
 CSD_1_dMultTempX:                        BLK  4
_CSD_1_dMultTempY:                                ; Temp multiplication register
 CSD_1_dMultTempY:                        BLK  4
_CSD_1_bCurSlider:                        
 CSD_1_bCurSlider:                        BLK  1
_CSD_1_bCurCtrdStartPos:                          ; Temp current centroid start position
 CSD_1_bCurCtrdStartPos:                  BLK  1
_CSD_1_bCurCtrdSize:                              ; Temp current centroid size
 CSD_1_bCurCtrdSize:                      BLK  1
_CSD_1_bBiggestCtrdStartPos:                      ; Temp biggest centroid start position
 CSD_1_bBiggestCtrdStartPos:              BLK  1
_CSD_1_bBiggestCtrdSize:                          ; Temp biggest centroid size
 CSD_1_bBiggestCtrdSize:                  BLK  1
_CSD_1_wCurPkValue:                               ; Temp current peak
 CSD_1_wCurPkValue:                       BLK  2
_CSD_1_bCurPkPos:                                 ; Temp current slider pointer
 CSD_1_bCurPkPos:                         BLK  1
_CSD_1_bDiplexInfo:                               ; Temp flag for diplex of current group
 CSD_1_bDiplexInfo:						 BLK  1
_CSD_1_bDiplexMSB:                                ; Temp that contains the address of the rom diplex table
 CSD_1_bDiplexMSB:                        BLK  1
_CSD_1_bDiplexLSB:
 CSD_1_bDiplexLSB:                        BLK  1
_CSD_1_wDivBtwSns:                                ; Temp divisions between sensors
 CSD_1_wDivBtwSns:                        BLK  2
ENDIF

AREA bss
; Global variables
_CSD_1_baSnsBucket:                                 ; Baseline difference accumulator, one entry for each sensor
 CSD_1_baSnsBucket:                       BLK  CSD_1_TotalSensorCount
_CSD_1_baSnsDebounce:
 CSD_1_baSnsDebounce:                     BLK  CSD_1_TotalSensorCount
_CSD_1_baLowBaselineReset:
 CSD_1_baLowBaselineReset:                BLK  CSD_1_TotalSensorCount

IF CSD_1_SLIDERS_EXIST
_CSD_1_waCtrdPkValue:                             ; Array containing peak value of centroid
 CSD_1_waCtrdPkValue:                     BLK  (2*CSD_1_SliderCount)
ENDIF
 	 
; Local variables
export _CSD_1_fIsPressed
export  CSD_1_fIsPressed
export _CSD_1_bEndOfArray
export  CSD_1_bEndOfArray
export _CSD_1_bCurPos
export  CSD_1_bCurPos
export _CSD_1_bSnsMaskPtr
export  CSD_1_bSnsMaskPtr

IF CSD_1_SLIDERS_EXIST
; Local slider variables
export _CSD_1_wDenom
export  CSD_1_wDenom
export _CSD_1_wCtrdPos
export  CSD_1_wCtrdPos
export _CSD_1_dNumer
export  CSD_1_dNumer
export _CSD_1_dMultTempX
export  CSD_1_dMultTempX
export _CSD_1_dMultTempY
export  CSD_1_dMultTempY
export _CSD_1_bCurCtrdStartPos
export  CSD_1_bCurCtrdStartPos
export _CSD_1_bCurCtrdSize
export  CSD_1_bCurCtrdSize
export _CSD_1_bBiggestCtrdStartPos
export  CSD_1_bBiggestCtrdStartPos
export _CSD_1_bBiggestCtrdSize
export  CSD_1_bBiggestCtrdSize
export _CSD_1_wCurPkValue
export  CSD_1_wCurPkValue
export _CSD_1_bCurPkPos
export  CSD_1_bCurPkPos
export _CSD_1_bDiplexMSB
export  CSD_1_bDiplexMSB
export _CSD_1_bDiplexLSB
export  CSD_1_bDiplexLSB
export _CSD_1_wDivBtwSns
export  CSD_1_wDivBtwSns
ENDIF

;@PSoC_UserCode_INIT@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom declarations below this banner
;---------------------------------------------------

;------------------------
; User Includes
;------------------------


;------------------------
; User Constant Definitions
;------------------------


;------------------------
; User Variable Allocation
;------------------------


;---------------------------------------------------
; Insert your custom declarations above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)

;------------------------
;  Constant Definitions
;------------------------
AREA UserModules (ROM, REL, CON)

; For using two byte variables
LSB:  equ  1
MSB:  equ  0

; For using four byte variables
MMSB: equ 0
MLSB: equ 1
LMSB: equ 2
LLSB: equ 3

FINGER_THRESHOLD:            equ   1eh
NOISE_THRESHOLD:             equ   ah
NEGATIVE_NOISE_THRESHOLD:    equ   5h
BASELINE_UPDATE_THRESHOLD:   equ   14h


.SECTION
;-----------------------------------------------------------------------------
;  FUNCTION NAME: CSD_1_UpdateSensorBaseline(BYTE bSensorNum)
;
;  DESCRIPTION:
;      Update baseline for one sensor. The algorithm is as follows:
;        If difference count is negative baseline become raw count
;        If difference count is above noise threshold do not update
;        Else difference count is positive and within noise threshold so
;        difference is halved and added to the bucket. When the bucket
;        reaches the threshold the baseline increments and the bucket resets
;-----------------------------------------------------------------------------
;  STACK USAGE: 0 BYTES
;
;  ARGUMENTS: 
;      A => Sensor Number
;    
;  RETURNS:    
;      Nothing
;
;  SIDE EFFECTS: 
;    The A and X registers may be modified by this or future implementations
;    of this function.  The same is true for all RAM page pointer registers in
;    the Large Memory Model.  When necessary, it is the calling function's
;    responsibility to perserve their values across calls to fastcall16 
;    functions.
;
 CSD_1_UpdateSensorBaseline:
_CSD_1_UpdateSensorBaseline:
   RAM_PROLOGUE RAM_USE_CLASS_3
   RAM_SETPAGE_CUR 0 ; direct access ram will always be in interrupt ram area
   RAM_X_POINTS_TO_INDEXPAGE
   
   mov [CSD_1_bSensorNum], A                                                   ; Save sensor index
   asl A
   mov X,A
   
   ; Get the difference counts
   RAM_SETPAGE_IDX >CSD_1_waSnsResult
   mov A, [X+CSD_1_waSnsResult+LSB]
   RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
   sub A, [X+CSD_1_waSnsBaseline+LSB]
   RAM_SETPAGE_IDX >CSD_1_waSnsDiff
   mov [X+CSD_1_waSnsDiff+LSB], A 
   RAM_SETPAGE_IDX >CSD_1_waSnsResult
   mov A, [X+CSD_1_waSnsResult+MSB]
   RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
   sbb A, [X+CSD_1_waSnsBaseline+MSB]
   RAM_SETPAGE_IDX >CSD_1_waSnsDiff
   mov [X+CSD_1_waSnsDiff+MSB], A

   tst [X+CSD_1_waSnsDiff+MSB], 80h						                                      ; Is difference negative?
   jnz .IsNegative

IF (CSD_1_AUTORESET)
   cmp [X+CSD_1_waSnsDiff+MSB], 0
   jz   .AddBucketLSB
   mov  A, 255
   jmp  .AddBucketConst
ELSE
   ; Compare to Noise Threshold
   cmp [X+CSD_1_waSnsDiff+MSB], 0
   jnz  .InitLowBaselineReset 
   cmp [X+CSD_1_waSnsDiff+LSB], NOISE_THRESHOLD
   jnc	.InitLowBaselineReset
   jz   .InitLowBaselineReset
ENDIF
   
   ; Add to the Bucket
.AddBucketLSB:
   mov A, [X+CSD_1_waSnsDiff+LSB]
.AddBucketConst:
   mov X, [CSD_1_bSensorNum]							     
   add A, 0
   rrc A															                                                        ; For slower tracking
   RAM_SETPAGE_IDX >CSD_1_baSnsBucket                     
   add [X+CSD_1_baSnsBucket], A
   jc  .DoInc
   cmp [X+CSD_1_baSnsBucket], BASELINE_UPDATE_THRESHOLD
   jc .EndBucket
.DoInc:
   ; Increment Baseline
   mov [X+CSD_1_baSnsBucket], 0
   mov A, X
   asl A
   mov X, A
   RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
   add [X+CSD_1_waSnsBaseline+LSB], 1 
   adc [X+CSD_1_waSnsBaseline+MSB], 0
   
.EndBucket:
IF (CSD_1_AUTORESET)
   mov  A, [CSD_1_bSensorNum]
   asl  A
   mov  X, A
   ; Compare to Noise Threshold
   RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
   cmp [X+CSD_1_waSnsDiff+MSB], 0
   jnz  .InitLowBaselineReset 
   cmp [X+CSD_1_waSnsDiff+LSB], NOISE_THRESHOLD
   jnc	.InitLowBaselineReset
   jz   .InitLowBaselineReset
ELSE
ENDIF
   jmp .SetDifferenceToZero

.IsNegative:
   ; Compare to Negative Noise Threshold
   cmp [X+CSD_1_waSnsDiff+MSB], FFh
   jnz  .CheckLowBaseline 
   cmp [X+CSD_1_waSnsDiff+LSB], (FFh - NEGATIVE_NOISE_THRESHOLD)
   jnc	.LowerBaseline
.CheckLowBaseline:
   ; Set difference to zero
   RAM_SETPAGE_IDX >CSD_1_waSnsDiff
   mov [X+CSD_1_waSnsDiff+LSB], 0
   mov [X+CSD_1_waSnsDiff+MSB], 0
   ; Check Low Baseline Reset
   mov A, X
   asr A
   mov X, A
   RAM_SETPAGE_IDX >CSD_1_baLowBaselineReset
   mov A, [X+CSD_1_baLowBaselineReset]
   dec A
   mov [X+CSD_1_baLowBaselineReset], A
   push A
   mov A, X
   asl A
   mov X, A
   pop A
   jnz .EndofUpdateSensorBaseline

.LowerBaseline:
   RAM_SETPAGE_IDX >CSD_1_waSnsResult
   mov A, [X+CSD_1_waSnsResult+LSB]
   RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
   mov [X+CSD_1_waSnsBaseline+LSB], A
   RAM_SETPAGE_IDX >CSD_1_waSnsResult
   mov A, [X+CSD_1_waSnsResult+MSB]
   RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
   mov [X+CSD_1_waSnsBaseline+MSB], A

.SetDifferenceToZero:
   ; Set difference to zero
   mov A, [CSD_1_bSensorNum]
   asl A
   mov X,A
   RAM_SETPAGE_IDX >CSD_1_waSnsDiff
   mov [X+CSD_1_waSnsDiff+LSB], 0
   mov [X+CSD_1_waSnsDiff+MSB], 0
.InitLowBaselineReset:
   mov A, X
   asr A
   mov X, A
   RAM_SETPAGE_IDX >CSD_1_LowBaselineReset
   mov [X+CSD_1_baLowBaselineReset], CSD_1_LowBaselineReset
          
.EndofUpdateSensorBaseline:
   RAM_EPILOGUE RAM_USE_CLASS_3
   ret

.ENDSECTION

.SECTION
;-----------------------------------------------------------------------------
;  FUNCTION NAME: CSD_1_bIsSensorActive(BYTE bSensorNum)
;
;  DESCRIPTION:
;      Returns state of one sensor.	Updates the baSnsOnMask array. 
;      Implements hysteresis based on the Hysteresis parameter.
;-----------------------------------------------------------------------------
;  STACK USAGE: 3 BYTES
;
;  ARGUMENTS: 
;      A => sensor index

⌨️ 快捷键说明

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