xpt2046 now basically works.
This commit is contained in:
@@ -37,6 +37,11 @@
|
||||
.equ XPT2046_FLAGS_CHGCOORD_BIT = 6
|
||||
.equ XPT2046_FLAGS_CHGPRESS_BIT = 5
|
||||
|
||||
.equ XPT2046_CALIB_XLEFT = 0x0c0
|
||||
.equ XPT2046_CALIB_XRIGHT = 0x780
|
||||
|
||||
.equ XPT2046_CALIB_YTOP = 0x0c0
|
||||
.equ XPT2046_CALIB_YBOTTOM = 0x7a0
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
@@ -45,12 +50,19 @@
|
||||
.dseg
|
||||
|
||||
xpt2046ValueBuffer: .byte (XPT2046_AVERAGE*2)
|
||||
xpt2046RawX: .byte 2
|
||||
xpt2046RawY: .byte 2
|
||||
xpt2046CurrentX: .byte 2
|
||||
xpt2046CurrentY: .byte 2
|
||||
xpt2046CurrentZ: .byte 2
|
||||
xpt2046Flags: .byte 1
|
||||
xpt2046Timer: .byte 1
|
||||
|
||||
xpt2046LeftX: .byte 2
|
||||
xpt2046FactorX: .byte 2
|
||||
|
||||
xpt2046TopY: .byte 2
|
||||
xpt2046FactorY: .byte 2
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
@@ -76,6 +88,8 @@ XPT2046_Init:
|
||||
|
||||
sts xpt2046Timer, r16
|
||||
|
||||
rcall xpt2046CalcCalibration
|
||||
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -116,6 +130,95 @@ XPT2046_GetFlagsResetChg:
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046CalcCalibration
|
||||
;
|
||||
xpt2046CalcCalibration:
|
||||
; calibrate X (hardcoded for now)
|
||||
ldi r18, LOW(XPT2046_CALIB_XLEFT)
|
||||
ldi r19, HIGH(XPT2046_CALIB_XLEFT)
|
||||
ldi r20, LOW(XPT2046_CALIB_XRIGHT)
|
||||
ldi r21, HIGH(XPT2046_CALIB_XRIGHT)
|
||||
ldi r22, LOW(DISPLAY_HEIGHT)
|
||||
ldi r23, HIGH(DISPLAY_HEIGHT)
|
||||
rcall xpt2046CalcCalibX
|
||||
|
||||
; calibrate Y (hardcoded for now)
|
||||
ldi r18, LOW(XPT2046_CALIB_YTOP)
|
||||
ldi r19, HIGH(XPT2046_CALIB_YTOP)
|
||||
ldi r20, LOW(XPT2046_CALIB_YBOTTOM)
|
||||
ldi r21, HIGH(XPT2046_CALIB_YBOTTOM)
|
||||
ldi r22, LOW(DISPLAY_WIDTH)
|
||||
ldi r23, HIGH(DISPLAY_WIDTH)
|
||||
rcall xpt2046CalcCalibY
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046CalcCalibX
|
||||
;
|
||||
; @param r19:r18: xLeft
|
||||
; @param r21:r20 xRight
|
||||
; @param r23:r22 display hardware width
|
||||
|
||||
xpt2046CalcCalibX:
|
||||
sts xpt2046LeftX, r18
|
||||
sts xpt2046LeftX+1, r19
|
||||
|
||||
mov r24, r20
|
||||
mov r25, r21
|
||||
sub r24, r18
|
||||
sbc r25, r19
|
||||
lsl r24 ; *2
|
||||
rol r25
|
||||
lsl r24 ; *4
|
||||
rol r25
|
||||
lsl r24 ; *8
|
||||
rol r25
|
||||
mov r20, r24
|
||||
mov r21, r25
|
||||
bigcall Utils_Divu16_16_16 ; R17:R16=result
|
||||
sts xpt2046FactorX, r16
|
||||
sts xpt2046FactorX+1, r17
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046CalcCalibY
|
||||
;
|
||||
; @param r19:r18: yTop
|
||||
; @param r21:r20 yBottom
|
||||
; @param r23:r22 display hardware height
|
||||
|
||||
xpt2046CalcCalibY:
|
||||
sts xpt2046TopY, r18
|
||||
sts xpt2046TopY+1, r19
|
||||
|
||||
mov r24, r20
|
||||
mov r25, r21
|
||||
sub r24, r18
|
||||
sbc r25, r19
|
||||
lsl r24 ; *2
|
||||
rol r25
|
||||
lsl r24 ; *4
|
||||
rol r25
|
||||
lsl r24 ; *8
|
||||
rol r25
|
||||
mov r20, r24
|
||||
mov r21, r25
|
||||
bigcall Utils_Divu16_16_16 ; R17:R16=result
|
||||
sts xpt2046FactorY, r16
|
||||
sts xpt2046FactorY+1, r17
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046UpdateValues
|
||||
|
||||
@@ -127,33 +230,17 @@ xpt2046UpdateValues:
|
||||
lds r23, xpt2046Flags
|
||||
rcall xpt2046BeginSpi ; (R16, R17)
|
||||
|
||||
; rcall xpt2046UpdateZ
|
||||
rcall xpt2046UpdateZ
|
||||
|
||||
ldi r16, XPT2046_CMD_READ_Z1
|
||||
rcall xpt2046SendCommandRecv12Bit ; (R16)
|
||||
sts xpt2046CurrentZ, r18
|
||||
sts xpt2046CurrentZ+1, r19
|
||||
ldi r16, LOW(XPT2046_Z_THRESHOLD)
|
||||
ldi r17, HIGH(XPT2046_Z_THRESHOLD)
|
||||
sub r18, r16
|
||||
sbc r19, r17
|
||||
brcc xpt2046UpdateValues_aboveThreshold
|
||||
cbr r23, (1<<XPT2046_FLAGS_PRESSED_BIT) ; Z below threshold, not pressed
|
||||
rjmp xpt2046UpdateValues_checkPressChg
|
||||
xpt2046UpdateValues_aboveThreshold:
|
||||
ori r23, (1<<XPT2046_FLAGS_PRESSED_BIT)
|
||||
xpt2046UpdateValues_checkPressChg:
|
||||
eor r16, r23
|
||||
andi r16, (1<<XPT2046_FLAGS_PRESSED_BIT)
|
||||
breq xpt2046UpdateValues_checkPress
|
||||
ori r23, (1<<XPT2046_FLAGS_CHGPRESS_BIT)
|
||||
xpt2046UpdateValues_checkPress:
|
||||
mov r16, r23
|
||||
andi r16, (1<<XPT2046_FLAGS_PRESSED_BIT) ; only read coords if pressed
|
||||
breq xpt2046UpdateValues_storeFlags
|
||||
|
||||
rcall xpt2046UpdateX
|
||||
rcall xpt2046UpdateY
|
||||
rcall xpt2046UpdateRawX
|
||||
rcall xpt2046UpdateRawY
|
||||
|
||||
rcall xpt2046CalcX
|
||||
rcall xpt2046CalcY
|
||||
|
||||
xpt2046UpdateValues_storeFlags:
|
||||
sts xpt2046Flags, r23
|
||||
@@ -167,53 +254,123 @@ xpt2046UpdateValues_storeFlags:
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046UpdateX
|
||||
; @routine xpt2046CalcX
|
||||
;
|
||||
; @param r23 current xpt2046Flag (modified by routine)
|
||||
; @clobbers (r16, r18, r19, r20, r21)
|
||||
; @clobbers (r16, r17, r18, r19, r20, r21, r22)
|
||||
|
||||
xpt2046UpdateX:
|
||||
; dummy read
|
||||
ldi r16, XPT2046_CMD_READ_X
|
||||
rcall xpt2046SendCommandRecv12Bit ; (R16)
|
||||
|
||||
ldi r16, XPT2046_CMD_READ_X
|
||||
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
|
||||
rcall xpt2046AverageValues ; (r16, r17, r21)
|
||||
lds r16, xpt2046CurrentX
|
||||
lds r17, xpt2046CurrentX+1
|
||||
sts xpt2046CurrentX, r18
|
||||
sts xpt2046CurrentX+1, r19
|
||||
xpt2046CalcX:
|
||||
push r23
|
||||
lds r20, xpt2046RawY
|
||||
lds r21, xpt2046RawY+1
|
||||
lds r16, xpt2046TopY
|
||||
lds r17, xpt2046TopY+1
|
||||
sub r20, r16
|
||||
sbc r21, r17
|
||||
brcc xpt2046CalcX_trans
|
||||
clr r20
|
||||
clr r21
|
||||
xpt2046CalcX_trans:
|
||||
lsl r20 ; *2
|
||||
rol r21
|
||||
lsl r20 ; *4
|
||||
rol r21
|
||||
lsl r20 ; *8
|
||||
rol r21
|
||||
lds r22, xpt2046FactorY
|
||||
lds r23, xpt2046FactorY+1
|
||||
bigcall Utils_Divu16_16_16
|
||||
lds r18, xpt2046CurrentX
|
||||
lds r19, xpt2046CurrentX+1
|
||||
sts xpt2046CurrentX, r16
|
||||
sts xpt2046CurrentX+1, r17
|
||||
pop r23
|
||||
sub r16, r18
|
||||
sbc r17, r19
|
||||
breq xpt2046UpdateX_ret
|
||||
breq xpt2046CalcX_ret
|
||||
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
|
||||
xpt2046UpdateX_ret:
|
||||
xpt2046CalcX_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046UpdateY
|
||||
; @routine xpt2046CalcY
|
||||
;
|
||||
; @param r23 current xpt2046Flag (modified by routine)
|
||||
; @clobbers (r16, r17, r18, r19, r20, r21, r22)
|
||||
|
||||
xpt2046CalcY:
|
||||
push r23
|
||||
lds r20, xpt2046RawX
|
||||
lds r21, xpt2046RawX+1
|
||||
lds r16, xpt2046LeftX
|
||||
lds r17, xpt2046LeftX+1
|
||||
sub r20, r16
|
||||
sbc r21, r17
|
||||
brcc xpt2046CalcY_trans
|
||||
clr r20
|
||||
clr r21
|
||||
xpt2046CalcY_trans:
|
||||
lsl r20 ; *2
|
||||
rol r21
|
||||
lsl r20 ; *4
|
||||
rol r21
|
||||
lsl r20 ; *8
|
||||
rol r21
|
||||
lds r22, xpt2046FactorX
|
||||
lds r23, xpt2046FactorX+1
|
||||
bigcall Utils_Divu16_16_16
|
||||
lds r18, xpt2046CurrentY
|
||||
lds r19, xpt2046CurrentY+1
|
||||
sts xpt2046CurrentY, r16
|
||||
sts xpt2046CurrentY+1, r17
|
||||
pop r23
|
||||
sub r16, r18
|
||||
sbc r17, r19
|
||||
breq xpt2046CalcY_ret
|
||||
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
|
||||
xpt2046CalcY_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046UpdateRawX
|
||||
;
|
||||
; @clobbers (r16, r17, r18, r19, r20, r21)
|
||||
|
||||
xpt2046UpdateRawX:
|
||||
; dummy read
|
||||
ldi r16, XPT2046_CMD_READ_X
|
||||
rcall xpt2046SendCommandRecv12Bit ; (R16)
|
||||
|
||||
ldi r16, XPT2046_CMD_READ_X
|
||||
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
|
||||
rcall xpt2046AverageValues ; (r16, r17, r21)
|
||||
|
||||
sts xpt2046RawX, r18
|
||||
sts xpt2046RawX+1, r19
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine xpt2046UpdateRawY
|
||||
;
|
||||
; @param r23 current xpt2046Flag (modified by routine)
|
||||
; @clobbers (r16, r18, r19, r20, r21)
|
||||
|
||||
xpt2046UpdateY:
|
||||
xpt2046UpdateRawY:
|
||||
; read Y
|
||||
ldi r16, XPT2046_CMD_READ_Y
|
||||
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
|
||||
rcall xpt2046AverageValues ; (r16, r17, r21)
|
||||
lds r16, xpt2046CurrentY
|
||||
lds r17, xpt2046CurrentY+1
|
||||
sts xpt2046CurrentY, r18
|
||||
sts xpt2046CurrentY+1, r19
|
||||
sub r16, r18
|
||||
sbc r17, r19
|
||||
breq xpt2046UpdateY_ret
|
||||
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
|
||||
xpt2046UpdateY_ret:
|
||||
sts xpt2046RawY, r18
|
||||
sts xpt2046RawY+1, r19
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -236,10 +393,10 @@ xpt2046UpdateZ:
|
||||
sub r18, r16
|
||||
sbc r19, r17
|
||||
mov r16, r23
|
||||
brcs xpt2046UpdateZ_overThreshold
|
||||
brcc xpt2046UpdateZ_aboveThreshold
|
||||
cbr r23, (1<<XPT2046_FLAGS_PRESSED_BIT) ; Z below threshold, not pressed
|
||||
rjmp xpt2046UpdateZ_checkPressChg
|
||||
xpt2046UpdateZ_overThreshold:
|
||||
xpt2046UpdateZ_aboveThreshold:
|
||||
ori r23, (1<<XPT2046_FLAGS_PRESSED_BIT)
|
||||
xpt2046UpdateZ_checkPressChg:
|
||||
eor r16, r23
|
||||
|
||||
Reference in New Issue
Block a user