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

📄 csd2x_1.asm

📁 带触摸按键的高端电磁炉设计 该方案采用CYPRESS的新器件CY8C22545,是一款专门针对中高端的家电触摸产品设计。除了集成触摸按键功能外
💻 ASM
📖 第 1 页 / 共 4 页
字号:
    call  CSD2X_1_EnableSensor                         ; Enable Sensor

	M8C_SetBank1
    or reg[MUX_CR0], 20h                                       ; Connect P0[5]
	M8C_SetBank0

    ; Set scanning speed
    mov A, reg[CSD0_CR1]                                       ; Read current register value
    mov [CSD2X_1_bBitMask], A
    mov A, [CSD2X_1_bSensorNumLeft]
    index  CSD2X_1_ScanSpeed_Table_Left                ; A contains the scanning speed value
    asl A                                                      ; Move to the right position
    asl A
    and [CSD2X_1_bBitMask], 0F3h                       ; Clear clock devider bits CSDCLK/1
    or [CSD2X_1_bBitMask], A                          ; Set New scanning speed value
    mov A, [CSD2X_1_bBitMask]
    mov reg[CSD0_CR1], A                                       ; Write new register value

    ; Configure multishot Left
    mov [CSD2X_1_bBitMask], 10h
    mov A, [CSD2X_1_bSensorNumLeft]
    index  CSD2X_1_ScanSpeed_Table_Left               ; A contains the scanning speed value
    jz .L1
.L0:
    asl [CSD2X_1_bBitMask]                             ; Move to right position
    dec A
    jnz .L0
.L1:
    mov A, [CSD2X_1_bBitMask]
    mov X, A                                                   ; Store the old data
    mov A, reg[CSD0_CR0]
    and A, ~0F0h                                               ; Clear M_SHOT bits
    mov [CSD2X_1_bBitMask], A
    mov A, X
    or [CSD2X_1_bBitMask], A
    mov A, [CSD2X_1_bBitMask]
    mov reg[CSD0_CR0], A                                       ; Set multishot

    ; Set resolution Left
IF (CSD2X_1_LEFT_PRECHARGE_SRC & CSD2X_1_PRECHARGE_PRS)   ; PRS
   mov A, [CSD2X_1_bSensorNumLeft];
   index CSD2X_1_Resolution_Table_Left                ; A contains the resolution value
   asl A
   inc A
   mov X, A
   index CSD2X_1_PRS_Poly_Table                        ; A contains the polynomial value LSB
   mov reg[CSD0_DR1_L], A                                      ; Write the polynomial value LSB
   mov A, X
   dec A
   index CSD2X_1_PRS_Poly_Table                        ; A contains the polynomial value MSB
   mov reg[CSD0_DR1_H], A                                      ; Write the polynomial value MSB
ELSE ; Timer
   mov A, [CSD2X_1_bSensorNumLeft]
   index  CSD2X_1_Resolution_Table_Left                ; A contains the resolution number
   index CSD2X_1_Timer_Res_Table                       ; A contains the resolution value
   mov reg[CSD0_DR1_H], A
   mov reg[CSD0_DR1_L], 0FFh                                   ; Set new value
ENDIF

   // Right Channel
   cmp [CSD2X_1_bSensorNumRight], 0FFh                 ; Check is scan enabled
   jnc .Scan                                                   ; Go to scan if only lefrt channel is enabled

.ScanRight:
   mov A, [CSD2X_1_bSensorNumRight]
   index  CSD2X_1_RefValue_Table_Right                 ; A contains the reference value
   call CSD2X_1_SetRightRefValue

    ; Set DAC values
IF (CSD2X_1_AUTOCALIBRATION)
	mov A, [CSD2X_1_bSensorNumRight]
	mov X, A                                             ; Get array index
	RAM_SETPAGE_IDX >CSD2X_1_baDACCodeBaselineR
	mov A, [X+CSD2X_1_baDACCodeBaselineR]                 ; Get right DAC value from memory
   	call CSD2X_1_SetRightDACValue
ELSE
	mov A, [CSD2X_1_bSensorNumRight]
    index  CSD2X_1_DACR_Table                          ; A contains the right DAC value from ROM table
    call CSD2X_1_SetRightDACValue
ENDIF

	mov A, [CSD2X_1_bSensorNumRight]
    call  CSD2X_1_wGetPortPinRight                     ; Get sensor pin and port
    call  CSD2X_1_EnableSensor                         ; Enable Sensor

	M8C_SetBank1
    or reg[MUX_CR0], 80h                                       ; Connect P0[7]
	M8C_SetBank0

	; Set scanning speed
    mov A, reg[CSD1_CR1]                                       ; Read old register value
    mov [CSD2X_1_bBitMask], A
    mov A, [CSD2X_1_bSensorNumRight]
    index  CSD2X_1_ScanSpeed_Table_Right               ; A contains the scanning speed value
    asl A
    asl A
    and [CSD2X_1_bBitMask], 0F3h                       ; Clear clock devider bits CSDCLK/1
    or [CSD2X_1_bBitMask], A                           ; Set New scanning speed value
    mov A, [CSD2X_1_bBitMask]
    mov reg[CSD1_CR1], A                                       ; Write new register value

    ; Configure multishot Right
    mov [CSD2X_1_bBitMask], 10h
    mov A, [CSD2X_1_bSensorNumRight];
    index  CSD2X_1_ScanSpeed_Table_Right               ; A contains the scanning speed value
    jz .L3
 .L2:
    asl [CSD2X_1_bBitMask]                             ; Move to right position
    dec A
    jnz .L2
.L3:
    mov A, [CSD2X_1_bBitMask]
    mov X, A                                                   ; Store the data
    mov A, reg[CSD1_CR0]
    and A, ~0F0h                                               ; Clear multishot bits
    mov [CSD2X_1_bBitMask], A
    mov A, X
    or [CSD2X_1_bBitMask], A
    mov A, [CSD2X_1_bBitMask]
    mov reg[CSD1_CR0], A                                       ; Write new multishot value

    ; Set resolution Right
IF (CSD2X_1_RIGHT_PRECHARGE_SRC & CSD2X_1_PRECHARGE_PRS)   ; PRS
    mov A, [CSD2X_1_bSensorNumRight];
    index CSD2X_1_Resolution_Table_Right               ; A contains the resolution value
    asl A
    inc A
    mov X, A
    index CSD2X_1_PRS_Poly_Table                       ; A contains the polynomial value LSB
    mov reg[CSD1_DR1_L], A                                     ; Write the polynomial value LSB
    mov A, X
    dec A
    index CSD2X_1_PRS_Poly_Table                       ; A contains the polynomial value MSB
    mov reg[CSD1_DR1_H], A                                     ; Write the polynomial value MSB
ELSE ; Timer
    mov A, [CSD2X_1_bSensorNumRight];
    index  CSD2X_1_Resolution_Table_Right              ; A contains the resolution number
    index CSD2X_1_Timer_Res_Table                      ; A contains the resolution value
    mov reg[CSD1_DR1_H], A
    mov reg[CSD1_DR1_L], 0FFh                                  ; Write resolution
ENDIF

    ; Start CSD
.Scan:
    cmp [CSD2X_1_bSensorNumLeft], 0FFh                 ; Check is scan enabled
    jnc .N0
	or reg[CSD0_CR0], 1	                                       ; Enable CSD0
	or [CSD2X_1_bfStatus_Left], CSD2X_1_SCAN_ACTIVE       ; Set scan active flag
.N0: cmp [CSD2X_1_bSensorNumRight], 0FFh               ; Check is scan enabled
    jnc .N1
    or reg[CSD1_CR0], 1	                                       ; Enable CSD1
	or [CSD2X_1_bfStatus_Right], CSD2X_1_SCAN_ACTIVE      ; Set scan active flag
.N1:

    ; Start Scan
	mov reg[INT_VC], 0                                         ; Clear pending interrupts
	or reg[INT_MSK2], 60h                                      ; Enable CSD0 and CSD1 Interrupts

    ; Wait for data
.waitforinterrupt:
    tst  [CSD2X_1_bfStatus_Left], CSD2X_1_SCAN_ACTIVE  ; Check scan active flag
	jnz .waitforinterrupt                                     ; Go to check data complete flag if zero

	tst  [CSD2X_1_bfStatus_Right], CSD2X_1_SCAN_ACTIVE    ; Check scan active flag
	jnz .waitforinterrupt                                     ; Go to check data complete flag if zero

	; Data are complete
	and reg[INT_MSK2], ~60h                                    ; Disable CSD Interrupts

    ; Disconnect filter capacitors from BUS
	M8C_SetBank1
    and reg[MUX_CR0], ~A0h;
	M8C_SetBank0

	cmp [CSD2X_1_bSensorNumLeft], 0FFh                    ; Check is scan enabled
    jnc .N2
	mov A, [CSD2X_1_bSensorNumLeft];
    call  CSD2X_1_wGetPortPinLeft                      ; Get sensor pin and port
    call  CSD2X_1_DisableSensor                        ; Disable Sensor
.N2:
	cmp [CSD2X_1_bSensorNumRight], 0FFh                   ; Check is scan enabled
    jnc .N3
	mov A, [CSD2X_1_bSensorNumRight];
    call  CSD2X_1_wGetPortPinRight                     ; Get sensor pin and port
    call  CSD2X_1_DisableSensor                        ; Disable Sensor
.N3:
	and reg[CSD0_CR0],~1                                       ; Disable CSD Left
	and reg[CSD1_CR0],~1                                       ; Disable CSD Right

   RAM_EPILOGUE RAM_USE_CLASS_3
   ret
.ENDSECTION

.SECTION
;-----------------------------------------------------------------------------
;  FUNCTION NAME: CSD2X_1_ScanAllSensors(void)
;
;  DESCRIPTION:
;    Scans all sensors to measure their raw count values
;
;-----------------------------------------------------------------------------
;
;  ARGUMENTS:    None.
;  RETURNS:      None
;  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_ScanAllSensors:
_CSD2X_1_ScanAllSensors:
   RAM_PROLOGUE RAM_USE_CLASS_3

   mov   A,CSD2X_1_TotalLeftSensorCount                ; Loop through all left sensors
   dec   A
   mov   X,CSD2X_1_TotalRightSensorCount               ; Loop through all right sensors
   dec   X
.ScanLoop:                                             ; Synchronous scan both channels
   push  A                                             ; Save current left sensor
   push  X                                             ; Save current right sensor
   call  CSD2X_1_ScanSensor                            ; Scan both channels
   pop   X                                             ; Restore right channel number
   mov A, X
   cmp A, 0FFh                                         ; Are right sensor scan complete?
   jnc .Dec0
   dec   X                                             ; Decrement pointer to scan next sensor
.Dec0:
   pop   A                                             ; Restore Left Sensor
   cmp A, 0FFh                                         ; Are left sensor scan complete?
   jnc .Check
   dec   A                                             ; Decrement pointer to scan next sensor
   jnc .ScanLoop
.Check:
   swap A, X                                           ; Compare right cnahhel to end of scan
   cmp A, 0FFh
   jnc .End                                            ; FO to end scan if left and right channels are FF
   swap A, X
   jmp .ScanLoop
.End:
   RAM_EPILOGUE RAM_USE_CLASS_3
   ret
.ENDSECTION

.SECTION
;-----------------------------------------------------------------------------
;  FUNCTION NAME: CSD2X_1_wReadSensor(BYTE bSensor)
;
;  DESCRIPTION:
;     Returns the sensor scan value in A (LSB) and X (MSB)
;-----------------------------------------------------------------------------
;
;  ARGUMENTS:
;    A = Sensor number
;  RETURNS:
;    Scan value of sensor LSB in A and MSB in X
;  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 preserve their values across calls to fastcall16
;    functions.
;
 CSD2X_1_wReadSensor:
_CSD2X_1_wReadSensor:
   RAM_PROLOGUE RAM_USE_CLASS_3
   RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
   asl   A                                            ; Multiply by two since results are INTs
   mov   X,A
   CSD2X_1_DisableInt_M_L
   CSD2X_1_DisableInt_M_R
   mov   A,[X+(CSD2X_1_waSnsResult+LSB)]
   mov   X,[X+(CSD2X_1_waSnsResult+MSB)]
   CSD2X_1_EnableInt_M_L
   CSD2X_1_EnableInt_M_R
   RAM_EPILOGUE RAM_USE_CLASS_3
   ret
.ENDSECTION

.SECTION
;-----------------------------------------------------------------------------
;  FUNCTION NAME: CSD2X_1_SetLeftRefValue

;  DESCRIPTION:
;     Set Left Channel Reference Value
;-----------------------------------------------------------------------------
;  ARGUMENTS: A = Reference value 0...7

⌨️ 快捷键说明

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