Řízení LCD 40x4

jova
Příspěvky: 340
Registrován: 16 pro 2013, 11:40

Řízení LCD 40x4

Příspěvek od jova » 13 pro 2019, 22:04

Zdravím. Už pár dní si lámu hlavu s tím, jak řídit LCD 4x40 znaků. Jedná se o LCD která má první dva řádky řízené povelem na E1, další E2 viz obrázek.
40x4_154.jpg
Rád bych i nadále používal zapojení využívající pro ovládání LCD obvod PICAXE 20M2 (20X2) a data tam posíla sériovou linkou. Za tím to spolehlivě funguje na všech LCD až do 4x20 znaků, které mají jen jeden vstup na povel enable.
Kód pro odeslání dat:

Kód: Vybrat vše

;08m2
symbol baud=N4800
Pause 1000
serout C.1, baud, (254,1)   ;smaže LCD
start:
serout C.1, baud, (254,128)   ;souřadnice první řádek, první pozice
serout C.1, baud, ("abcdefghijklm")
goto start
Původní kód pro obvod řídící LCD 4x20 znaků:

Kód: Vybrat vše

;20M2 LCD 

symbol baud = N4800_32	
symbol RX	= C.0	
symbol enable 	= C.2	
symbol rs 	= C.1	

init:
	gosub LCD_init 		
main:
	serin RX,baud,b1
		if b1 < 253 then
		high rs
		pinsB = b1 	
		pulsout enable,1 
		goto main		
	else if b1 = 254 then	
		low rs 
	     	serin RX,baud,b1	
		pinsB = b1 
		pulsout enable,1 
		goto main							
	end if		
			
LCD_init:
	dirsC = %10111110	
	dirsB = %11111111	
	pause 15 		
	pinsB = %00110000      
	pulsout enable,1  
	pause 5 		
	pulsout enable,1 	 
	pulsout enable,1  	
	setfreq m32			
	pinsB = %00111000 	
	pulsout enable,1
	pinsB = %00000001	
	pulsout enable,1 	
	pause 8			
	pinsB = %00000010 
	pulsout enable,1
	pinsB = %00000110		
	pulsout enable,1 	
	pause 1			
	pinsB = %00001100	
	pulsout enable,1
	pause 1
	return
	
Původní zapojení procesoru na řízení LCD 4x20 zhnaků
LCD série.jpg
Zapojení funguje i na mém LCD, pokud připojím E1 a E2 na pin C.2, vypíše stejné znaky na první a třetí řádek. Jak ale upravit ten program, aby to vypisovalo na všechny 4 řádky jsem zatím nepřišel :cry:
Zatím se mi podařilo inicializovat všechny řádky a předpokládám, že se musí rozdělit ty dva signál enable např, takto:

Kód: Vybrat vše

;20M2 LCD 
symbol baud = N4800_32	
symbol RX	= C.0	
symbol enable 	= C.2	
symbol enable2 = C.3	
symbol rs 	= C.1	
...			
LCD_init:
	dirsC = %10111110	
	dirsB = %11111111	
	pause 15 		
	pinsB = %00110000      
	pulsout enable,1
	pulsout enable2,1  
	pause 5 		
	pulsout enable,1 	
	pulsout enable2,1  
	pulsout enable,1  	
	pulsout enable2,1 
	setfreq m32			
	pinsB = %00111000 	
	pulsout enable,1
	pulsout enable2,1 
	pinsB = %00000001	
	pulsout enable,1
	pulsout enable2,1  	
	pause 8			
	pinsB = %00000010 
	pulsout enable,1
	pulsout enable2,1 
	pinsB = %00000110		
	pulsout enable,1
	pulsout enable2,1  	
	pause 1			
	pinsB = %00001100	
	pulsout enable,1
	pulsout enable2,1 
	pause 1
	return
	
Více se mi bohužel nepodařilo.
Stránky, z kterých jsem vycházel: http://electromag1.wifeo.com/fabriquer- ... icaxe-.php
Za každou radu dík.

DavidO
Příspěvky: 927
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO » 13 pro 2019, 22:52

Při inicializaci tikej oběma a pak při psaní tomu, co je pro první dva řádky, tikej přes enable a tomu, co pro druhé dva řádky, enable2.

jova
Příspěvky: 340
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova » 13 pro 2019, 23:11

Mohl by jsi mi to prosím tě trochu rozvést nejlépe ukázkou v programech, co myslíš tím tikáním?
Měl jsem za to, že tu inicializaci mám správně, viz ten poslední kód.

DavidO
Příspěvky: 927
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO » 13 pro 2019, 23:43

moje "tikej" znamená pulsout něco,1
Ber to jako dva nezávislé displeje, které jsou ale připojené na stejné datové dráty a liší se jen tím, že mají oddělené svoje "enable" piny, a pomocí toho jestli řekneš jednomu nebo druhému, že se má na ty data podívat. Když chceš něco poslat prvnímu, dáš data co chceš na porty B a C jak je potřeba a tikneš prvnímu, tj. pulsout enable,1. Když chceš něco poslat druhému, tak dáš zase na stejné B a C a tikneš druhému, tj. pulsout enable2,1
Inicializace vypadá baj voko v pořádku, potřebuješ s oběma udělat tu samou sekvenci, a když máš data na správných pinech, tak pak oběma řekneš, ať se na ně podívají, to vypadá v pořádku (nekontroluju detaily ale jestli se ti pak vypisuje na horní i dolní půlku, no tak to se ti zinicializovat povedlo, takže OK). No a když už jsou oba inicializovaný, tak pro psaní na displej si rozhodni, jestli chceš psát někam do prvních dvou nebo druhých dvou řádků a podle toho tikneš na enable nebo enable2.

DavidO
Příspěvky: 927
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO » 13 pro 2019, 23:53

Jo a nezapomeń, že oba o tom druhém neví, takže si myslí, že prostě mají svoji paměť s adresama od nuly, dva řádky, na první dávají to, co je na adresách od 0 a na druhý od adresy 0x40 (40 hexa = 64 desítkově). Takže pro psaní na začátek prvního řádku nastavíš kurzor na adresu 0 (a tikneš prvnímu), vystavíš data (a tikneš prvnímu). Na druhý řádek kurzor na adresu 0x40 (a tikneš prvnímu), data (a tikneš prvnímu). Pro psaní na třetí řádek nastavíš kurzor na adresu 0 a tikneš druhému, pak data a tikneš druhému. Na čtvrtý řádek nastavíš adresu na 0x40 a tikneš druhému a pak data a tikneš druhému.

jova
Příspěvky: 340
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova » 14 pro 2019, 00:00

Tak tohle všechno se tu už 2dny snažím zrealizovat. Principiálně je mi to jasný, ale nodokáži to nacpat do toho programu co mi LCD obsluhuje. Zkoušel jsem to tam posílat dvěma různýma příkazama inicializace (254,128) "něco1" a (253,128) "něco2", aby si to pak program jak ty píšeš "roztikal", ale nějak se v tom ztrácím a vypisuje mi to pořád nesmysly. Buď se text z obou příkazů spojí a zobrazí na prvním řádku "něco1+něco2" a na třetím "něco2+něco1", nebo to vypisuje jen jeden řádek...
Ty adresy jsou mi jasný, mám problém upravit ten původní program tak, aby to dokázal podle těch inicializací rozeznat.

DavidO
Příspěvky: 927
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO » 14 pro 2019, 00:33

Musíš si poslat něco, podle čeho poznáš v tom druhým picaxe, na který řádek chceš psát. Nebo na kterou půlku. Třeba si pro každé posílání pošli ještě jako parametr tohle rozlišení, a pak na přijímací straně serin přečte první znak, podle něj se rozhodne o horní/dolní půlce a pak přečte jeden nebo dva jako dosud.

jova
Příspěvky: 340
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova » 14 pro 2019, 00:40

To "něco" bylo v tomhle případě právě těch 253, 254 a stejně jsem to nerozchodil.
Dík za rady, pro dnešek už končím.

DavidO
Příspěvky: 927
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO » 14 pro 2019, 01:13

Tím sis ale rozhodnul jen mezi písmenem k zobrazení a řídícím příkazem, ne mezi částmi displeje.

Tak si to udělej třeba jako přepínač. Přijde 254 -> od teď všechno na první půlku. Přijde 255 -> odteď všechno na druhou půlku. A pak podle toho co si pamatuješ, použiješ enable nebo enable2.
(rozhodnutí příkaz/písmeno ale i nadále musíš zachovat, akorát třeba nebudeš posílat 254 ale 253 a testy patřičně upravíš)

jova
Příspěvky: 340
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova » 14 pro 2019, 09:34

Tak jsem to zřejmě vyřešil.
Doplnil jsem tam proměnnou b0 a ta podle toho, zda přijme 253, nebo 254 rozhoduje, který enable výstup se sepne.

Kód: Vybrat vše

main:
	serin RX,baud,b1
	
	if b1 < 253 then
		pinsB = b1 	
		if b0=0 then pulsout enable,1 else if b0=1 then pulsout enable2,1	end if		 
		goto main		
		
	else if b1 = 253 then
		b0=0	
		low rs 
	     	serin RX,baud,b1	
		pinsB = b1 
		pulsout enable,1
		high rs 
		goto main					
				
	else if b1 = 254 then
		b0=1	
		low rs 
	     	serin RX,baud,b1	
		pinsB = b1 
		pulsout enable2,1
		high rs 
		goto main
	end if		
Dík za rady.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host