Hallo,

ik wil een 2 x 40 lcd HD44780 aansturen met een atmega8.
ik programmeer met imagecraft.
Voorlopig ben ik nog aan het simuleren met ISIS van proteus.Maar ik wil de schakeling echt bouwen.
Ik krijg de display aangestuurd en krijg tekst op de lcd.
Maar het geheugen van de atmega8 zit al vol, en ik heb nog maar 2 woorden aangestuurd.
Ik ben nog maar pas aan het programmeren, dus ik weet dat ik nogal omslachtig aan het werk ben. Maar ik vind nergens informatie hoe ik het "simpeler" kan programmeren.
Kan iemand mij op weg helpen.
Er moet toch iets zijn van "printf LCD " hello world ".
waardoor ik meer tekst op de lcd krijgt en waardoor mijn geheugen van de atmega8 niet volledig opgebruikt wordt.

Alvast bedankt!

Hier mijn programma:


# include <iom8v.h>
# include <macros.h>
// microcontroller werkt op 1MHz
int a;
a = 1;
int i;
i = 0;
int b;
b = 0;
int c;
c = 1;
int d;
d = 1;
int tempT;
tempT = 0b00110001;
int tempE;
tempE = 0b00110111;

void port_init (void)
{
DDRD = 0xFF;	/* output */
DDRB = 0xFF;
PORTD = 0x00;	/* all off */
PORTB = 0x00;
}
	
void timer0_init (void)
{
 TCCR0 = 0x00;
 TCNT0 = 0x00;	 	   // FC =>tijd ingesteld op 4.1   ms, dit is de miniumale tijd dan men moet nemen om zeker te zijn dat display klaar is met verwerking
 TCCR0 = 0x03;		   // prescaler 1024
}
# pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
if ( c == 1)			 // dient om de clock te stoppen als men geen tekst mee wil schrijven op de lcd
{
  if ( a == 1 )
  {
  PORTB |= 0x04;//set pb2
  }
  if ( a == 0 )
  {
  PORTB &= ~0x04; //reset pb2
  }
}


a = a ^ 1;
TCNT0 = 0x00;	
}

void init_devices(void)
{
CLI();
port_init();
timer0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01;
SEI();
}

void main()
	{
	init_devices();
	while(1)
	{
if (d == 1)
{

///// routine "buitentemperatuur/boordspanning

if ( (i == 0)&&(a==1) )	 // enkel tijdens het hoog zijn van de E ( klok ) gaan we port d aanpassen
	{
	PORTD = 0b00000001;	   //clear display
	b = 1;				   	// setten van integer b
	}
		  if ( ( b == 1 )&&(a == 0 )) // als b is geset ( dus hebben data aangepast ) en a is 0, dus data is naar lcd geschreven
		  {	   	   	  		  	   	  // dan gaan we i verhogen en b terug resetten.
		  i = i + 1;
		  b = 0;
		  }
	
	
	if ( (i == 1)&&(a==1) )
	{
	PORTD = 0b00111000;	   //set interface lengt ( 8)(2 display line)(font)
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	
	
	if ( (i == 2)&&(a==1) )
	{
	//PORTD = 0b00011100;	   // shift display off
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	
	
	if ( (i == 3)&&(a==1)  )
	{
	PORTD = 0b00000110;	   //cursus move direction and shift screen on
	b = 1;
	}
		   if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	

	if ( (i == 4)&&(a==1) )
	{
	PORTD = 0b00001100;	   //enable display/cursus no blinking
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	
	
	if ( (i == 5)&&(a==1) )
	{
	PORTD = 0b10000001;	   // move cursur naar adres 1
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	
	
	if ((i == 6)&&(a==1)  )
	{
	PORTB = BIT(1);	   	   // setten PB1 => setten R/S hiemee kan er tekst geschreven worden op lcd, deze moet maar 1 maal geset worden
	PORTD = 0b01000010;	   //B
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	
	if ((i == 7)&&(a==1)  )
	{
	
	PORTD = 0b01110101;	   //u
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
		  
	if ((i == 8)&&(a==1)  )
	{
	
	PORTD = 0b01101001;	   //i
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  
		  }
		  
	if ((i == 9)&&(a==1)  )
	{
	
	PORTD = 0b01110100;	   //t
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
		  
	if ((i == 10)&&(a==1)  )
	{
	
	PORTD = 0b01100101;	   //e
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
		if ((i == 11)&&(a==1)  )
	{
	
	PORTD = 0b01101110;	   //n
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
		if ((i == 12)&&(a==1)  )
	{
	
	PORTD = 0b01110100;	   //t
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
		if ((i == 13)&&(a==1)  )
	{
	
	PORTD = 0b01100101;	   //e
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
		if ((i == 14)&&(a==1)  )
	{
	
	PORTD = 0b01101101;	   //m
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
		if ((i == 15)&&(a==1)  )
	{
	
	PORTD = 0b01110000;	   //p
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
		if ((i == 16)&&(a==1)  )
	{
	
	PORTD = 0b01100101;	   //e
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 17)&&(a==1)  )
	{
	
	PORTD = 0b01110010;	   //r
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 18)&&(a==1)  )
	{
	
	PORTD = 0b01100001;	   //a
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 19)&&(a==1)  )
	{
	
	PORTD = 0b01110100;	   //t
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 20)&&(a==1)  )
	{
	
	PORTD = 0b01110101;	   //u
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 21)&&(a==1)  )
	{
	
	PORTD = 0b01110101;	   //u
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
		  
	if ((i == 22)&&(a==1)  )
	{
	
	PORTD = 0b01110010;	   //r
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  } 
	
	if ((i == 23)&&(a==1)  )
	{
	
	PORTD = 0b00111010;	   //:
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  } 
	
	if ((i == 24)&&(a==1)  )
	{
	
	PORTD = 0b00100000;	   //spatie
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
///

if ( (i == 25)&&(a==1) )
	{
	PORTB ^= BIT(1);	   // flip pb1 => R/S wordt 0
	PORTD = 0b10010111;	   // move cursur naar adres
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }

	if ( (i == 26)&&(a==1) )
	{
	PORTB = BIT(1);	   	   // setten PB1 => setten R/S hiemee kan er tekst geschreven worden op 
	PORTD = tempT;	   // gemeten temperatuur tientallen
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }

	if ((i == 27)&&(a==1)  )
	{
	
	PORTD = tempE;	   //gemeten tempertuur eenheden
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }  
		

	if ( (i == 28)&&(a==1) )
	{
	PORTB ^= BIT(1);	   // flip pb1 => R/S wordt 0
	PORTD = 0b10011011;	   // move cursur naar adres
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
		  
	if ( (i == 29)&&(a==1) )
	{
	PORTB = BIT(1);	   	   // setten PB1 => setten R/S hiemee kan er tekst geschreven worden op 
	PORTD = 0b11011111;	   // °
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
		  
	if ( (i == 30)&&(a==1) )
	{
	PORTD = 0b01000011;	   // C
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
		  
	if ((i == 31)&&(a==1)  )
	{
	
	PORTD = 0b00100000;	   //spatie
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
///


	
	if ( (i == 32)&&(a==1) )
	{
	PORTB &= ~0x02; //reset pb2	   // flip pb1 => R/S wordt 0
	PORTD = 0b11000001;	   // move cursur naar adres
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	
	if ( (i == 33)&&(a==1) )
	{
	PORTB = BIT(1);	   	   // setten PB1 => setten R/S hiemee kan er tekst geschreven worden op 
	PORTD = 0b01000010;	   //B
	b = 1;
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  i = i + 1;
		  b = 0;
		  }
	
	if ((i == 34)&&(a==1)  )
	{
	
	PORTD = 0b01101111;	   //o
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 35)&&(a==1)  )
	{
	
	PORTD = 0b01101111;	   //o
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 36)&&(a==1)  )
	{
	
	PORTD = 0b01110010;	   //r
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	if ((i == 37)&&(a==1)  )
	{
	
	PORTD = 0b01100100;	   //d
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	

	if ((i == 38)&&(a==1)  )
	{
	
	PORTD = 0b01110011;	   //s
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	  
		  
	if ((i == 39)&&(a==1)  )
	{
	
	PORTD = 0b01110000;	   //p
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	  
		  
	if ((i == 40)&&(a==1)  )
	{
	
	PORTD = 0b01100001;	   //a
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	
		  
	if ((i == 41)&&(a==1)  )
	{
	
	PORTD = 0b01101110;	   //n
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	
	
	if ((i == 42)&&(a==1)  )
	{
	
	PORTD = 0b01101110;	   //n
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	
		  
	if ((i == 43)&&(a==1)  )
	{
	
	PORTD = 0b01101001;	   //i
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	
	
	if ((i == 44)&&(a==1)  )
	{
	
	PORTD = 0b01101110;	   //n
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	
		  
	if ((i == 45)&&(a==1)  )
	{
	
	PORTD = 0b01100111;	   //g
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }	
	if ((i == 46)&&(a==1)  )
	{
	
	PORTD = 0b00111010;	   //:
	b = 1;
	
	}
		  if ( (b == 1)&&(a == 0) )
		  {
		  
		  i = i +1;
		  b = 0;
		
		  }
	
	
	if ((i==47)&&(a==1))
	{
	//i = 11;
	c = 0;				// c = 0 stoppen van de e ( klok ) zodat er geen tekst meer geschreven wordt op de lcd
	
	}
///// einde routine buitentemperatuur/boordspanning 
	}
	
	}
	
	
	}

Toch maar even de FAQ lezen? ;)

[Bericht gewijzigd door Henry S. op ]

Je variabelen a,b,c noemen is zeker not done. Lees dat over een paar maanden terug en je snap er niets meer van, laat staan als een ander het leest. Het is zeker aan te raden een variabele een logische en beschrijvende naam te geven. Hoogstens is i (increment) nog gebruikelijk als teller in een korte loop.

De LCD library die ik zelf gebruik komt hier vandaan http://homepage.hispeed.ch/peterfleury/ Die is geschreven voor AVRGCC, maar vast wel te porten. En anders stap je toch over op AVRGCC. Ik vind het vreemd dat zo'n commerciele compiler niet eens een LCD library heeft. Die library past met gemak in een ATtiny2313, dus in een ATmega8 moet je een zee van ruimte overhouden.

Aan Chevyvan,

Zet eens CODE om je code, dan zijn die mannetjss weg, zo dus:

[Bericht gewijzigd door elektron_ op ]