avr: work on simple GUI module to be used by node c02.
This commit is contained in:
@@ -7,75 +7,21 @@
|
||||
; * Please see toplevel file COPYING of that project for license details. *
|
||||
; ***************************************************************************
|
||||
|
||||
#ifndef AQH_AVR_ILI9341_GRAPHOPS_ASM
|
||||
#define AQH_AVR_ILI9341_GRAPHOPS_ASM
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine ili9341SetAddressWindow
|
||||
; @routine Display_FillRect @global
|
||||
;
|
||||
; @param r5:r4 X0
|
||||
; @param r7:r6 Y0
|
||||
; @param r9:r8 W
|
||||
; @param r11:r10 H
|
||||
; @clobbers R16, r20, r21
|
||||
|
||||
ili9341SetAddressWindow:
|
||||
; calc XEnd (=X+W-1)
|
||||
mov r20, r8
|
||||
mov r21, r9
|
||||
add r20, r4
|
||||
adc r21, r5
|
||||
subi r20, 1
|
||||
sbci r21, 0
|
||||
|
||||
; send column address
|
||||
ldi r16, ILI9341_CMD_CASET
|
||||
rcall ili9341SendCommand
|
||||
; X0
|
||||
mov r16, r5
|
||||
rcall ili9341SendData
|
||||
mov r16, r4
|
||||
rcall ili9341SendData
|
||||
; X1
|
||||
mov r16, r21
|
||||
rcall ili9341SendData
|
||||
mov r16, r20
|
||||
rcall ili9341SendData
|
||||
|
||||
; calc YEnd (=Y+H-1)
|
||||
mov r20, r10
|
||||
mov r21, r11
|
||||
add r20, r6
|
||||
adc r21, r7
|
||||
subi r20, 1
|
||||
sbci r21, 0
|
||||
|
||||
; send row address
|
||||
ldi r16, ILI9341_CMD_PASET
|
||||
rcall ili9341SendCommand
|
||||
; Y0
|
||||
mov r16, r7
|
||||
rcall ili9341SendData
|
||||
mov r16, r6
|
||||
rcall ili9341SendData
|
||||
; Y1
|
||||
mov r16, r21
|
||||
rcall ili9341SendData
|
||||
mov r16, r20
|
||||
rcall ili9341SendData
|
||||
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine ILI9341_FillRect
|
||||
; @param r3:r2 color
|
||||
; @param r5:r4 X0
|
||||
; @param r7:r6 Y0
|
||||
; @param r9:r8 X1/W
|
||||
; @param r11:r10 Y1/H
|
||||
|
||||
ILI9341_FillRect:
|
||||
Display_FillRect:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
@@ -87,28 +33,28 @@ ILI9341_FillRect:
|
||||
mov r19, r3
|
||||
mov r22, r10 ; H low
|
||||
mov r23, r11 ; H high
|
||||
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
|
||||
rcall ili9341SendCommand
|
||||
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
|
||||
rcall ili9341SendCommand ; (R16)
|
||||
|
||||
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
|
||||
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA)
|
||||
ILI9341_FillRect_loopH:
|
||||
Display_FillRect_loopH:
|
||||
mov r24, r8 ; W low
|
||||
mov r25, r9 ; W high
|
||||
ILI9341_FillRect_loopW:
|
||||
Display_FillRect_loopW:
|
||||
mov r16, r19
|
||||
rcall SPIHW_MasterTransfer
|
||||
rcall SPIHW_MasterTransfer ; (R16)
|
||||
mov r16, r18
|
||||
rcall SPIHW_MasterTransfer
|
||||
rcall SPIHW_MasterTransfer ; (R16)
|
||||
sbiw r25:r24, 1
|
||||
brne ILI9341_FillRect_loopW
|
||||
brne Display_FillRect_loopW
|
||||
mov r24, r22 ; H low
|
||||
mov r25, r23 ; H high
|
||||
sbiw r25:r24, 1 ; dec
|
||||
mov r22, r24 ; save in r23:r22
|
||||
mov r23, r25
|
||||
brne ILI9341_FillRect_loopH
|
||||
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
|
||||
brne Display_FillRect_loopH
|
||||
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
|
||||
rcall ili9341EndSpi
|
||||
out SREG, r15
|
||||
pop r15
|
||||
@@ -118,7 +64,62 @@ ILI9341_FillRect_loopW:
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine ili9341BitBlit
|
||||
; @routine Display_DrawChar @global
|
||||
|
||||
; @param R16 character to write
|
||||
; @param R1:R0 background color
|
||||
; @param R3:R2 foreground color
|
||||
; @param R5:R4 X (dest)
|
||||
; @param R7:R6 Y (dest)
|
||||
; @param Z pointer to font
|
||||
; @return R18 width of char written (in pixel)
|
||||
; @return R19 height of char written (in pixel)
|
||||
; @clobbers any, !Z
|
||||
|
||||
Display_DrawChar:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
|
||||
push zl
|
||||
push zh
|
||||
mov r22, r16 ; save char to R22
|
||||
adiw zh:zl, FONT_OFFS_WIDTH
|
||||
lpm r8, Z+ ; char width in pixels
|
||||
clr r9
|
||||
lpm r10, Z ; char height in pixels
|
||||
clr r11
|
||||
sbiw zh:zl, FONT_OFFS_WIDTH+1
|
||||
|
||||
rcall ili9341BeginSpi ; (r16, r17)
|
||||
rcall ili9341SetAddressWindow ; (R16, R20, R21)
|
||||
|
||||
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
|
||||
rcall ili9341SendCommand ; (R16)
|
||||
|
||||
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
|
||||
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA)
|
||||
|
||||
mov r16, r22 ; char to write
|
||||
rcall FONT_RenderChar ; (any)
|
||||
pop zh
|
||||
pop zl
|
||||
|
||||
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
|
||||
rcall ili9341EndSpi ; (R16)
|
||||
|
||||
out SREG, r15
|
||||
pop r15
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Display_BitBlit @global
|
||||
|
||||
; @param r5:r4 X (dest)
|
||||
; @param r7:r6 Y (dest)
|
||||
@@ -127,7 +128,7 @@ ILI9341_FillRect_loopW:
|
||||
; @param X source data pointer (RAM)
|
||||
; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21)
|
||||
|
||||
ili9341BitBlit:
|
||||
Display_BitBlit:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
@@ -138,30 +139,30 @@ ili9341BitBlit:
|
||||
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
|
||||
rcall ili9341SendCommand
|
||||
|
||||
mov r22, r10
|
||||
mov r22, r10 ; store remaining height
|
||||
mov r23, r11
|
||||
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
|
||||
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA)
|
||||
ili9341BitBlit_loopH:
|
||||
mov r24, r8
|
||||
Display_BitBlit_loopH:
|
||||
mov r24, r8 ; r25:r24=width in pixel
|
||||
mov r25, r9
|
||||
ili9341BitBlit_loopW:
|
||||
ld r18, X+
|
||||
Display_BitBlit_loopW:
|
||||
ld r18, X+ ; read color from X
|
||||
ld r19, X+
|
||||
mov r16, r19
|
||||
rcall SPIHW_MasterTransfer ; (R16)
|
||||
rcall SPIHW_MasterTransfer ; (R16)
|
||||
mov r16, r18
|
||||
rcall SPIHW_MasterTransfer ; (R16)
|
||||
rcall SPIHW_MasterTransfer ; (R16)
|
||||
sbiw r25:r24, 1
|
||||
brne ili9341BitBlit_loopW
|
||||
brne Display_BitBlit_loopW
|
||||
mov r24, r22
|
||||
mov r25, r23
|
||||
sbiw r25:r24, 1
|
||||
mov r22, r24
|
||||
mov r23, r25
|
||||
brne ili9341BitBlit_loopH
|
||||
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
|
||||
rcall ili9341EndSpi ; (R16)
|
||||
brne Display_BitBlit_loopH
|
||||
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
|
||||
rcall ili9341EndSpi ; (R16)
|
||||
out SREG, r15
|
||||
pop r15
|
||||
ret
|
||||
@@ -333,4 +334,67 @@ ili9341BitBlitStretchNWriteLine_loop2:
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine ili9341SetAddressWindow
|
||||
;
|
||||
; @param r5:r4 X0
|
||||
; @param r7:r6 Y0
|
||||
; @param r9:r8 W
|
||||
; @param r11:r10 H
|
||||
; @clobbers R16, r20, r21
|
||||
|
||||
ili9341SetAddressWindow:
|
||||
; calc XEnd (=X+W-1)
|
||||
mov r20, r8
|
||||
mov r21, r9
|
||||
add r20, r4
|
||||
adc r21, r5
|
||||
subi r20, 1
|
||||
sbci r21, 0
|
||||
|
||||
; send column address
|
||||
ldi r16, ILI9341_CMD_CASET
|
||||
rcall ili9341SendCommand ; (R16)
|
||||
; X0
|
||||
mov r16, r5
|
||||
rcall ili9341SendData ; (R16)
|
||||
mov r16, r4
|
||||
rcall ili9341SendData ; (R16)
|
||||
; X1
|
||||
mov r16, r21
|
||||
rcall ili9341SendData ; (R16)
|
||||
mov r16, r20
|
||||
rcall ili9341SendData ; (R16)
|
||||
|
||||
; calc YEnd (=Y+H-1)
|
||||
mov r20, r10
|
||||
mov r21, r11
|
||||
add r20, r6
|
||||
adc r21, r7
|
||||
subi r20, 1
|
||||
sbci r21, 0
|
||||
|
||||
; send row address
|
||||
ldi r16, ILI9341_CMD_PASET
|
||||
rcall ili9341SendCommand ; (R16)
|
||||
; Y0
|
||||
mov r16, r7
|
||||
rcall ili9341SendData ; (R16)
|
||||
mov r16, r6
|
||||
rcall ili9341SendData
|
||||
; Y1
|
||||
mov r16, r21
|
||||
rcall ili9341SendData ; (R16)
|
||||
mov r16, r20
|
||||
rcall ili9341SendData ; (R16)
|
||||
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif ; AQH_AVR_ILI9341_GRAPHOPS_ASM
|
||||
|
||||
|
||||
Reference in New Issue
Block a user