avr: started working on xpt2046 module.

This commit is contained in:
Martin Preuss
2025-11-10 14:49:23 +01:00
parent e82c1cbe5c
commit 29f74c0eae
15 changed files with 1020 additions and 82 deletions

View File

@@ -4,6 +4,7 @@
<extradist>
defs.asm
dialog.asm
main.asm
style.asm
titlewindow.asm

View File

@@ -12,23 +12,21 @@
.equ WIN_OFFS_HANDLER_LO = 0 ; word address!
.equ WIN_OFFS_HANDLER_HI = 1
.equ WIN_OFFS_X_LO = 2
.equ WIN_OFFS_X_HI = 3
.equ WIN_OFFS_Y_LO = 4
.equ WIN_OFFS_Y_HI = 5
.equ WIN_OFFS_WIDTH_LO = 6
.equ WIN_OFFS_WIDTH_HI = 7
.equ WIN_OFFS_HEIGHT_LO = 8
.equ WIN_OFFS_HEIGHT_HI = 9
.equ WIN_OFFS_BG_COL_LO = 10
.equ WIN_OFFS_BG_COL_HI = 11
.equ WIN_OFFS_FG_COL_LO = 12
.equ WIN_OFFS_FG_COL_HI = 13
.equ WIN_OFFS_FONT_LO = 14 ;byte address!
.equ WIN_OFFS_FONT_HI = 15
.equ WIN_SIZE = 16
.equ WIN_OFFS_X_LO = 0
.equ WIN_OFFS_X_HI = 1
.equ WIN_OFFS_Y_LO = 2
.equ WIN_OFFS_Y_HI = 3
.equ WIN_OFFS_WIDTH_LO = 4
.equ WIN_OFFS_WIDTH_HI = 5
.equ WIN_OFFS_HEIGHT_LO = 6
.equ WIN_OFFS_HEIGHT_HI = 7
.equ WIN_OFFS_BG_COL_LO = 8
.equ WIN_OFFS_BG_COL_HI = 9
.equ WIN_OFFS_FG_COL_LO = 10
.equ WIN_OFFS_FG_COL_HI = 11
.equ WIN_OFFS_FONT_LO = 12 ;byte address!
.equ WIN_OFFS_FONT_HI = 13
.equ WIN_SIZE = 14

View File

@@ -0,0 +1,278 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQHOME_AVR_MODS_GUI_DIALOG_ASM
#define AQHOME_AVR_MODS_GUI_DIALOG_ASM
; ***************************************************************************
; defines
.equ DIALOG_MAX_ACTIVE = 8
.equ DIALOG_OFFS_HANDLER_LO = 0
.equ DIALOG_OFFS_HANDLER_HI = 1
.equ DIALOG_OFFS_OPTIONS = 2
.equ DIALOG_OFFS_COUNTER = 3
.equ DIALOG_SIZE = 4
.equ DIALOG_OPT_ACTIVE_BIT = 7
.equ DIALOG_FN_INIT = 0
.equ DIALOG_FN_FINI = 1
.equ DIALOG_FN_SHOW = 2
.equ DIALOG_FN_HIDE = 3
.equ DIALOG_FN_DRAW = 4
.equ DIALOG_FN_TOUCH = 5
.equ DIALOG_FN_TIMER = 6
; ***************************************************************************
; data
.dseg
dialogCurrent: .byte 2
dialogStack: .byte DIALOG_MAX_ACTIVE*2
dialogStackPos: .byte 1
dialogWindow: .byte WIN_SIZE
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine GraphApp_Init @global
;
DialogMgr_Init:
clr r16
sts dialogStackPos, r16
sts dialogCurrent, r16
sts dialogCurrent+1, r16
ldi yl, LOW(dialogWindow)
ldi yh, HIGH(dialogWindow)
bigcall TitleWindow_Init
ldi zl, LOW(ili9341Font12x20_1*2)
ldi zh, HIGH(ili9341Font12x20_1*2)
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
bigcall TitleWindow_SetFullSize
bigcall TitleWindow_SetStyleColors
bigcall Window_Clear
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_Every100ms @global
;
; Send timer event to every app in the stack (started with last added app).
DialogMgr_Every100ms:
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
lds r16, dialogStackPos
mov r17, r16
add r16, r16
add xl, r16
adc xh, r16
sub xh, r16
DialogMgr_Every100ms_loop:
tst r17
breq DialogMgr_Every100ms_ret
ld yh, -X
ld yl, -X
push xl
push xh
push r17
ldi r23, DIALOG_FN_TIMER
rcall DialogMgr_CallCurrentHandler
pop r17
pop xh
pop xl
dec r17
rjmp DialogMgr_Every100ms_loop
DialogMgr_Every100ms_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_CallHandler @global
;
; @param Y pointer to app data
; @param R23 number of function to call
; @clobbers R16, R17, R22, X (any)
DialogMgr_CallHandler:
ldi xl, LOW(dialogWindow)
ldi xh, HIGH(dialogWindow)
ldd r16, Y+DIALOG_OFFS_HANDLER_LO
ldd r17, Y+DIALOG_OFFS_HANDLER_HI
mov r22, r16
and r22, r17
breq DialogMgr_CallHandler_ret
push r16
push r17
DialogMgr_CallHandler_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_CallCurrentHandler @global
;
; @param X pointer to window
; @param R23 number of function to call
; @clobbers R22 (any)
DialogMgr_CallCurrentHandler:
lds yl, dialogCurrent
lds yh, dialogCurrent+1
rjmp DialogMgr_CallHandler
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_PushDialog @global
;
; @param Y pointer to app data
;
DialogMgr_PushDialog:
lds r16, dialogStackPos
cpi r16, DIALOG_MAX_ACTIVE
brcc DialogMgr_PushDialog_ret
tst r16
brne DialogMgr_PushDialog_push
; deactivate previous app
push yl
push yh
lds yl, dialogCurrent
lds yh, dialogCurrent+1
ldi r23, DIALOG_FN_HIDE
rcall DialogMgr_CallHandler
ldd r17, Y+DIALOG_OFFS_OPTIONS
cbr r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
pop yh
pop yl
DialogMgr_PushDialog_push:
lds r16, dialogStackPos
add r17, r17 ; *2
push xl
push xh
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
add xl, r17
adc xh, r17
sub xh, r17
st X+, yl
st X, yh
pop xh
pop xl
inc r16
sts dialogStackPos, r16
; activate new app
ldd r17, Y+DIALOG_OFFS_OPTIONS
ori r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
ldi r23, DIALOG_FN_SHOW
rcall DialogMgr_CallHandler
sec
DialogMgr_PushDialog_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_PopDialog @global
;
; @return CFLAG set if app popped from stack, cleared otherwise
; @return Y app popped from stack (if CFLAG set)
DialogMgr_PopDialog:
lds r16, dialogStackPos
tst r16
clc
brne DialogMgr_PopDialog_ret
; deactivate previous app
push yl
push yh
lds yl, dialogCurrent
lds yh, dialogCurrent+1
ldi r23, DIALOG_FN_HIDE
rcall DialogMgr_CallHandler
ldd r17, Y+DIALOG_OFFS_OPTIONS
cbr r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
pop yh
pop yl
lds r16, dialogStackPos
dec r16
sts dialogStackPos, r16
brne DialogMgr_PopDialog_pop
clr r16
sts dialogCurrent, r16
sts dialogCurrent+1, r16
sec
rjmp DialogMgr_PopDialog_ret
DialogMgr_PopDialog_pop:
push xl
push xh
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
add xl, r16
adc xh, r16
sub xh, r16
ld yl, X+
ld yh, X
sts dialogCurrent, yl
sts dialogCurrent+1, yh
pop xh
pop xl
; activate new active app
ldd r17, Y+DIALOG_OFFS_OPTIONS
ori r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
ldi r23, DIALOG_FN_SHOW
rcall DialogMgr_CallHandler
sec
DialogMgr_PopDialog_ret:
ret
; @end
#endif ; AQHOME_AVR_MODS_GUI_DIALOG_ASM

View File

@@ -15,7 +15,7 @@
.equ STYLE_WIN_TITLE_FOREGROUND = DISPLAY_COLOR_WHITE
.equ STYLE_WIN_BACKGROUND = DISPLAY_COLOR_LIGHTGREY
.equ STYLE_WIN_FOREGROUND = DISPLAY_COLOR_BLACK
.equ STYLE_WIN_FONT = ili9341Font12x20_1
.equ STYLE_WIN_TITLE_HEIGHT = 24

View File

@@ -30,16 +30,7 @@
; @param Y pointer to titledwindow data (size=TITLEWINDOW_SIZE)
TitleWindow_Init:
mov xl, yl
mov xh, yh
ldi r17, TITLEWINDOW_SIZE
clr r16
bigcall Utils_FillSram ; (R17, X)
ldi r16, LOW(TitleWindow_Handler)
std Y+(TITLEWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_LO), r16
ldi r16, HIGH(TitleWindow_Handler)
std Y+(TITLEWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_HI), r16
rcall Window_Init
ret
; @end
@@ -236,10 +227,5 @@ TitleWindow_Draw:
TitleWindow_Handler:
ret
#endif

View File

@@ -0,0 +1,156 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_GUI_TITLEWINDOW2_ASM
#define AQH_AVR_GUI_TITLEWINDOW2_ASM
.cseg
; ---------------------------------------------------------------------------
; @routine TitleWindow_Init @global
;
; @param Y pointer to titledwindow data (size=TITLEWINDOW_SIZE)
TitleWindow_Init:
bigcall Window_Init
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetFullSize @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_SetFullSize:
clr r16
std Y+WIN_OFFS_X_LO, r16
std Y+WIN_OFFS_X_HI, r16
std Y+WIN_OFFS_Y_LO, r16
std Y+WIN_OFFS_Y_HI, r16
ldi r16, LOW(DISPLAY_WIDTH)
std Y+WIN_OFFS_WIDTH_LO, r16
ldi r16, HIGH(DISPLAY_WIDTH)
std Y+WIN_OFFS_WIDTH_HI, r16
ldi r16, LOW(DISPLAY_HEIGHT)
std Y+WIN_OFFS_HEIGHT_LO, r16
ldi r16, HIGH(DISPLAY_HEIGHT)
std Y+WIN_OFFS_HEIGHT_HI, r16
ret
; @enb
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetStyleColors @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_SetStyleColors:
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_BACKGROUND)
std Y+WIN_OFFS_BG_COL_LO, r16
std Y+WIN_OFFS_BG_COL_HI, r17
ldi r16, LOW(STYLE_WIN_FOREGROUND)
ldi r17, HIGH(STYLE_WIN_FOREGROUND)
std Y+WIN_OFFS_FG_COL_LO, r16
std Y+WIN_OFFS_FG_COL_HI, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_DrawTitle @global
;
; @param Y pointer to screen object in SDRAM
; @param Z pointer to title
; @clobbers any, !Y
TitleWindow_DrawTitle:
; fill background of title area
clr r4
clr r5
clr r6
clr r7
ldd r8, Y+WIN_OFFS_WIDTH_LO
ldd r9, Y+WIN_OFFS_WIDTH_HI
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT)
mov r10, r16
mov r11, r17
ldi r16, LOW(STYLE_WIN_TITLE_BACKGROUND)
mov r2, r16
ldi r16, HIGH(STYLE_WIN_TITLE_BACKGROUND)
mov r3, r16
rcall Window_FillRect
; draw title
ldi r16, 5 ; X
mov r4, r16
clr r5
ldi r16, 2 ; Y
mov r6, r16
clr r7
ldi r16, LOW(STYLE_WIN_TITLE_BACKGROUND)
mov r0, r16
ldi r16, HIGH(STYLE_WIN_TITLE_BACKGROUND)
mov r1, r16
ldi r16, LOW(STYLE_WIN_TITLE_FOREGROUND)
mov r2, r16
ldi r16, HIGH(STYLE_WIN_TITLE_FOREGROUND)
mov r3, r16
bigcall Window_DrawColorTextFlash
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_ClearContentArea @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_ClearContentArea:
clr r4
clr r5
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
mov r6, r16
ldi r16, HIGH(STYLE_WIN_TITLE_HEIGHT)
mov r7, r16
ldd r8, Y+WIN_OFFS_WIDTH_LO
ldd r9, Y+WIN_OFFS_WIDTH_HI
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT)
ldd r10, Y+WIN_OFFS_HEIGHT_LO
ldd r11, Y+WIN_OFFS_HEIGHT_HI
sub r10, r16
sbc r11, r17
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldd r2, Y+WIN_OFFS_BG_COL_LO
ldd r3, Y+WIN_OFFS_BG_COL_HI
rcall Window_FillRect
ret
; @end
#endif

View File

@@ -11,6 +11,24 @@
#define AQH_AVR_GUI_WINDOW_ASM
; ---------------------------------------------------------------------------
; @routine Window_Init @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers R16, R17, X
Window_Init:
mov xl, yl
mov xh, yh
ldi r17, WIN_SIZE
clr r16
bigcall Utils_FillSram ; (R17, X)
ret
; @end
; ---------------------------------------------------------------------------
; @routine Window_Clear @global
;
@@ -34,6 +52,32 @@ Window_Clear:
; ---------------------------------------------------------------------------
; @routine Window_FillRect @global
;
; @param Y pointer to screen object in SDRAM
; @param r3:r2 color
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1/W
; @param r11:r10 Y1/H
; @clobbers any, !Y
Window_FillRect:
ldd r16, Y+WIN_OFFS_X_LO ; make absolute coords
ldd r17, Y+WIN_OFFS_X_HI
add r4, r16
adc r5, r17
ldd r16, Y+WIN_OFFS_Y_LO
ldd r17, Y+WIN_OFFS_Y_HI
add r6, r16
adc r7, r17
bigcall Display_FillRect ; directly call graphics function
ret
; @end
; ---------------------------------------------------------------------------
; @routine Window_DrawTextFlash @global
;
@@ -41,25 +85,43 @@ Window_Clear:
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @clobbers any, !Y, !R6, !R7
Window_DrawTextFlash:
rcall winCalcAbsPosAndBorders ; (R18, R19)
ldd r0, Y+WIN_OFFS_BG_COL_LO
ldd r1, Y+WIN_OFFS_BG_COL_HI
ldd r2, Y+WIN_OFFS_FG_COL_LO
ldd r3, Y+WIN_OFFS_FG_COL_HI
Window_DrawTextFlash_loop:
rjmp Window_DrawColorTextFlash
; @end
; ---------------------------------------------------------------------------
; @routine Window_DrawColorTextFlash @global
;
; @param Y pointer to screen object in SDRAM
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @clobbers any, !Y, !R6, !R7
Window_DrawColorTextFlash:
rcall winCalcAbsPosAndBorders ; (R18, R19)
Window_DrawColorTextFlash_loop:
lpm r16, Z
tst r16
breq Window_DrawTextFlash_loopEnd
breq Window_DrawColorTextFlash_loopEnd
rcall winDrawChar
brcc Window_DrawTextFlash_loopEnd
brcc Window_DrawColorTextFlash_loopEnd
adiw zh:zl, 1 ; next char
rjmp Window_DrawTextFlash_loop
Window_DrawTextFlash_loopEnd:
rjmp Window_DrawColorTextFlash_loop
Window_DrawColorTextFlash_loopEnd:
ret
; @end

View File

@@ -7,5 +7,378 @@
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_XPT2046_MAIN_ASM
#define AQH_AVR_XPT2046_MAIN_ASM
; ***************************************************************************
; defines
.equ XPT2046_SPIMODE = (1<<SPIHW_MODE_SPEED0_BIT) | \
(1<<SPIHW_MODE_SPEED1_BIT) | \
(0<<SPIHW_MODE_DOUBLESPEED_BIT) | \
(0<<SPIHW_MODE_DATAORDER_BIT) | \
(0<<SPIHW_MODE_CPOL_BIT) | \
(0<<SPIHW_MODE_CPHA_BIT)
.equ XPT2046_CMD_READ_X = 0xd1
.equ XPT2046_CMD_READ_Y = 0x91
.equ XPT2046_CMD_READ_Z1 = 0xb1
.equ XPT2046_CMD_READ_Z2 = 0xc1
.equ XPT2046_AVERAGE = 2
.equ XPT2046_Z_THRESHOLD = 500
.equ XPT2046_TIMER_VALUE = 3 ; every 300ms
.equ XPT2046_FLAGS_PRESSED_BIT = 7
.equ XPT2046_FLAGS_CHGCOORD_BIT = 6
.equ XPT2046_FLAGS_CHGPRESS_BIT = 5
; ***************************************************************************
; data
.dseg
xpt2046ValueBuffer: .byte (XPT2046_AVERAGE*2)
xpt2046CurrentX: .byte 2
xpt2046CurrentY: .byte 2
xpt2046CurrentZ: .byte 2
xpt2046Flags: .byte 1
xpt2046Timer: .byte 1
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine XPT2046_Init @global
XPT2046_Init:
clr r16
sts xpt2046CurrentX, r16
sts xpt2046CurrentX+1, r16
sts xpt2046CurrentY, r16
sts xpt2046CurrentY+1, r16
sts xpt2046CurrentZ, r16
sts xpt2046CurrentZ+1, r16
sts xpt2046Flags, r16
sts xpt2046Timer, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine XPT2046_Every100ms @global
XPT2046_Every100ms:
lds r16, xpt2046Timer
inc r16
cpi r16, XPT2046_TIMER_VALUE
brcs XPT2046_Every100ms_store
rcall xpt2046UpdateValues
clr r16
XPT2046_Every100ms_store:
sts xpt2046Timer, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine XPT2046_GetFlagsResetChg @global
;
; Return flags, clear stored flags XPT2046_FLAGS_CHGCOORD_BIT and
; XPT2046_FLAGS_CHGPRESS_BIT.
;
; @return r16 flags
; @clobbers r17
XPT2046_GetFlagsResetChg:
lds r16, xpt2046Flags
mov r17, r16
cbr r17, (1<<XPT2046_FLAGS_CHGCOORD_BIT) | (1<<XPT2046_FLAGS_CHGPRESS_BIT)
sts xpt2046Flags, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateValues
xpt2046UpdateValues:
push r15
in r15, SREG
cli
lds r23, xpt2046Flags
rcall xpt2046BeginSpi ; (R16, R17)
#if 0
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046SendCommandRecv12Bit ; (R16)
sts xpt2046CurrentX, r18
sts xpt2046CurrentX+1, r19
lds r24, xpt2046CurrentY
lds r25, xpt2046CurrentY+1
adiw r25:r24, 1
sts xpt2046CurrentY, r24
sts xpt2046CurrentY+1, r25
#else
rcall xpt2046UpdateX
rcall xpt2046UpdateY
rcall xpt2046UpdateZ
#endif
sts xpt2046Flags, r23
rcall xpt2046EndSpi ; (R16, R17)
out SREG, r15
pop r15
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateX
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
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
sub r16, r18
sbc r17, r19
breq xpt2046UpdateX_ret
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
xpt2046UpdateX_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateY
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
xpt2046UpdateY:
; 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:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateZ
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
xpt2046UpdateZ:
ldi r16, XPT2046_CMD_READ_Z1
rcall xpt2046SendCommandRecv12Bit ; (R16)
ldi r24, LOW(4095)
ldi r25, HIGH(4095)
add r24, r18
adc r25, r19
ldi r16, XPT2046_CMD_READ_Z2
rcall xpt2046SendCommandRecv12Bit ; (R16)
sub r24, r18
sbc r25, r19
sts xpt2046CurrentZ, r24
sts xpt2046CurrentZ+1, r25
ldi r16, LOW(XPT2046_Z_THRESHOLD)
ldi r17, HIGH(XPT2046_Z_THRESHOLD)
sub r24, r16
sbc r25, r17
mov r16, r23
brcs xpt2046UpdateZ_overThreshold
cbr r23, (1<<XPT2046_FLAGS_PRESSED_BIT) ; Z below threshold, not pressed
rjmp xpt2046UpdateZ_checkPressChg
xpt2046UpdateZ_overThreshold:
ori r23, (1<<XPT2046_FLAGS_PRESSED_BIT)
xpt2046UpdateZ_checkPressChg:
eor r16, r23
andi r16, (1<<XPT2046_FLAGS_PRESSED_BIT)
breq xpt2046UpdateZ_ret
ori r23, (1<<XPT2046_FLAGS_CHGPRESS_BIT)
xpt2046UpdateZ_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046AverageValues
;
; @return r19:r18 averaged value
; @clobbers r16, r17, r21
xpt2046AverageValues:
ldi xl, LOW(xpt2046ValueBuffer)
ldi xh, HIGH(xpt2046ValueBuffer)
ldi r21, XPT2046_AVERAGE
clr r18
clr r19
xpt2046AverageValues_loop:
ld r16, X+
ld r17, X+
add r18, r16
adc r19, r17
dec r21
brne xpt2046AverageValues_loop
.if (XPT2046_AVERAGE == 2)
lsr r19
ror r18
.elif (XPT2046_AVERAGE == 4)
lsr r19
ror r18
lsr r19
ror r18
.else
.error "XPT2046_AVERAGE is not 4"
.endif
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046ReadAvgValues
;
; @param r16 command
; @clobbers r16, r18, r19, r20, r21
xpt2046ReadAvgValues:
ldi xl, LOW(xpt2046ValueBuffer)
ldi xh, HIGH(xpt2046ValueBuffer)
mov r20, r16
ldi r21, XPT2046_AVERAGE
xpt2046ReadAvgValues_loop:
mov r16, r20
rcall xpt2046SendCommandRecv12Bit ; (R16)
st X+, r18
st X+, r19
dec r21
brne xpt2046ReadAvgValues_loop
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046BeginSpi
;
; @clobbers r16, r17
xpt2046BeginSpi:
ldi r16, XPT2046_SPIMODE
ldi r17, XPT2046_DEVICENUM
rjmp SPIHW_MasterStart ; (R17)
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046EndSpi
;
; @clobbers r16
xpt2046EndSpi:
rjmp SPIHW_MasterStop ; (R16)
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046SendCommandRecv12Bit
;
; @param r16 command
; @return r19:18 data
; @clobbers r16
xpt2046SendCommandRecv12Bit:
rcall xpt2046SendCommandRecv16Bit
lsr r19 ; >>1
ror r18
lsr r19 ; >>2
ror r18
lsr r19 ; >>3
ror r18
lsr r19 ; >>4
ror r18
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046SendCommandRecv16Bit
;
; @param r16 command
; @return r19:18 data
; @clobbers r16
xpt2046SendCommandRecv16Bit:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
rcall SPIHW_MasterTransfer ; (R16)
clr r16
rcall SPIHW_MasterTransfer ; (R16)
mov r19, r16
clr r16
rcall SPIHW_MasterTransfer ; (R16)
mov r18, r16
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
#endif ; AQH_AVR_XPT2046_MAIN_ASM