diff --git a/avr/modules/lcd2/ili9341/main.asm b/avr/modules/lcd2/ili9341/main.asm index 8f04ab3..364d826 100644 --- a/avr/modules/lcd2/ili9341/main.asm +++ b/avr/modules/lcd2/ili9341/main.asm @@ -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