LCD: Completed, works now.

This commit is contained in:
Martin Preuss
2023-01-29 15:47:12 +01:00
parent 2f1a915390
commit ff8db6a210

View File

@@ -1,4 +1,22 @@
;
; - page 0 is top line, page 7 ist bottom line
; - column 0 is the leftmost colum, column 127 is the rightmost column
; - a page has a height of 8 (->8 bits)
; - when writing a byte to a position (e.g. page 0, column 0)
; - writing to chip RAM is done in columns
;
; Page 0: col 0 col 1 ... col 127
; Row 0(LSB) 0/0 1/0 ... 127/0
; Row 1 0/1 1/1 ... 127/1
; Row 2 0/2 1/2 ... 127/2
; Row 3 0/3 1/3 ... 127/3
; ...
; Row 7(MSB) 0/7 1/7 ... 127/7
; and so one
; ***************************************************************************
; defines
@@ -10,6 +28,11 @@
.equ LCD_WIDTH = 128
.equ LCD_HEIGHT = 64
.equ LCD_PAGE_COUNT = 8
.equ LCD_MULTIPLE = 2
.equ LCD_CMD_MODE = 0x00
.equ LCD_DATA_MODE = 0x40
; ***************************************************************************
@@ -36,12 +59,51 @@ LCD_Init:
ldi zl, LOW(lcdInitCommandsBegin)
ldi zh, HIGH(lcdInitCommandsBegin)
ldi r16, (lcdInitCommandsEnd-lcdInitCommandsBegin)*2
ldi r16, 8
rcall lcdWriteCommandsFromFlash
ldi r16, 0
rcall LCD_Fill
ldi r16, 255
rcall LCD_Fill
ldi r16, 0
rcall LCD_Fill
ldi r18, 0
ldi r19, 0
rcall LCD_SetCursor
ldi zl, LOW(lcdHelloMsg1)
ldi zh, HIGH(lcdHelloMsg1)
rcall LCD_PrintFromFlash
ldi r18, 0
ldi r19, 2
rcall LCD_SetCursor
ldi zl, LOW(lcdHelloMsg2)
ldi zh, HIGH(lcdHelloMsg2)
rcall LCD_PrintFromFlash
ldi r18, 0
ldi r19, 4
rcall LCD_SetCursor
ldi zl, LOW(lcdHelloMsg3)
ldi zh, HIGH(lcdHelloMsg3)
rcall LCD_PrintFromFlash
ldi r18, 10
ldi r19, 5
rcall LCD_SetCursor
ldi zl, LOW(lcdHelloMsg4)
ldi zh, HIGH(lcdHelloMsg4)
rcall LCD_PrintFromFlash
sec
ret
@@ -82,53 +144,87 @@ lcdWriteCommandsFromFlash_error:
; ---------------------------------------------------------------------------
; LCD_SetCursor
;
; Set cursor.
;
; IN:
; - R18: X
; - R19: Y
; OUT:
; - nothing
; REGS: r1, r2, r16 (R16, R17, R18, R22)
LCD_SetCursor:
mov r1, r18
mov r2, r19
rcall twiStart ; (R22)
ldi r16, (LCD_TWI_ADDRESS*2)
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
ldi r16, LCD_CMD_MODE
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
mov r16, r2
andi r16, 0x07
ori r16, 0xb0
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
mov r16, r1
andi r16, 0x0f
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
mov r16, r1
andi r16, 0xf0
swap r16
ori r16, 0x10
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_SetCursor_error
rcall twiStop ; (R22)
sec
ret
LCD_SetCursor_error:
rcall twiStop ; (R22)
clc
ret
; - R16: data to write
LCD_Fill:
mov r20, r16
rcall twiStart
ldi r16, (LCD_TWI_ADDRESS*2)
rcall twiSendByte
brcc LCD_Fill_error
tst r16
brne LCD_Fill_error
ldi r21, 0 ; Y
LCD_Fill_loopY:
ldi r16, 0xb0 ; set page address (data byte and next control byte follow, data byte is a command)
add r16, r21
rcall twiSendByte
clr r18
mov r19, r21
rcall LCD_SetCursor
brcc LCD_Fill_error
tst r16
brne LCD_Fill_error
ldi r16, 0x01 ; set lower column address
rcall twiSendByte
brcc LCD_Fill_error
tst r16
brne LCD_Fill_error
ldi r16, 0x10 ; set higher column bits
rcall twiSendByte
rcall twiStart
ldi r16, (LCD_TWI_ADDRESS*2)
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_Fill_error
ldi r16, LCD_DATA_MODE
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_Fill_error
tst r16
brne LCD_Fill_error
ldi r19, 0
LCD_Fill_loopX:
mov r16, r20
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
rcall twiSendByte
brcc LCD_Fill_error
tst r16
brne LCD_Fill_error
inc r19
cpi r19, LCD_WIDTH
brcs LCD_Fill_loopX
inc r21
cpi r21, 8
brcs LCD_Fill_loopY
rcall twiStop
inc r21
cpi r21, LCD_PAGE_COUNT
brcs LCD_Fill_loopY
sec
ret
LCD_Fill_error:
@@ -137,13 +233,258 @@ LCD_Fill_error:
ret
; ---------------------------------------------------------------------------
; LCD_PrintFromFlash
;
; Print a string from flash at the current position.
;
; IN:
; - Z: position of string to print
; OUT:
; - CFLAG: set if okay, cleared otherwise
; REGS:
LCD_PrintFromFlash:
lsl zl
rol zh
rcall twiStart
ldi r16, (LCD_TWI_ADDRESS*2)
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_PrintFromFlash_error
ldi r16, LCD_DATA_MODE
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_PrintFromFlash_error
LCD_PrintFromFlash_loop:
lpm r16, z+
tst r16
breq LCD_PrintFromFlash_end
push zh
push zl
rcall lcdPrintOneChar
pop zl
pop zh
brcc LCD_PrintFromFlash_error
rjmp LCD_PrintFromFlash_loop
LCD_PrintFromFlash_end:
rcall twiStop
sec
ret
LCD_PrintFromFlash_error:
rcall twiStop
clc
ret
; ---------------------------------------------------------------------------
; LCD_PrintChar
;
; Print a character at the current position.
;
; IN:
; - R16: char
; OUT:
; REGS: r16, r17, Z
LCD_PrintChar:
rcall twiStart
ldi r16, (LCD_TWI_ADDRESS*2)
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_PrintChar_error
ldi r16, LCD_DATA_MODE
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc LCD_PrintChar_error
rcall lcdPrintOneChar
brcc LCD_PrintChar_error
rcall twiStop
sec
ret
LCD_PrintChar_error:
rcall twiStop
clc
ret
; ---------------------------------------------------------------------------
; lcdPrintOneChar
;
; Print a character at the current position.
;
; IN:
; - R16: char
; OUT:
; REGS: r16, r17, Z
lcdPrintOneChar:
rcall lcdGetCharMatrix
ldi r16, 0 ; spacing between chars
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdPrintOneChar_error
ldi r19, 6
lcdPrintOneChar_loop:
lpm r16, z+
rcall twiSendByteExpectAck ; (R16, R17, R18, R22)
brcc lcdPrintOneChar_error
dec r19
brne lcdPrintOneChar_loop
sec
ret
lcdPrintOneChar_error:
clc
ret
; ---------------------------------------------------------------------------
; lcdGetCharMatrix
;
; Get pointer to matrix of given char.
;
; IN:
; - R16: char
; OUT:
; - Z: pos of character matrix (ready for LPM)
; REGS: r16, r17, Z
lcdGetCharMatrix:
cpi r16, 95+32
brcc lcdGetCharMatrix_l1
cpi r16, 32
brcc lcdGetCharMatrix_l2
lcdGetCharMatrix_l1:
ldi r16, 32
lcdGetCharMatrix_l2:
ldi r17, 32
sub r16, r17
mov zl, r16
clr zh
clr r17
lsl zl ; *2
rol zh
add zl, r16 ; *3
adc zh, r17
lsl zl ; *6
rol zh
ldi r16, LOW(lcdFont6x8*2)
ldi r17, HIGH(lcdFont6x8*2)
add zl, r16
adc zh, r17
ret
lcdInitCommandsBegin: ; 28 bytes
.db LCD_CMD_MODE, 0xa8, ((LCD_PAGE_COUNT*8)-1), 0x8d, 0x14, 0xaf, 0xa1, 0xc8
lcdInitCommandsEnd:
.db 0xae, 0x00, 0x10, 0x40, 0x81, 0xcf, 0xa1, 0xc8
.db 0xa6, 0xa8, 0x3f, 0xd3, 0x00, 0xd5, 0x80, 0xd9
.db 0xf1, 0xda, 0x12, 0xdb, 0x40, 0x20, 0x02, 0x8d
.db 0x14, 0xa4, 0xa6, 0xaf
lcdInitCommandsEnd:
lcdHelloMsg1: .db "ILD :-)", 0
;lcdHelloMsg2: .db "1234567890ABCDEFGH", 0, 0
lcdHelloMsg2: .db "ICH LIEBE DICH!", 0
lcdHelloMsg3: .db "abcdefghijklmnopqr", 0, 0
lcdHelloMsg4: .db "abcde", 0
lcdFont6x8:
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; 0
.db 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 ; ! 1
.db 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 ; " 2
.db 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 ; # 3
.db 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 ; $ 4
.db 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 ; % 5
.db 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 ; & 6
.db 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 ; ' 7
.db 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 ; ( 8
.db 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 ; ) 9
.db 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 ; * 10
.db 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 ; + 11
.db 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 ; , 12
.db 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 ; - 13
.db 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 ; . 14
.db 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 ; / 15
.db 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E ; 0 16
.db 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 ; 1 17
.db 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 ; 2 18
.db 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 ; 3 19
.db 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 ; 4 20
.db 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 ; 5 21
.db 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 ; 6 22
.db 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 ; 7 23
.db 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 ; 8 24
.db 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E ; 9 25
.db 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 ; : 26
.db 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 ; ; 27
.db 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 ; < 28
.db 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 ; = 29
.db 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 ; > 30
.db 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 ; ? 31
.db 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E ; @ 32
.db 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C ; A 33
.db 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 ; B 34
.db 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 ; C 35
.db 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C ; D 36
.db 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 ; E 37
.db 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 ; F 38
.db 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A ; G 39
.db 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F ; H 40
.db 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 ; I 41
.db 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 ; J 42
.db 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 ; K 43
.db 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 ; L 44
.db 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F ; M 45
.db 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F ; N 46
.db 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E ; O 47
.db 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 ; P 48
.db 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E ; Q 49
.db 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 ; R 50
.db 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 ; S 51
.db 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 ; T 52
.db 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F ; U 53
.db 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F ; V 54
.db 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F ; W 55
.db 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 ; X 56
.db 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 ; Y 57
.db 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 ; Z 58
.db 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 ; [ 59
.db 0x00, 0x02, 0x04, 0x08, 0x10, 0x20 ; \ 60
.db 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 ; ] 61
.db 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 ; ^ 62
.db 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 ; _ 63
.db 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 ; ' 64
.db 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 ; a 65
.db 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 ; b 66
.db 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 ; c 67
.db 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F ; d 68
.db 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 ; e 69
.db 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 ; f 70
.db 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C ; g 71
.db 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 ; h 72
.db 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 ; i 73
.db 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 ; j 74
.db 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 ; k 75
.db 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 ; l 76
.db 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 ; m 77
.db 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 ; n 78
.db 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 ; o 79
.db 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 ; p 80
.db 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC ; q 81
.db 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 ; r 82
.db 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 ; s 83
.db 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 ; t 84
.db 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C ; u 85
.db 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C ; v 86
.db 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C ; w 87
.db 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 ; x 88
.db 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C ; y 89
.db 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 ; z 90
.db 0x00, 0x08, 0x36, 0x41, 0x41, 0x00 ; { 91
.db 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00 ; | 92
.db 0x00, 0x00, 0x41, 0x41, 0x36, 0x08 ; } 93
.db 0x00, 0x08, 0x04, 0x08, 0x10, 0x08 ; ~ 94