LCD HD44780 - kan bara skriva på en rad?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

LCD HD44780 - kan bara skriva på en rad?

Inlägg av Bola »

Hej!

Jag kan skriva ut en text på rad ett sen när jag ska byta till rad två och skriva ut en text där så försvinner texten på rad ett.


I detta exemplet är tanken att B skall skrivas på rad ett och C på rad två. Tyvärr kommer bara C ut på rad två.

Kod: Markera allt

main		        call 	init		;Initiering PIC
			call	init_lcd	;Initiering LCD
			call	to_row_1	;byter rad till rad 1
			movlw	'B'	
			movwf	CHAR
			call	to_row_2	;byter rad till rad 2
			movlw	'C'	
			movwf	CHAR
			call	put_data
end_loop	        goto	end_loop


;Byter rad till rad 1			
to_row_1	        bcf		RS		;Anger att det är en instruktion
			movlw	0x80		;Adress till första platsen på 1:a raden
			movwf	CHAR
			call	put_data
			bsf		RS
			return	

;Byter rad till rad 2
to_row_2	        bcf		RS		;Anger att det är en instruktion
			movlw	0xC0		;Adress till första platsen på 2:a raden			
			movwf	CHAR
			call	put_data
			bsf		RS
			return	
nån som ser nått fel i sättet jag anger adress på?

Tog inte med subrutinen put_data men det den gör är att skicka data (det värde som ligger i CHAR) till LCD:n och ge Dataöverföringspuls.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av sodjan »

Koden verkar inte vara komplett.
Initiering av portar och processorn för övrigt t.ex.
Processormodell saknas. O.s.v.
Gör om , gör rätt...
Användarvisningsbild
swesysmgr
Inlägg: 14957
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av swesysmgr »

Man kan initialisera en tvåradersdisplay till att fungera som en enraders så jag tror som sodjan att det nog är i setupen det blivit fel.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av sodjan »

> ...så jag tror som sodjan att det nog är i setupen det blivit fel.

Nja, det vet jag inte. Det var i presentationen av problemet som det är fel... :-)
(Jag har dock en teori, men det är lite ointressant just nu...)
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av Bola »

Ja jag kom på detta. Men jag postar hela koden för jag är rätt säker på att jag initierat den som en 2-radersdisplay. den binära koden 00111000 borde ställa in detta.
"Function set 0 0 1 DL N F — —" där N=1 ger 2 lines mode om jag tolkat manualen rätt.

PIC16F690
Hela koden (databitarna läggs alltså ut med skiftregister):

Kod: Markera allt

;Pinnar (I/O)
;Skiftregistret:
;DATAS (databit till skiftregister)=RC0
;CLOCK (puls till skiftregister)=RC1
;CLEAR (nollställer skiftregistret vid 0:a)=RC2
;
;Display:
;RS(Instruktion=0 data=1 )=RC3
;E (dataöverföringspuls)=RC4


#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)


#define RS PORTC,3
#define E  PORTC,4
#define DATAS PORTC,0
#define CLOCK PORTC,1
#define CLEAR PORTC,2
#define Z0 STATUS, 2 ;Z-flagga

org		0x0000			;Resetar programminnet

cblock 0x20
	C1
	C2
	C3
	CHAR	;Bokstav/tecken
endc


main		        call 	init		;Initiering PIC
			call	init_lcd	;Initiering LCD
			call	cursor_on
			call	to_row_1	;byter rad till rad 1
			movlw	'B'	
			movwf	CHAR
			call	to_row_2	;byter rad till rad 2
			movlw	'C'	
			movwf	CHAR
			call	put_data
end_loop	        goto	end_loop

;Sätter på cursor
cursor_on	bcf		RS			;Anger att det är en instruktion
			movlw	b'00001111'
			movwf	CHAR
			call	put_data
			bsf		RS
			return	

;Byter rad till rad 1			
to_row_1	bcf		RS			;Anger att det är en instruktion
			movlw	0x80		;Adress till första platsen på 1:a raden
			movwf	CHAR
			call	put_data
			bsf		RS
			return	

;Byter rad till rad 2
to_row_2	bcf		RS			;Anger att det är en instruktion
			movlw	0xC0		;Adress till första platsen på 2:a raden			
			movwf	CHAR
			call	put_data
			bsf		RS
			return	
	

;Initierar lcd-display
init_lcd	         bcf		RS			;Anger att det är en instruktion
			movlw	b'00110000'
			movwf	CHAR
			call	put_data
			movlw	b'00110000'
			movwf	CHAR
			call	put_data
			movlw	b'00110000'
			movwf	CHAR
			call	put_data
			movlw	b'00111000'
			movwf	CHAR
			call	put_data
			movlw	b'00001100'
			movwf	CHAR
			call	put_data
			movlw	b'00000001'
			movwf	CHAR
			call	put_data
			movlw	b'00000110'
			movwf	CHAR
			call	put_data
			bsf		RS
			return

;Lägger ut data till displayen med puls
put_data	movf	CHAR, W
			andlw	b'00000001'
			call	shift_data
			call	shift_puls
			movf	CHAR, W
			andlw	b'00000010'
			call	shift_data
			call	shift_puls
			movf	CHAR, W
			andlw	b'00000100'
			call	shift_data
			call	shift_puls
			movf	CHAR, W
			andlw	b'00001000'
			call	shift_data
			call	shift_puls
			movf	CHAR, W
			andlw	b'00010000'
			call	shift_data
			call	shift_puls
			movf	CHAR, W
			andlw	b'00100000'
			call	shift_data
			call	shift_puls
			movf	CHAR, W
			andlw	b'01000000'
			call	shift_data
			call	shift_puls
			movf	CHAR, W
			andlw	b'10000000'
			call	shift_data
			call	shift_puls
			call	lcd_puls
			return

				
			

;Kollar om det är 1 eller 0:a som skall läggas ut vid nästa shift
shift_data	btfss	Z0
			bsf		DATAS
			btfsc	Z0
			bcf		DATAS
			return

;Puls för att lägga ut ny databit
shift_puls	bcf		CLOCK
			nop
			bsf		CLOCK
			nop		
			return


;Puls för att lägga ut tecken på lcd_displayen
lcd_puls	bsf		E
			movlw	0x08
			movwf	C1
			movlw	0x2F
			movwf	C2
			movlw	0x03
			movwf	C3
Delay_puls
			decfsz	C1, f
			goto	$+2
			decfsz	C2, f
			goto	$+2
			decfsz	C3, f
			goto	Delay_puls
			nop
			bcf		E
			return


;Initiering av PIC
init		bsf STATUS,RP0 		;Bank 1
			bcf STATUS,RP1 		;
			clrf TRISB			;Gör alla B pinnar till utgångar
			movlw	b'11100000'
			movwf TRISC		;RC7, 6 och 5 till ingångar resten utgångar
			bcf STATUS,RP0 		;Bank 2
			bsf STATUS,RP1 		;
			clrf ANSEL 			;digital I/O
			clrf ANSELH 		;digital I/O
			bcf STATUS,RP0 		;Bank 0
			bcf STATUS,RP1 		;
			clrf PORTC			;Nollstället C pinnar
			clrf PORTB			;Nollstället B pinnar
			bsf	CLEAR		;Sätter clera pinne på shiftregistret till 1 
			return			;Återgår
end
GOD JUL PÅ ER ALLA!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av sodjan »

OK, bra.
För att underlätta felsökningen och utesluta några skitfel, så
kan du börja med att byta alla "bcf/bsf status rp0/1" mot banksel.
Det är bättre än att vi ska dubbelkolla dina manuella bankbyten.

ANSELx är clearat, bra. Fel med det var min ursprungliga teori... :-)

Kommenterar i din init_lcd rutin vore väldigt bra, så att det framgår
vad som var din *avsikt* med de olika värderna.

En liten kosmetiskt sak. Detta:

Kod: Markera allt

;Puls för att lägga ut ny databit
shift_puls   bcf      CLOCK
         nop
         bsf      CLOCK
         nop      
         return
blir lättare att läsa om det skrivs:

Kod: Markera allt

;Puls för att lägga ut ny databit
shift_puls
         bcf      CLOCK
         nop
         bsf      CLOCK
         nop      
         return
Din 8-bit parr/Ser rutinen fungerar sannolikt, men man brukar använda
rotate och C flaggan i stället för Z. Det blir väldigt mycket kompaktare.

> Jag kan skriva ut en text på rad ett sen när jag ska byta till rad två och skriva ut en text där så försvinner texten på rad ett.

Och vad händer med texten på rad 2 ???
Eller försvinner texten på rad 1 direkt när du ger adress komandot ?
Din beskrivning är ganska otydlig här... :-)
Tips: Läs själv igenom det du skriver och fundera på om det är helt tydligt
*utan* att ha den extra kunskap som du så så klart sitter inne med.

> (databitarna läggs alltså ut med skiftregister)

Och den delen är du alltså bombsäker på ?
Blir texten på rad 1 (innan den försvinner) korrekt ?
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av Bola »

Klart och det är tydligen så att det behövs en hel del julledighet här....
Felet var att jag glömt anropa call put_data när jag skulle skriva ut tecknet på första raden då blir det inte mycket till tecken, att man ens kan missa en sån grej.

Nåväl jag får tacka för hjälpen! Har lärt mig vad banksel är för något och ändrat lite komsetik, inget ont utan att det kommer nått gott ur det!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av sodjan »

OK. Så det där med att "så försvinner texten på rad ett" stämde inte alls ?
Det fanns alltså aldrig någon text på rad ett över huvudtaget ?
Hur du tittat på att göra om testen med Z till en loop med en
rotate och test av C istället ? Det blir mycket kompaktare.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: LCD HD44780 - kan bara skriva på en rad?

Inlägg av Bola »

Nej det gjorde det inte, mybad, den kom aldrig upp. Gjorde om testen så som du sa med test av C och rotate, fungerade utmärkt och blev som du sa lite kompaktare, tack för tipset!
Skriv svar