avr: improved lcd module.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user