Ik heb een probleempje bij het weergeven van tekst op mijn HD44780 LCD (met ATmega8). Afzonderlijke karakters lukt wel, maar wanneer ik


char words[] = "foo";
lcd_string(words);

probeer, dan krijg ik blokjes en andere vreemde karakters. Het volgende lukt trouwens wel:


char words[] = {'f', 'o', 'o', '\0'};
lcd_string(words);

Na wat googlen krijg ik de indruk dat het iets te maken heeft met RAM versus flash geheugen, maar ik heb nog geen concrete oplossing gevonden.


#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h> 

#define RS	4
#define E	5

void sbi(mask){
	PORTC |= (1 << mask);
}

void cbi(mask){
	PORTC &= ~(1 << mask);
}

void e_toggle(){
	sbi(E);
	_delay_us(1);
	cbi(E);
}

void lcd_cmd(unsigned char letter){
	PORTC = (letter >> 4);
	cbi(RS);
	e_toggle();
	PORTC = letter;
	cbi(RS);
	e_toggle();
	_delay_ms(1);
}

void lcd_char(char letter){
	PORTC = (letter >> 4);
	sbi(RS);	
	e_toggle();
	PORTC = letter;
	sbi(RS);	
	e_toggle();
	_delay_ms(1);
}

void lcd_init(){
	cbi(RS);
	PORTC = 0x03;
	e_toggle();
	_delay_ms(50);
	PORTC = 0x03;
	e_toggle();
	_delay_ms(50);
	PORTC = 0x03;
	e_toggle();
	_delay_ms(50);
	PORTC = 0x02;
	e_toggle();
	_delay_ms(50);
	lcd_cmd(0x28);       // 4-bit mode - 2 line - 5x7 font.
	lcd_cmd(0x0D);       // Display no cursor - no blink.
	lcd_cmd(0x06);       // Automatic Increment - No Display shift.
	lcd_cmd(0x01);		
}

void lcd_line1(){
	lcd_cmd(0x80);
}

void lcd_line2(){
	lcd_cmd(0xc0);
}

void lcd_string(char *senpoint)
{
	while(*senpoint != '\0'){
		lcd_char(*senpoint);
		senpoint++;
	}
}	

int main(void){
	DDRC = 0xff;
	_delay_ms(50);
	cbi(E);
	lcd_init();
	lcd_line1();

	//char words[] = {'f', 'o', 'o', '\0'};
	
	char words[] = "foo";
	lcd_string(words);

	//lcd_char(0x41);
	//lcd_char(65);
	//lcd_char((char)'A');

	while(1);
}

Bedankt!