Har kopplat LCD:ns 8-bits data-buss till PORTB på AVR:en.
Problemet är att nu när jag kom på att jag ska driva AVR:en med kristall så ska kristallen kopplas in på PB6 och PB7. Då går det ju inte att använda PORTB som data-buss för LCD:n.
Jag är ju nybörjare och är inte helt klar på hur jag ska lösa detta:
Kan man på något sätt byta de två högsta bitarna i PORTB mot två andra bitar(pinnar), tex PC4 och PC5? Ja, jag antar ju att det går men jag kommer bara på riktigt krångliga sätt att lösa det på rent program-mässigt.
Kan jag kanske köra 4-wire? Detta har jag aldrig gjort förr och hela programmet som jag har nu är skrivet för 8-ledningsbuss. Därför känns även detta ganska krångligt att få till.
Har någon ett förslag?
Såhär ser mina sändningsrutiner ut nu, lite otydligt kanske, men det fungerar ju nu:
Kod: Markera allt
.MACRO PRINT_TEXT
ldi ZL, LOW(@0*2)
ldi ZH, HIGH(@0*2)
rcall Print_data
.ENDMACRO
.MACRO PRINT_LCD
ldi ZL, LOW(@0*2)
ldi ZH, HIGH(@0*2)
rcall Print_init
.ENDMACRO
.MACRO PRINT_SRAM
ldi ZL, LOW(@0)
ldi ZH, HIGH(@0)
ldi Sram_antal, @1
rcall Print_data_SRAM
.ENDMACRO
;===============================================================================================
; Subrutin Print_data
;===============================================================================================
Print_Data:
ldi temp, WRITE_DATA ;Sätt 3-ledningsbussen för sändning
out LCD_set, temp ;
Print_Next:
lpm ;Hämta tecken från PM (r0 <- @Z)
mov temp, LPMdata
out LCD_data,temp
cpi temp, EOL ;Om detta tecken är lika med EOL...
breq Print_Done ;...hoppa till "Print_Done...
rcall SEND ;...annars, sänd LCD_data till Displayen
adiw ZL, 1 ;Addera registerpar med direktdata (flyttar Z-pekare)
rjmp Print_Next ;Skicka nästa tecken
Print_Done:
ret ;EOL(End Off Line), Returnera
;===============================================================================================
; Subrutin Print_data_SRAM - Skriver ut från SRAM till LCD
;===============================================================================================
Print_data_SRAM:
ldi WriteCount, 0
ldi temp, WRITE_DATA ;Sätt 3-ledningsbussen för sändning
out LCD_set, temp ;
Print_Next_SRAM:
ld temp, Z+ ;Ladda temp och flytta pekare
ldi temp2, 48
add temp, temp2
out LCD_data,temp
cp WriteCount, Sram_antal
brsh Print_Done_SRAM ;...hoppa till "Print_Done...
rcall SEND ;...annars, sänd LCD_data till Displayen
inc WriteCount
rjmp Print_Next_SRAM ;Skicka nästa tecken
Print_Done_SRAM:
ret ;EOL(End Off Line), Returnera
;===============================================================================================
; Subrutin Print_init - Skriver ut konstanter till LCD
;===============================================================================================
Print_init:
lpm temp, Z+ ;GET WRITE INTR OR VOID
cpi temp,VOID ;VOID?
breq Print_init_done ;YES DONE
out LCD_SET, temp ;ELSE SETUP LCD_SET
lpm TEMP, Z+ ;GET DATA
out LCD_DATA, temp ;SETUP DATA
rcall SEND ;SEND IT
rjmp Print_init ;AGAIN
Print_init_done:
ret ;OK DONE
;--------------------------------------------------------
SEND:
sbi LCD_set, LCD_E
rcall Delay_Long
cbi LCD_set, LCD_E
ret