avr: improved lcd module.

This commit is contained in:
Martin Preuss
2024-09-10 02:56:12 +02:00
parent fd43a89bcd
commit 743b33664f

View File

@@ -77,7 +77,7 @@ LCD_BEGIN:
LCD_Init:
ldi zl, LOW(lcdInitCommandsBegin)
ldi zh, HIGH(lcdInitCommandsBegin)
ldi r16, 8
ldi r16, 28
rcall lcdWriteCommandsFromFlash
ldi r16, 0
@@ -89,7 +89,7 @@ LCD_Init:
ldi r16, 0
rcall LCD_Fill
ldi r18, 20
ldi r18, 0
ldi r19, 0
rcall LCD_SetCursor
@@ -100,7 +100,7 @@ LCD_Init:
; set cursor to next line here, sometimes this doesn't work correctly
; when called later. TODO: find out what goes wrong here...
ldi r18, 0
ldi r19, 2
ldi r19, 0
rcall LCD_SetCursor
sec
@@ -123,6 +123,127 @@ LCD_Fini:
; ---------------------------------------------------------------------------
; @routine LCD_Sleep @global
;
; @return nothing
; @param r16 1=sleep, 0=awake
; @clobbers r15, r16, r19 (R17, R18, R22)
;
LCD_Sleep:
ldi r16, 0xae ; set sleep
tst r19
brne LCD_Sleep_send
ldi r16, 0xaf ; set wake
LCD_Sleep_send:
rjmp lcdOneByteCommand
; @end
; ---------------------------------------------------------------------------
; @routine lcdOneByteCommand
; Send a one byte command
;
; @return nothing
; @param r20 first byte of command
; @clobbers r15, r16, r19 (R17, R18, R22)
;
lcdOneByteCommand:
in r15, SREG
push r15
cli
rcall lcdBeginMultiCommand
brcc lcdOneByteCommand_error
mov r16, r20
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdOneByteCommand_error
rcall twiStop ; (R22)
pop r15
out SREG, r15
sec
ret
lcdOneByteCommand_error:
rjmp lcdTwiStopPopR15ClcRet ; (R22)
; @end
; ---------------------------------------------------------------------------
; @routine lcdTwoByteCommand
; Send a two byte command
;
; @return nothing
; @param r20 first byte of command
; @param r21 second byte of command
; @clobbers r15, r16, r19 (R17, R18, R22)
;
lcdTwoByteCommand:
in r15, SREG
push r15
cli
rcall lcdBeginMultiCommand
brcc lcdTwoByteCommand_error
mov r16, r20
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdTwoByteCommand_error
mov r16, r21
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdTwoByteCommand_error
rcall twiStop ; (R22)
pop r15
out SREG, r15
sec
ret
lcdTwoByteCommand_error:
rjmp lcdTwiStopPopR15ClcRet ; (R22)
; @end
; ---------------------------------------------------------------------------
; @routine lcdBeginMultiCommand
; Send a two byte command
;
; @return nothing
; @param r20 first byte of command
; @param r21 second byte of command
; @clobbers r16, (R17, R18, R22)
;
lcdBeginMultiCommand:
rcall twiStart ; (R22)
ldi r16, (LCD_TWI_ADDRESS*2)
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdTwoByteCommand_error
ldi r16, LCD_MODE_MULTICMD
rjmp twiSendByteExpectAck ; (R16, R17, R18, R22)
; @end
lcdTwiStopPopR15ClcRet:
rcall twiStop ; (R22)
pop r15
out SREG, r15
clc
ret
; ---------------------------------------------------------------------------
; LCD_SetCursor
;
@@ -150,33 +271,31 @@ LCD_SetCursor:
ldi r16, LCD_MODE_MULTICMD
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
mov r16, r2
mov r16, r2 ; Y
andi r16, 0x07
ori r16, 0xb0 ; Set Page Start Address for Page Addressing Mode
ori r16, 0xb0 ; set page start address for page addressing mode
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
mov r16, r1
andi r16, 0x0f ; Set Lower Column Start Address
ldi r16, 0x21 ; set column start
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
mov r16, r1
swap r16
andi r16, 0x0f
ori r16, 0x10 ; Set Higher Column Start Address
mov r16, r1 ; X
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
ldi r16, LCD_WIDTH-1
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
rcall twiStop ; (R22)
pop r15
out SREG, r15
sec
ret
LCD_SetCursor_error:
rcall twiStop ; (R22)
pop r15
out SREG, r15
clc
ret
rjmp lcdTwiStopPopR15ClcRet ; (R22)
@@ -208,19 +327,19 @@ LCD_Fill_loopY:
ldi r16, (LCD_TWI_ADDRESS*2)
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_Fill_error
ldi r16, LCD_MODE_DATA
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_Fill_error
ldi r19, 0
ldi r19, LCD_WIDTH ; count backwards to save one instruction
LCD_Fill_loopX:
mov r16, r20
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
rcall twiSendByte
brcc LCD_Fill_error
inc r19
cpi r19, LCD_WIDTH
brcs LCD_Fill_loopX
dec r19
brne LCD_Fill_loopX
rcall twiStop
inc r21
cpi r21, LCD_PAGE_COUNT
@@ -230,11 +349,7 @@ LCD_Fill_loopX:
sec
ret
LCD_Fill_error:
rcall twiStop
pop r15
out SREG, r15
clc
ret
rjmp lcdTwiStopPopR15ClcRet ; (R22)
@@ -282,11 +397,7 @@ LCD_PrintFromFlash_end:
ret
LCD_PrintFromFlash_error:
rcall twiStop
pop r15
out SREG, r15
clc
ret
rjmp lcdTwiStopPopR15ClcRet ; (R22)
@@ -320,11 +431,7 @@ LCD_PrintChar:
sec
ret
LCD_PrintChar_error:
rcall twiStop
pop r15
out SREG, r15
clc
ret
rjmp lcdTwiStopPopR15ClcRet ; (R22)
@@ -359,11 +466,7 @@ LCD_PrintHexByte:
sec
ret
LCD_PrintHexByte_error:
rcall twiStop
pop r15
out SREG, r15
clc
ret
rjmp lcdTwiStopPopR15ClcRet ; (R22)
@@ -514,6 +617,10 @@ lcdWriteCommandsFromFlash:
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdWriteCommandsFromFlash_error
ldi r16,LCD_MODE_MULTICMD
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdWriteCommandsFromFlash_error
lcdWriteCommandsFromFlash_loop:
lpm r16, z+
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
@@ -649,7 +756,11 @@ lcdUpcase_done:
; TODO: set adressing mode??
lcdInitCommandsBegin: ; 28 bytes
.db LCD_MODE_MULTICMD, 0xa8, ((LCD_PAGE_COUNT*8)-1), 0x8d, 0x14, 0xaf, 0xa1, 0xc8
; .db LCD_MODE_MULTICMD, 0xa8, ((LCD_PAGE_COUNT*8)-1), 0x8d, 0x14, 0xaf, 0xa1, 0xc8
.db 0xae, 0x20, 0x00, 0xb0, 0xc8, 0x00, 0x10, 0x40
.db 0x81, 0x3f, 0xa1, 0xa6, 0xa8, LCD_HEIGHT-1, 0xa4, 0xd3
.db 0x00, 0xd5, 0xf0, 0xd9, 0x22, 0xda, 0x12, 0xdb
.db 0x20, 0x8d, 0x14, 0xaf
lcdInitCommandsEnd:
lcdHelloMsg: .db "AqHOME 2024", 0