added ili9341_WriteCharacterAt.

This commit is contained in:
Martin Preuss
2025-05-20 23:36:31 +02:00
parent a0898b8327
commit d29147fe57

View File

@@ -24,6 +24,9 @@
.dseg
ILI9341_foregroundColor: .byte 2
ILI9341_backgroundColor: .byte 2
ILI9341_buffer: .byte 128
; ***************************************************************************
@@ -71,6 +74,39 @@ ILI9341_Init:
ldi r16, 0b11100000 ; green
rcall ili9341Test4
; set foreground color
ldi r16, 0b11100000 ; green
mov r2, r16
ldi r16, 0b00000111 ; green
mov r3, r16
; set background color
ldi r16, 0b11111111 ; white
mov r0, r16
mov r1, r16
; set Xpos
ldi r18, LOW(100)
ldi r19, LOW(100)
; setYpos
ldi r20, LOW(150)
ldi r21, HIGH(150)
; set font pos
ldi zl, LOW(font8x8*2)
ldi zh, HIGH(font8x8*2)
; set buffer pos
; ldi xl, LOW(ILI9341_buffer)
; ldi xh, HIGH(ILI9341_buffer)
ldi xl, LOW(0x260)
ldi xh, HIGH(0x260)
; set character
ldi r16, 65
rcall ili9341_WriteCharacterAt
sec
ret
@@ -325,6 +361,109 @@ ili9341SetAddressWindow:
; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterAt
; @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 X pointer to font
; @param Y pointer to RAM to store data to
; @clobbers
ili9341_WriteCharacterAt:
push xl
push xh
rcall ili9341WriteCharacterFromFont8x8 ; (r17, r24, r25, x, z)
pop xh
pop xl
ldi r17, 7
; calc X1
mov r22, r18
mov r23, r19
add r22, r17
adc r23, r17
sub r23, r17
; calc Y1
mov r24, r20
mov r25, r21
add r24, r17
adc r25, r17
sub r25, r17
rcall ili9341BeginSpi ; (r16, r17)
rcall ili9341SetAddressWindow ; (R16)
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand
ldi r17, 64 ; 8x8
ili9341_WriteCharacterAt_loop:
ld r18, X+
ld r19, X+
rcall ili9341Send16BitData
dec r17
brne ili9341_WriteCharacterAt_loop
rcall ili9341EndSpi
ret
; @end
; ---------------------------------------------------------------------------
; @routine ili9341WriteCharacterFromFont8x8
; @param R16 character to write
; @param R01:R00 background color
; @param R03:R02 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @clobbers r17, r24, r25, x, z
ili9341WriteCharacterFromFont8x8:
mov r24, r16
lpm r17, Z+ ; first char num
sub r24, r17
brcc ili9341WriteCharacterFromFont8x8_firstValueOkay
clr r24 ; use first char
adiw zh:zl, 1
rjmp ili9341WriteCharacterFromFont8x8_transform ; skip next test
ili9341WriteCharacterFromFont8x8_firstValueOkay:
lpm r17, Z+
cp r24, r17
brcc ili9341WriteCharacterFromFont8x8_transform ; use first char
ili9341WriteCharacterFromFont8x8_gotPos:
clr r25
lsl r24 ; R16x8
rol r25
lsl r24
rol r25
lsl r24
rol r25
add zl, r24
adc zh, r25
ili9341WriteCharacterFromFont8x8_transform:
ldi r25, 8 ; 8 bytes
ili9341WriteCharacterFromFont8x8_loop1:
ldi r24, 8 ; 8 bits
lpm r17, Z+
ili9341WriteCharacterFromFont8x8_loop2:
lsr r17
brcs ili9341WriteCharacterFromFont8x8_writeForeground
st X+, r0
st X+, r1
rjmp ili9341WriteCharacterFromFont8x8_loop2end
ili9341WriteCharacterFromFont8x8_writeForeground:
st X+, r2
st X+, r3
ili9341WriteCharacterFromFont8x8_loop2end:
dec r24
brne ili9341WriteCharacterFromFont8x8_loop2
dec r25
brne ili9341WriteCharacterFromFont8x8_loop1
ret
; @end
ili9341SendCommand:
@@ -353,9 +492,9 @@ 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
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18
rcall SPIHW_MasterTransfer
rcall SPIHW_MasterTransfer ; (R16)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
@@ -495,6 +634,15 @@ l_loopW_%:
ili9341Test2:
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