ili9341: moved io code into own file. changed args to r0-r11.

This commit is contained in:
Martin Preuss
2025-05-21 01:44:38 +02:00
parent b3d7d492d7
commit de94590fa0
3 changed files with 310 additions and 330 deletions

View File

@@ -155,6 +155,7 @@
#ifdef MODULES_ILI9341 #ifdef MODULES_ILI9341
.include "modules/lcd2/ili9341/defs.asm" .include "modules/lcd2/ili9341/defs.asm"
.include "modules/lcd2/ili9341/main.asm" .include "modules/lcd2/ili9341/main.asm"
.include "modules/lcd2/ili9341/io_spi.asm"
#endif #endif

View File

@@ -0,0 +1,112 @@
; ***************************************************************************
; 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. *
; ***************************************************************************
; generally we use the following parameters here:
; @param r1:r0 background color
; @param r3:r2 foreground color
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1/W
; @param r11:r10 Y1/H
; ***************************************************************************
; defines
.equ ILI9341_SPIMODE = (0<<SPIHW_MODE_SPEED0_BIT) | \
(0<<SPIHW_MODE_SPEED1_BIT) | \
(1<<SPIHW_MODE_DOUBLESPEED_BIT) | \
(0<<SPIHW_MODE_DATAORDER_BIT) | \
(0<<SPIHW_MODE_CPOL_BIT) | \
(0<<SPIHW_MODE_CPHA_BIT)
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine ILI9341IoInit @global
ILI9341IoInit:
; setup pins
sbi ILI9341_RESET_DDR, ILI9341_RESET_PIN ; RESET= output
sbi ILI9341_RESET_OUTPUT, ILI9341_RESET_PIN ; RESET= high
sbi ILI9341_DC_DDR, ILI9341_DC_PIN ; DC = output
sbi ILI9341_LED_DDR, ILI9341_LED_PIN ; LED = output
cbi ILI9341_LED_OUTPUT, ILI9341_LED_PIN ; LED = low
ret
; @end
; ---------------------------------------------------------------------------
; @routine ili9341BeginSpi
;
; @clobbers r16, r17
ili9341BeginSpi:
ldi r16, ILI9341_SPIMODE
ldi r17, ILI9341_DEVICENUM
rjmp SPIHW_MasterStart ; (R18)
; @end
; ---------------------------------------------------------------------------
; @routine ili9341EndSpi
;
; @clobbers r16
ili9341EndSpi:
rjmp SPIHW_MasterStop ; (R16)
; @end
ili9341SendCommand:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
cbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D low
nop
rcall SPIHW_MasterTransfer
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
ili9341SendData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
; @param r19:18 data
ili9341Send16BitData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
mov r16, r19
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end

View File

@@ -7,16 +7,13 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
; generally we use the following parameters here:
; *************************************************************************** ; @param r1:r0 background color
; defines ; @param r3:r2 foreground color
; @param r5:r4 X0
.equ ILI9341_SPIMODE = (0<<SPIHW_MODE_SPEED0_BIT) | \ ; @param r7:r6 Y0
(0<<SPIHW_MODE_SPEED1_BIT) | \ ; @param r9:r8 X1/W
(1<<SPIHW_MODE_DOUBLESPEED_BIT) | \ ; @param r11:r10 Y1/H
(0<<SPIHW_MODE_DATAORDER_BIT) | \
(0<<SPIHW_MODE_CPOL_BIT) | \
(0<<SPIHW_MODE_CPHA_BIT)
; *************************************************************************** ; ***************************************************************************
@@ -24,8 +21,6 @@
.dseg .dseg
ILI9341_foregroundColor: .byte 2
ILI9341_backgroundColor: .byte 2
ILI9341_buffer: .byte 128 ILI9341_buffer: .byte 128
@@ -40,12 +35,7 @@ ILI9341_buffer: .byte 128
; @routine ILI9341_Init @global ; @routine ILI9341_Init @global
ILI9341_Init: ILI9341_Init:
; setup pins rcall ILI9341IoInit
sbi ILI9341_RESET_DDR, ILI9341_RESET_PIN ; RESET= output
sbi ILI9341_RESET_OUTPUT, ILI9341_RESET_PIN ; RESET= high
sbi ILI9341_DC_DDR, ILI9341_DC_PIN ; DC = output
sbi ILI9341_LED_DDR, ILI9341_LED_PIN ; LED = output
cbi ILI9341_LED_OUTPUT, ILI9341_LED_PIN ; LED = low
rcall ILI9341_Reset rcall ILI9341_Reset
@@ -54,24 +44,33 @@ ILI9341_Init:
ldi r16, 0xff ldi r16, 0xff
rcall ILI9341_SetBacklight rcall ILI9341_SetBacklight
ldi r17, 0xff
ldi r16, 0xff ldi r16, 0xff
mov r3, r16
ldi r16, 0xff
mov r2, r16
rcall ili9341Test5 rcall ili9341Test5
; 0bRRRRRGGGGGGBBBBB ; 0bRRRRRGGGGGGBBBBB
ldi r17, 0b11111000 ; red
ldi r16, 0b11111000 ; red
mov r3, r16
ldi r16, 0b00000000 ; red ldi r16, 0b00000000 ; red
; rcall ILI9341_FillScreen mov r2, r16
rcall ili9341Test2 rcall ili9341Test2
; 0bRRRRRGGGGGGBBBBB ; 0bRRRRRGGGGGGBBBBB
ldi r17, 0b00000000 ldi r16, 0b00000000
mov r3, r16
ldi r16, 0b00011111 ; blue ldi r16, 0b00011111 ; blue
mov r2, r16
rcall ili9341Test3 rcall ili9341Test3
; 0bRRRRRGGGGGGBBBBB ; 0bRRRRRGGGGGGBBBBB
ldi r17, 0b00000111 ; green ldi r16, 0b00000111 ; green
mov r3, r16
ldi r16, 0b11100000 ; green ldi r16, 0b11100000 ; green
mov r2, r16
rcall ili9341Test4 rcall ili9341Test4
; set foreground color ; set foreground color
@@ -86,12 +85,16 @@ ILI9341_Init:
mov r1, r16 mov r1, r16
; set Xpos ; set Xpos
ldi r18, LOW(100) ldi r16, LOW(100)
ldi r19, LOW(100) mov r4, r16
ldi r16, HIGH(100)
mov r5, r16
; setYpos ; setYpos
ldi r20, LOW(150) ldi r16, LOW(150)
ldi r21, HIGH(150) mov r6, r16
ldi r16, HIGH(150)
mov r7, r16
; set font pos ; set font pos
ldi zl, LOW(font8x8*2) ldi zl, LOW(font8x8*2)
@@ -122,6 +125,41 @@ ILI9341_Fini:
; ---------------------------------------------------------------------------
; @routine ili9341_SendCommands
;
; @clobbers r16
; Z=byte pointer to command list (as for LPM)
ili9341SendCommands:
rcall ili9341BeginSpi
ili9341SendCommands_loop1:
lpm r16, Z+ ; read command
lpm r18, Z+ ; read number of args
cpi r18, 0xff ; end?
breq ili9341SendCommands_end
rcall ili9341SendCommand
mov r19, r18
andi r19, 1 ; if 1: need to skip filler byte
tst r18
breq ili9341SendCommands_loop1 ; no args, next command
ili9341SendCommands_loop2:
lpm r16, Z+
rcall ili9341SendData ; (R16)
dec r18
brne ili9341SendCommands_loop2
add zl, r19 ; possibly skip filler byte
adc zh, r19
sub zh, r19
rjmp ili9341SendCommands_loop1
ili9341SendCommands_end:
rcall ili9341EndSpi ; (R16)
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ILI9341_Reset @global ; @routine ILI9341_Reset @global
@@ -215,42 +253,7 @@ ILI9341_LeaveSleepMode:
; @param r17:r16 color ; @param r17:r16 color
ILI9341_FillScreen: ILI9341_FillScreen:
push r16 ; TODO
push r17
rcall ili9341BeginSpi ; (R16, R17)
clr r18
clr r19
clr r20
clr r21
ldi r22, LOW(ILI9341_DSP_WIDTH-1)
ldi r23, HIGH(ILI9341_DSP_WIDTH-1)
ldi r24, LOW(ILI9341_DSP_HEIGHT-1)
ldi r25, HIGH(ILI9341_DSP_HEIGHT-1)
rcall ili9341SetAddressWindow ; (R16)
pop r19 ; color high
pop r18 ; color low
; start RAM write
ldi r16, ILI9341_CMD_RAMWR
rcall ili9341SendCommand
ldi r24, LOW(ILI9341_DSP_HEIGHT-1)
ldi r25, HIGH(ILI9341_DSP_HEIGHT-1)
ILI9341_FillScreen_loopH:
push r24
push r25
ldi r24, LOW(ILI9341_DSP_WIDTH)
ldi r25, HIGH(ILI9341_DSP_WIDTH)
ILI9341_FillScreen_loopW:
rcall ili9341Send16BitData
sbiw r25:r24, 1
brne ILI9341_FillScreen_loopW
pop r25
pop r24
sbiw r25:r24, 1
brne ILI9341_FillScreen_loopH
rcall ili9341EndSpi
ret ret
; @end ; @end
@@ -258,57 +261,55 @@ ILI9341_FillScreen_loopW:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ILI9341_FillRect ; @routine ILI9341_FillRect
; @param r17:r16 color ; @param r3:r2 color
; @param r19:r18 X ; @param r5:r4 X0
; @param r21:r20 Y ; @param r7:r6 Y0
; @param r23:r22 W ; @param r9:r8 X1/W
; @param r25:r24 H ; @param r11:r10 Y1/H
ILI9341_FillRect: ILI9341_FillRect:
push r16 rcall ili9341BeginSpi ; (R16, R17)
push r17 push r8 ; W
rcall ili9341BeginSpi ; (R16, R17) push r9
ldi r16, 1 push r10
push r22 push r11
push r23 ldi r16, 1
push r24
push r25 sub r8, r16 ; X1=X+W-1
sub r22, r16 ; X1=X+W-1 sbc r9, r16
sbc r23, r16 add r9, r16
add r23, r16 add r8, r4
add r22, r18 adc r9, r5
adc r23, r19
sub r10, r16 ; Y1=Y+H-1
sub r24, r16 ; Y1=Y+H-1 sbc r11, r16
sbc r25, r16 add r11, r16
add r25, r16 add r10, r6
add r24, r20 adc r11, r7
adc r25, r21 rcall ili9341SetAddressWindow ; (R16)
rcall ili9341SetAddressWindow ; (R16) pop r11
pop r25 pop r10
pop r24 pop r9
pop r23 pop r8
pop r22
pop r19 ; color high (pop from r17)
pop r18 ; color low (pop from r16)
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (send data)
mov r18, r2 ; color
mov r19, r3
mov r22, r10 ; H low
mov r23, r11 ; H high
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand
ILI9341_FillRect_loopH: ILI9341_FillRect_loopH:
push r24 mov r24, r8 ; W low
push r25 mov r25, r9 ; W high
mov r24, r22 ; W low
mov r25, r23 ; W high
ILI9341_FillRect_loopW: ILI9341_FillRect_loopW:
mov r16, r19 ; color high rcall ili9341Send16BitData ; send r19:r18
rcall SPIHW_MasterTransfer ; (R16) sbiw r25:r24, 1
mov r16, r18 ; color high brne ILI9341_FillRect_loopW
rcall SPIHW_MasterTransfer ; (R16) mov r24, r22 ; H low
sbiw r25:r24, 1 mov r25, r23 ; H high
brne ILI9341_FillRect_loopW sbiw r25:r24, 1 ; dec
pop r25 mov r22, r24 ; save in r23:r22
pop r24 mov r23, r25
sbiw r25:r24, 1
brne ILI9341_FillRect_loopH brne ILI9341_FillRect_loopH
rcall ili9341EndSpi rcall ili9341EndSpi
ret ret
@@ -319,10 +320,10 @@ ILI9341_FillRect_loopW:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341SetAddressWindow ; @routine ili9341SetAddressWindow
; ;
; @param r19:r18 X0 ; @param r5:r4 X0
; @param r21:r20 Y0 ; @param r7:r6 Y0
; @param r23:r22 X1 ; @param r9:r8 X1
; @param r25:r24 Y1 ; @param r11:r10 Y1
; @clobbers R16 ; @clobbers R16
ili9341SetAddressWindow: ili9341SetAddressWindow:
@@ -330,28 +331,28 @@ ili9341SetAddressWindow:
ldi r16, ILI9341_CMD_CASET ldi r16, ILI9341_CMD_CASET
rcall ili9341SendCommand rcall ili9341SendCommand
; X0 ; X0
mov r16, r19 mov r16, r5
rcall ili9341SendData rcall ili9341SendData
mov r16, r18 mov r16, r4
rcall ili9341SendData rcall ili9341SendData
; X1 ; X1
mov r16, r23 mov r16, r9
rcall ili9341SendData rcall ili9341SendData
mov r16, r22 mov r16, r8
rcall ili9341SendData rcall ili9341SendData
; send row address ; send row address
ldi r16, ILI9341_CMD_PASET ldi r16, ILI9341_CMD_PASET
rcall ili9341SendCommand rcall ili9341SendCommand
; Y0 ; Y0
mov r16, r21 mov r16, r7
rcall ili9341SendData rcall ili9341SendData
mov r16, r20 mov r16, r6
rcall ili9341SendData rcall ili9341SendData
; Y1 ; Y1
mov r16, r25 mov r16, r11
rcall ili9341SendData rcall ili9341SendData
mov r16, r24 mov r16, r10
rcall ili9341SendData rcall ili9341SendData
ret ret
@@ -359,36 +360,18 @@ ili9341SetAddressWindow:
; ---------------------------------------------------------------------------
; @routine ili9341_WriteStringX1At
; @param R16 character to write
; @param r19:r18 X pos
; @param r21:r20 Y pos
; @param R01:R00 background color
; @param R03:R02 foreground color
; @param Z pointer to font
; @param Y pointer to RAM to store data to
; @clobbers
ili9341_WriteStringX1At:
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX1At ; @routine ili9341_WriteCharacterX1At
; @param R16 character to write ; @param R16 character to write
; @param r19:r18 X pos ; @param r5:r4 X
; @param r21:r20 Y pos ; @param r7:r6 Y
; @param R01:R00 background color ; @param r1:r0 background color
; @param R03:R02 foreground color ; @param r3:r2 foreground color
; @param X pointer to font ; @param Z pointer to font
; @param Y pointer to RAM to store data to ; @param X pointer to RAM to store data to
; @clobbers ; @return r5:r4 new X (advanced by character width)
; @clobbers r16, r17, r18, r19, r24, r25, x, z
ili9341_WriteCharacterX1At: ili9341_WriteCharacterX1At:
push xl push xl
@@ -399,20 +382,25 @@ ili9341_WriteCharacterX1At:
ldi r17, 7 ldi r17, 7
; calc X1 ; calc X1
mov r22, r18 mov r8, r4
mov r23, r19 mov r9, r5
add r22, r17 add r8, r17
adc r23, r17 adc r9, r17
sub r23, r17 sub r9, r17
; calc Y1 ; calc Y1
mov r24, r20 mov r10, r6
mov r25, r21 mov r11, r7
add r24, r17 add r10, r17
adc r25, r17 adc r11, r17
sub r25, r17 sub r11, r17
rcall ili9341BeginSpi ; (r16, r17) rcall ili9341BeginSpi ; (r16, r17)
rcall ili9341SetAddressWindow ; (R16) rcall ili9341SetAddressWindow ; (R16)
ldi r16, 8 ; increment X pos for next char
add r4, r16
adc r5, r16
sub r5, r16
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand rcall ili9341SendCommand
ldi r17, 64 ; 8x8 ldi r17, 64 ; 8x8
@@ -431,14 +419,14 @@ ili9341_WriteCharacterX1At_loop:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX2At ; @routine ili9341_WriteCharacterX2At
; @param R16 character to write ; @param R16 character to write
; @param r19:r18 X pos ; @param r5:r4 X
; @param r21:r20 Y pos ; @param r7:r6 Y
; @param R01:R00 background color ; @param r1:r0 background color
; @param R03:R02 foreground color ; @param r3:r2 foreground color
; @param X pointer to font ; @param Z pointer to font
; @param Y pointer to RAM to store data to ; @param X pointer to RAM to store data to
; @clobbers ; @clobbers r16, r17, r18, r19, r24, r25, x, z
ili9341_WriteCharacterX2At: ili9341_WriteCharacterX2At:
push xl push xl
@@ -449,20 +437,24 @@ ili9341_WriteCharacterX2At:
ldi r17, 15 ldi r17, 15
; calc X1 ; calc X1
mov r22, r18 mov r8, r4
mov r23, r19 mov r9, r5
add r22, r17 add r8, r17
adc r23, r17 adc r9, r17
sub r23, r17 sub r9, r17
; calc Y1 ; calc Y1
mov r24, r20 mov r10, r6
mov r25, r21 mov r11, r7
add r24, r17 add r10, r17
adc r25, r17 adc r11, r17
sub r25, r17 sub r11, r17
rcall ili9341BeginSpi ; (r16, r17) rcall ili9341BeginSpi ; (r16, r17)
rcall ili9341SetAddressWindow ; (R16) rcall ili9341SetAddressWindow ; (R16)
ldi r16, 16 ; increment X pos for next char
add r4, r16
adc r5, r16
sub r5, r16
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand rcall ili9341SendCommand
ldi r17, 0 ; 256 bytes ldi r17, 0 ; 256 bytes
@@ -481,11 +473,11 @@ ili9341_WriteCharacterX2At_loop:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341WriteCharacterFromFont8x8x1 ; @routine ili9341WriteCharacterFromFont8x8x1
; @param R16 character to write ; @param R16 character to write
; @param R01:R00 background color ; @param R1:R0 background color
; @param R03:R02 foreground color ; @param R3:R2 foreground color
; @param Z pointer to font ; @param Z pointer to font
; @param X pointer to RAM to store data to ; @param X pointer to RAM to store data to
; @clobbers r17, r24, r25, x, z ; @clobbers r17, r24, r25, x, z
ili9341WriteCharacterFromFont8x8x1: ili9341WriteCharacterFromFont8x8x1:
@@ -516,11 +508,11 @@ ili9341WriteCharacterFromFont8x8x1_loop2end:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341WriteCharacterFromFont8x8x2 ; @routine ili9341WriteCharacterFromFont8x8x2
; @param R16 character to write ; @param R16 character to write
; @param R01:R00 background color ; @param R1:R0 background color
; @param R03:R02 foreground color ; @param R3:R2 foreground color
; @param Z pointer to font ; @param Z pointer to font
; @param X pointer to RAM to store data to ; @param X pointer to RAM to store data to
; @clobbers r17, r22, r23, r24, r25, x, z ; @clobbers r17, r22, r23, r24, r25, x, z
ili9341WriteCharacterFromFont8x8x2: ili9341WriteCharacterFromFont8x8x2:
@@ -594,100 +586,6 @@ ili9341WriteCharacterFromFont8x8_gotPos:
ili9341SendCommand:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
cbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D low
nop
rcall SPIHW_MasterTransfer
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
ili9341SendData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
; @param r19:18 data
ili9341Send16BitData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
mov r16, r19
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
; ---------------------------------------------------------------------------
; @routine ili9341BeginSpi
;
; @clobbers r16, r17
ili9341BeginSpi:
ldi r16, ILI9341_SPIMODE
ldi r17, ILI9341_DEVICENUM
rjmp SPIHW_MasterStart ; (R18)
; @end
; ---------------------------------------------------------------------------
; @routine ili9341EndSpi
;
; @clobbers r16
ili9341EndSpi:
rjmp SPIHW_MasterStop ; (R16)
; @end
; ---------------------------------------------------------------------------
; @routine ili9341SendCommands
;
; @clobbers r16
; Z=byte pointer to command list (as for LPM)
ili9341SendCommands:
rcall ili9341BeginSpi
ili9341SendCommands_loop1:
lpm r16, Z+ ; read command
lpm r18, Z+ ; read number of args
cpi r18, 0xff ; end?
breq ili9341SendCommands_end
rcall ili9341SendCommand
mov r19, r18
andi r19, 1 ; if 1: need to skip filler byte
tst r18
breq ili9341SendCommands_loop1 ; no args, next command
ili9341SendCommands_loop2:
lpm r16, Z+
rcall ili9341SendData ; (R16)
dec r18
brne ili9341SendCommands_loop2
add zl, r19 ; possibly skip filler byte
adc zh, r19
sub zh, r19
rjmp ili9341SendCommands_loop1
ili9341SendCommands_end:
rcall ili9341EndSpi ; (R16)
ret
; @end
ili9341Test1: ili9341Test1:
rcall ili9341BeginSpi rcall ili9341BeginSpi
ldi r16, 0x04 ldi r16, 0x04
@@ -713,64 +611,33 @@ ili9341Test1:
; @param %2 W ; @param %2 W
; @param %3 H ; @param %3 H
.macro M_ILI9341_FILL_RECT .macro M_ILI9341_FILL_RECT
push r16 ldi r16, LOW(@0) ; X0
push r17 mov r4, r16
rcall ili9341BeginSpi ; (R16, R17) ldi r16, HIGH(@0)
ldi r18, LOW(@0) ; X0 mov r5, r16
ldi r19, HIGH(@0)
ldi r20, LOW(@1) ; Y0 ldi r16, LOW(@1) ; Y0
ldi r21, HIGH(@1) mov r6, r16
ldi r22, LOW(@0+@2-1) ; X1 ldi r16, HIGH(@1)
ldi r23, HIGH(@0+@2-1) mov r7, r16
ldi r24, LOW(@1+@3-1) ; y1
ldi r25, HIGH(@1+@3-1) ; y1 ldi r16, LOW(@2) ; W
rcall ili9341SetAddressWindow ; (R16) mov r8, r16
pop r19 ; color high ldi r16, HIGH(@2)
pop r18 ; color low mov r9, r16
; start RAM write ldi r16, LOW(@3) ; H
ldi r16, ILI9341_CMD_RAMWR mov r10, r16
rcall ili9341SendCommand ldi r16, HIGH(@3)
mov r11, r16
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low rcall ILI9341_FillRect
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
ldi r24, LOW(@3) ; height
ldi r25, HIGH(@3)
l_loopH_%:
push r24
push r25
ldi r24, LOW(@2) ; width
ldi r25, HIGH(@2)
l_loopW_%:
M_IO_WRITE SPDR, r19
rcall SPIHW_WaitForTransferComplete ; (R16)
M_IO_WRITE SPDR, r18
rcall SPIHW_WaitForTransferComplete ; (R16)
sbiw r25:r24, 1
brne l_loopW_%
pop r25
pop r24
sbiw r25:r24, 1
brne l_loopH_%
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
rcall ili9341EndSpi
.endmacro .endmacro
ili9341Test2: ili9341Test2:
M_ILI9341_FILL_RECT 10, 20, 70, 100 M_ILI9341_FILL_RECT 10, 20, 70, 100
ldi r18, LOW(10) ; X
ldi r19, HIGH(10)
ldi r20, LOW(20) ; Y
ldi r21, HIGH(20)
ldi r22, LOW(70) ; W
ldi r23, HIGH(70)
ldi r24, LOW(100) ; H
ldi r25, HIGH(100)
rjmp ILI9341_FillRect
ret ret