Simpel C kod för en vanlig HD44780

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

vet inte, vart kollar jag de?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Tja, det vet bara du :-)
Det är bara du just nu som kan se hur din kod ser ut.

Jag antar att en av dessa används i någon slags "init" rutin för att göra en "setup" av LCD interfacet...

Men, som sagt, det kan bara du se just nu...
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

#define LCD_FUNCTION_8BIT 4 /* DB4: set 8BIT mode (0->4BIT mode) */

det är rätt hoppas ja...

använder den inbyggda 4Mhz oscillatorn....

har inte rört XTAL så den står på 4000000 nu...
Användarvisningsbild
simon78
Inlägg: 1091
Blev medlem: 8 juni 2004, 11:05:51
Ort: Vinninga/Lidköping
Kontakt:

Inlägg av simon78 »

Prova att köra alla anslutningar på samma port. Det är det enda jag ändrat.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

det funkar ju lixom inte... det är ju 8portar i bussen... och i en port har jag 8 portarna, det funkar ju inte att sätta 11 ledare till 8 olika kontakter...
Användarvisningsbild
simon78
Inlägg: 1091
Blev medlem: 8 juni 2004, 11:05:51
Ort: Vinninga/Lidköping
Kontakt:

Inlägg av simon78 »

Oki. Det är problemet. Den koden stöder inte 8-bitars överföring. Koppla bara de fyra första databittarna, eller var det de fyra sista. Du får väl komma över å kolla hur jag har gjort.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Bara en liten not...

Det finns nästan *aldrig* någon anledning att kör en LCD i 8-bitars mod. All kod jag har kommit i kontakt med (inkl den jag har skrivit själv) har kört med 4 bitar...
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

hur ändrar jag de det då?

är det vissa av ledarna som man inte använder då eller är det en annan display med ett annat styrchipp som används då eller?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

HD44780 controllern stöder 8 eller 4 bitars interface. Det ställer man med ett kommando till LCDn. Om din kod redan stöder 4-bitar (vilket ju nämndes i ett tidigare inlägg), så är ju allt klart, bara att koppla in bit 4-7 och köra.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

men, om det nu vart rätt ändå, borde de inte kommit upp något ändå?

jagmenar, jag ändrar inte på något ju... jag tar bort fyra ledare men, de användes ju inte...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jo, det kan man kanske tycka, men det kan väll vara nästan vilket annat fel som helst... :-)
Nästan omöjligt att säga utan att ha prylarna framför sig.
Jag hoppar av tråden här...
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

kopplat om nu, och testat, först blev det inget, sen när jag stötte till den lite så blev de massor med konstiga tecken...

sen så stängde jag av, och skalade om kablarna satte i dom i kopplingsplinten igen, kålsvart..

aja, mätte lite, det verkade ganska bra...

det pendlade lite mellan 1 å 5v på bussen och på de andra va de 0 förutom E som va 5v..
Användarvisningsbild
simon78
Inlägg: 1091
Blev medlem: 8 juni 2004, 11:05:51
Ort: Vinninga/Lidköping
Kontakt:

Inlägg av simon78 »

Jag har mailat en bild till din msn-adress. Kolla om den gör dig något klokare.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

:S tydligen inte fått de:/

aja, om du får tid över kaske du skulle kunna skicka de till
limpan456@gmail.com :oops:

tack föresten :)
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

Jag har lite grejer som jag tror kan hjälpa dig virr3.

Det är 8 bitars dataöverföring, och jag hoppas det skall vara såpass enkelt så du hänger med.

Först och främst, för att inte du eller jag skall behöva ändra allt. Skriv in de här överst i din C-kod. Lite simpla alias för att göra resten av koden lite överskådligare. Vet inte om du behöver just checkbit men skitsamma, har saxat det här ur ett större program jag har.

Ändra i dessa alias lcd_data_port till den PORT som du använder, likaså vilken port du vill lägga dina 3 styrbitar på.(lcd_styrbit) Glöm inte heller att kolla så att RS, RW och E på får rätt siffra på lcd_styrbit porten.
Här har du en bra förklaring på lcd:ns stift om det skulle behövas.

http://www.avrbeginners.net/interfacing ... bit_1.html

Kod: Markera allt

#define setbit(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) 
#define clearbit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) 
#define checkbit(ADDRESS,BIT) (ADDRESS & (1<<BIT)) 

#define lcd_data_port PORTD
#define lcd_styrbit PORTB
#define RS 0
#define RW 1
#define E 2
Innan vi kör något annat så se även till att du har ställt in den 8-bitars datautgångens pinnar till utgångar och de 3 styrbitarnas pinnar till utgångar med.


Du skall först och främst initiera LCD:n innan du kan sända tecken till den.
Det ser ut så här när det är enkelt skrivet och kommenterat. Det som händer där är att vi i tur och ordning går igenom alla funktionsregistren för att ställa in LCD:n som vi vill ha den. Alla funktioner står beskrivna på den sidan jag länkade till.

Kod: Markera allt

void lcd_initiering(void)
{
	clearbit(lcd_styrbit, RS); // Aktiverar att vi skall skriva instruktioner till LCD.
	clearbit(lcd_styrbit, RW); // Aktiverar att vi skall skicka till LCD.
	setbit(lcd_styrbit, E); // Förbedered för att lägga data på porten.
	
	// REGISTER, GRUNDFUNKTIONER
	clearbit(lcd_data_port, 0); // Förflytta inte display i sidled.
	setbit(lcd_data_port, 1); // Förflytta cursor i sidled.
	setbit(lcd_data_port, 2); // Hög för att göra inställningar i detta register.
	clearbit(lcd_data_port, 3);// Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 4); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 5); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 6); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 7); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_styrbit, E); // Sänder data. E går låg för att LCD:n skall ta emot.
	delay_ms(5);
	setbit(lcd_styrbit, E); // Data sänt. E går hög igen.
	
	// REGISTER, DISPLAY
	setbit(lcd_data_port, 0); // Vill ha blinkande "svartbox" cursor.
	setbit(lcd_data_port, 1); // Aktivera cursor.
	setbit(lcd_data_port, 2); // Display PÅ.
	setbit(lcd_data_port, 3); // Hög för att göra inställningar i detta register.
	clearbit(lcd_data_port, 4); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 5); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 6); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 7); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_styrbit, E); // Sänder data. E går låg för att LCD:n skall ta emot.
	delay_ms(5);
	setbit(lcd_styrbit, E); // Data sänt. E går hög igen.

	// REGISTER, AVANCERADE FUNKTIONER
	clearbit(lcd_data_port, 0); // Används ej.
	clearbit(lcd_data_port, 1); // Används ej.
	clearbit(lcd_data_port, 2); // Fonten sätts till 5x7 pixlar.
	setbit(lcd_data_port, 3); // Anger att displayen är "mer än 1 rads display".
	setbit(lcd_data_port, 4); // Sätter 8 bitars dataläge.
	setbit(lcd_data_port, 5); // Hög för att göra inställningar i detta register.
	clearbit(lcd_data_port, 6); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_data_port, 7); // Hålls låg för att inte skriva i annat register.
	clearbit(lcd_styrbit, E); // Sänder data. E går låg för att LCD:n skall ta emot.
	delay_ms(5);
	setbit(lcd_styrbit, E); // Data sänt. E går hög igen.
}
Som du ser så ligger det en delay_ms(); ibland, det är en fördröjning i antal millisekunder som behövs på det stället i koden.
Jag kan ta med den med ifall.

Kod: Markera allt

void delay_ms(unsigned int x)
{
	unsigned int y=x;
	setbit(TCCR1B, CS10); // Starta Timer1, Prescaler 1024. CLK=3906kHz
	clearbit(TCCR1B, CS11);// Starta Timer1, Prescaler 1024. CLK=3906kHz
	setbit(TCCR1B, CS12); // Starta Timer1, Prescaler 1024. CLK=3906kHz
	
	while(y>0)
	{
		setbit(TIFR, TOV1); // Cleara overflowflagga.
		TCNT1=65531; // Laddar med värde för att få exakt en millisekund.
		while(!checkbit(TIFR, TOV1)) {} // Vänta på overflowflagga.
		y--;
	}	

	clearbit(TCCR1B, CS10); // Timer1 avstängd.
	clearbit(TCCR1B, CS11); // Timer1 avstängd.
	clearbit(TCCR1B, CS12); // Timer1 avstängd.	
}

Sen är det då dags att skicka ett tecken till LCD:n och det kan du göra på med denna funktion:

Kod: Markera allt

void lcd_skriv_ett_tecken(unsigned char ett_tecken)
{
	setbit(lcd_styrbit, RS); // Aktiverar att vi skall skriva till display på LCD.
	clearbit(lcd_styrbit, RW); // Aktiverar att vi skall skicka till LCD.
	setbit(lcd_styrbit, E); // Förbedered för att lägga data på porten.

	lcd_data_port=ett_tecken; // Data lagt på porten.
	clearbit(lcd_styrbit, E); // Sänder data. E går låg för att LCD:n skall ta emot.
	delay_ms(1);
	setbit(lcd_styrbit, E); // Data sänt. E går hög igen.
}
Som du anropar med lcd_skriv_ett_tecken('A');


Testa det där! Hoppas det hjälper dig på traven, men jag hjälper dig tyvärr inte nåt vidare nu med massa färdig kod. Men jaja! Man kan ju behöva en språngbräda ibland, Nu har du ju förhoppningsvis tid över och hinna lära dig nåt annat på AVR:en istället =)

Du får säga till om du tycker nåt verkar mongo i koden... Ha det!
Skriv svar