avr: started working on xpt2046 module.
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
<extradist>
|
||||
defs.asm
|
||||
dialog.asm
|
||||
main.asm
|
||||
style.asm
|
||||
titlewindow.asm
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
278
avr/modules/lcd2/gui/dialog.asm
Normal file
278
avr/modules/lcd2/gui/dialog.asm
Normal 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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
156
avr/modules/lcd2/gui/titlewindow2.asm
Normal file
156
avr/modules/lcd2/gui/titlewindow2.asm
Normal 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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user