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

📄 csd2x_1hl.asm

📁 带触摸按键的高端电磁炉设计 该方案采用CYPRESS的新器件CY8C22545,是一款专门针对中高端的家电触摸产品设计。除了集成触摸按键功能外
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;;*****************************************************************************
;;  FILENAME: CSD2X_1HL.asm
;;   Version: 1.1, Updated on 2008/10/28 at 17:22:15
;;  Generated by PSoC Designer ???
;;
;;  DESCRIPTION: CSD2X User Module high level software
;;                implementation file for the 22x45 PSoC family of devices.
;;-----------------------------------------------------------------------------
;;  Copyright (c) Cypress Semiconductor 2007. All Rights Reserved.
;;*****************************************************************************
;;*****************************************************************************

include "m8c.inc"
include "memory.inc"
include "CSD2X_1.inc"

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

export _CSD2X_1_UpdateSensorBaseline
export  CSD2X_1_UpdateSensorBaseline
export _CSD2X_1_InitializeSensorBaseline
export  CSD2X_1_InitializeSensorBaseline
export _CSD2X_1_bIsSensorActive
export  CSD2X_1_bIsSensorActive
export _CSD2X_1_bIsAnySensorActive
export  CSD2X_1_bIsAnySensorActive
export _CSD2X_1_SetDefaultFingerThresholds
export  CSD2X_1_SetDefaultFingerThresholds
export _CSD2X_1_InitializeBaselines
export  CSD2X_1_InitializeBaselines
export _CSD2X_1_UpdateAllBaselines
export  CSD2X_1_UpdateAllBaselines
IF CSD2X_1_SLIDERS_EXIST
export _CSD2X_1_wGetCentroidPos
export  CSD2X_1_wGetCentroidPos
ENDIF
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
AREA InterruptRAM (RAM, REL, CON)

_CSD2X_1_bNoiseThreshold:
 CSD2X_1_bNoiseThreshold:					 BLK  1
_CSD2X_1_bNegativeNoiseThreshold:
 CSD2X_1_bNegativeNoiseThreshold:           BLK  1
_CSD2X_1_bBaselineUpdateThreshold:
 CSD2X_1_bBaselineUpdateThreshold:          BLK  1
_CSD2X_1_bHysteresis:
 CSD2X_1_bHysteresis:                       BLK  1
_CSD2X_1_bDebounce:
 CSD2X_1_bDebounce:                         BLK  1
_CSD2X_1_bLowBaselineReset:
 CSD2X_1_bLowBaselineReset:                 BLK  1

export _CSD2X_1_bNoiseThreshold:
export  CSD2X_1_bNoiseThreshold:
export _CSD2X_1_bNegativeNoiseThreshold:
export  CSD2X_1_bNegativeNoiseThreshold:
export _CSD2X_1_bBaselineUpdateThreshold:
export  CSD2X_1_bBaselineUpdateThreshold:
export _CSD2X_1_bHysteresis:
export  CSD2X_1_bHysteresis:
export _CSD2X_1_bDebounce:
export  CSD2X_1_bDebounce:
export _CSD2X_1_bLowBaselineReset:
export  CSD2X_1_bLowBaselineReset:

; Local variables
_CSD2X_1_bEndOfArray:                               ; Temp pointer variable
 CSD2X_1_bEndOfArray:                       BLK  1
_CSD2X_1_fIsPressed:                                ; Temp variable for if any sensor is pressed
 CSD2X_1_fIsPressed:                        BLK  1
_CSD2X_1_bCurPos:                                   ; Temp position variable
 CSD2X_1_bCurPos:                           BLK  1
_CSD2X_1_bSnsMaskPtr:                               ; Temp sensor mask pointer used in centroid calculation
 CSD2X_1_bSnsMaskPtr:                       BLK  1
_CSD2X_1_bStartIndex:                               ; Temp Start index
 CSD2X_1_bStartIndex:						 BLK  1
_CSD2X_1_wTmpBtnFThreshold:                         ; Temp Difference
 CSD2X_1_wTmpBtnFThreshold:				 BLK  2

IF CSD2X_1_SLIDERS_EXIST
; Local slider variables
_CSD2X_1_wDenom:                                    ; Denominator is also the Ctrd Pos
 CSD2X_1_wDenom:                            BLK  2
_CSD2X_1_dNumer:                                    ; Numerator also contains the Ctrd Pos
 CSD2X_1_dNumer:                            BLK  2
_CSD2X_1_wCtrdPos:                                  ; Ctrd Pos is LMSB and LLSB of the numerator
 CSD2X_1_wCtrdPos:                          BLK  2
_CSD2X_1_dMultTempX:                                ; Temp multiplication register
 CSD2X_1_dMultTempX:                        BLK  4
_CSD2X_1_dMultTempY:                                ; Temp multiplication register
 CSD2X_1_dMultTempY:                        BLK  4
_CSD2X_1_bCurSlider:
 CSD2X_1_bCurSlider:                        BLK  1
_CSD2X_1_bCurCtrdStartPos:                          ; Temp current centroid start position
 CSD2X_1_bCurCtrdStartPos:                  BLK  1
_CSD2X_1_bCurCtrdSize:                              ; Temp current centroid size
 CSD2X_1_bCurCtrdSize:                      BLK  1
_CSD2X_1_bBiggestCtrdStartPos:                      ; Temp biggest centroid start position
 CSD2X_1_bBiggestCtrdStartPos:              BLK  1
_CSD2X_1_bBiggestCtrdSize:                          ; Temp biggest centroid size
 CSD2X_1_bBiggestCtrdSize:                  BLK  1
_CSD2X_1_wCurPkValue:                               ; Temp current peak
 CSD2X_1_wCurPkValue:                       BLK  2
_CSD2X_1_bCurPkPos:                                 ; Temp current slider pointer
 CSD2X_1_bCurPkPos:                         BLK  1
_CSD2X_1_bDiplexInfo:                               ; Temp flag for diplex of current group
 CSD2X_1_bDiplexInfo:						 BLK  1
_CSD2X_1_bDiplexMSB:                                ; Temp that contains the address of the rom diplex table
 CSD2X_1_bDiplexMSB:                        BLK  1
_CSD2X_1_bDiplexLSB:
 CSD2X_1_bDiplexLSB:                        BLK  1
_CSD2X_1_wDivBtwSns:                                ; Temp divisions between sensors
 CSD2X_1_wDivBtwSns:                        BLK  2
ENDIF

AREA bss
; Global variables
_CSD2X_1_waSnsBaseline:                             ; Baseline, one entry for each sensor
 CSD2X_1_waSnsBaseline:                     BLK  (2*CSD2X_1_TotalSensorCount)
_CSD2X_1_waSnsDiff:                                 ; ABS Diff of raw and and baseline, one entry for each sensor
 CSD2X_1_waSnsDiff:                         BLK  (2*CSD2X_1_TotalSensorCount)
_CSD2X_1_baSnsBucket:                                 ; Baseline difference accumulator, one entry for each sensor
 CSD2X_1_baSnsBucket:                       BLK  CSD2X_1_TotalSensorCount
_CSD2X_1_baBtnFThreshold:                           ; Containing variable finger threshold for each button
 CSD2X_1_baBtnFThreshold:                   BLK  CSD2X_1_TotalSensorCount
_CSD2X_1_baSnsOnMask:                               ; Sensor mask array containing on/off state of sensors
 CSD2X_1_baSnsOnMask:                       BLK  ((CSD2X_1_TotalSensorCount-1)/8)+1
_CSD2X_1_baSnsDebounce:
 CSD2X_1_baSnsDebounce:                     BLK  CSD2X_1_TotalSensorCount
_CSD2X_1_baLowBaselineReset:
 CSD2X_1_baLowBaselineReset:                BLK  CSD2X_1_TotalSensorCount

IF CSD2X_1_SLIDERS_EXIST
_CSD2X_1_waCtrdPkValue:                             ; Array containing peak value of centroid
 CSD2X_1_waCtrdPkValue:                     BLK  (2*CSD2X_1_SliderCount)
ENDIF

; Global variables
export _CSD2X_1_waSnsBaseline
export  CSD2X_1_waSnsBaseline
export _CSD2X_1_waSnsDiff
export  CSD2X_1_waSnsDiff
export _CSD2X_1_baBtnFThreshold
export  CSD2X_1_baBtnFThreshold
export _CSD2X_1_baSnsOnMask
export  CSD2X_1_baSnsOnMask

; Local variables
export _CSD2X_1_fIsPressed
export  CSD2X_1_fIsPressed
export _CSD2X_1_bEndOfArray
export  CSD2X_1_bEndOfArray
export _CSD2X_1_bCurPos
export  CSD2X_1_bCurPos
export _CSD2X_1_bSnsMaskPtr
export  CSD2X_1_bSnsMaskPtr

IF CSD2X_1_SLIDERS_EXIST
; Local slider variables
export _CSD2X_1_wDenom
export  CSD2X_1_wDenom
export _CSD2X_1_wCtrdPos
export  CSD2X_1_wCtrdPos
export _CSD2X_1_dNumer
export  CSD2X_1_dNumer
export _CSD2X_1_dMultTempX
export  CSD2X_1_dMultTempX
export _CSD2X_1_dMultTempY
export  CSD2X_1_dMultTempY
export _CSD2X_1_bCurCtrdStartPos
export  CSD2X_1_bCurCtrdStartPos
export _CSD2X_1_bCurCtrdSize
export  CSD2X_1_bCurCtrdSize
export _CSD2X_1_bBiggestCtrdStartPos
export  CSD2X_1_bBiggestCtrdStartPos
export _CSD2X_1_bBiggestCtrdSize
export  CSD2X_1_bBiggestCtrdSize
export _CSD2X_1_wCurPkValue
export  CSD2X_1_wCurPkValue
export _CSD2X_1_bCurPkPos
export  CSD2X_1_bCurPkPos
export _CSD2X_1_bDiplexMSB
export  CSD2X_1_bDiplexMSB
export _CSD2X_1_bDiplexLSB
export  CSD2X_1_bDiplexLSB
export _CSD2X_1_wDivBtwSns
export  CSD2X_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

.SECTION
;-----------------------------------------------------------------------------
;  FUNCTION NAME: CSD2X_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.
;
 CSD2X_1_UpdateSensorBaseline:
_CSD2X_1_UpdateSensorBaseline:
   RAM_PROLOGUE RAM_USE_CLASS_4
   RAM_PROLOGUE RAM_USE_CLASS_3
   RAM_SETPAGE_CUR 0 ; direct access ram will always be in interrupt ram area

   mov [CSD2X_1_bSensorNum], A                                                 ; Save sensor index
   asl A
   mov X,A

   ; Get the difference counts
   RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
   mov A, [X+CSD2X_1_waSnsResult+LSB]
   RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
   sub A, [X+CSD2X_1_waSnsBaseline+LSB]
   RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
   mov [X+CSD2X_1_waSnsDiff+LSB], A
   RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
   mov A, [X+CSD2X_1_waSnsResult+MSB]
   RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
   sbb A, [X+CSD2X_1_waSnsBaseline+MSB]
   RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
   mov [X+CSD2X_1_waSnsDiff+MSB], A

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

IF (CSD2X_1_AUTORESET)
   cmp [X+CSD2X_1_waSnsDiff+MSB], 0
   jz   .AddBucketLSB
   mov  A, 255
   jmp  .AddBucketConst
ELSE
   ; Compare to Noise Threshold
   cmp [X+CSD2X_1_waSnsDiff+MSB], 0
   jnz  .InitLowBaselineReset
   mov A, [CSD2X_1_bNoiseThreshold]
   cmp A, [X+CSD2X_1_waSnsDiff+LSB]
   jc	.InitLowBaselineReset
ENDIF

   ; Add to the Bucket
.AddBucketLSB:
   mov A, [X+CSD2X_1_waSnsDiff+LSB]
.AddBucketConst:
   mov X, [CSD2X_1_bSensorNum]
   add A, 0
   rrc A															                                                        ; For slower tracking
   RAM_SETPAGE_IDX >CSD2X_1_baSnsBucket
   add [X+CSD2X_1_baSnsBucket], A
   jc  .DoInc
   mov A, [CSD2X_1_bBaselineUpdateThreshold]
   cmp A, [X+CSD2X_1_baSnsBucket]
   jnc .EndBucket
   jz  .EndBucket
.DoInc:
   ; Increment Baseline
   mov [X+CSD2X_1_baSnsBucket], 0
   mov A, X
   asl A
   mov X, A
   RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
   add [X+CSD2X_1_waSnsBaseline+LSB], 1
   adc [X+CSD2X_1_waSnsBaseline+MSB], 0

.EndBucket:
IF (CSD2X_1_AUTORESET)
   mov  A, [CSD2X_1_bSensorNum]
   asl  A
   mov  X, A
   ; Compare to Noise Threshold
   RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
   cmp [X+CSD2X_1_waSnsDiff+MSB], 0
   jnz  .InitLowBaselineReset
   mov A, [CSD2X_1_bNoiseThreshold]
   cmp A, [X+CSD2X_1_waSnsDiff+LSB]
   jc	.InitLowBaselineReset
ELSE
ENDIF
   jmp .SetDifferenceToZero

.IsNegative:
   ; Compare to Negative Noise Threshold
   cmp [X+CSD2X_1_waSnsDiff+MSB], FFh
   jnz  .CheckLowBaseline
   mov A, FFh
   sub A, [CSD2X_1_bNegativeNoiseThreshold]
   cmp A, [X+CSD2X_1_waSnsDiff+LSB]
   jc	.LowerBaseline
.CheckLowBaseline:
   ; Set difference to zero
   RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
   mov [X+CSD2X_1_waSnsDiff+LSB], 0
   mov [X+CSD2X_1_waSnsDiff+MSB], 0
   ; Check Low Baseline Reset
   mov A, X
   asr A
   mov X, A
   RAM_SETPAGE_IDX >CSD2X_1_baLowBaselineReset
   mov A, [X+CSD2X_1_baLowBaselineReset]
   dec A
   mov [X+CSD2X_1_baLowBaselineReset], A
   push A
   mov A, X
   asl A
   mov X, A
   pop A
   jnz .EndofUpdateSensorBaseline

.LowerBaseline:
   RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
   mov A, [X+CSD2X_1_waSnsResult+LSB]
   RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
   mov [X+CSD2X_1_waSnsBaseline+LSB], A
   RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
   mov A, [X+CSD2X_1_waSnsResult+MSB]
   RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
   mov [X+CSD2X_1_waSnsBaseline+MSB], A

.SetDifferenceToZero:
   ; Set difference to zero
   mov A, [CSD2X_1_bSensorNum]
   asl A
   mov X,A
   RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
   mov [X+CSD2X_1_waSnsDiff+LSB], 0
   mov [X+CSD2X_1_waSnsDiff+MSB], 0
.InitLowBaselineReset:
   mov A, X
   asr A
   mov X, A
   RAM_SETPAGE_IDX >CSD2X_1_baLowBaselineReset
   mov A, [CSD2X_1_bLowBaselineReset]
   mov [X+CSD2X_1_baLowBaselineReset], A

.EndofUpdateSensorBaseline:
   RAM_EPILOGUE RAM_USE_CLASS_3
   RAM_EPILOGUE RAM_USE_CLASS_4
   ret

.ENDSECTION

.SECTION
;-----------------------------------------------------------------------------
;  FUNCTION NAME: CSD2X_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
;

⌨️ 快捷键说明

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