Hoi,

ik heb hier een 1 regels LCD met backlite, ik heb me laten vertellen dat al die LCD's dezelfde manier van aansturen gebruiken. Is er dan een algemene datasheet? welke?

Je bedoelt waarschijnlijk die character-based dot-matrix displays met parallelle aansluiting (14- of 16-pins).
Informatie kun je vinden op mijn website.

precies! Mooi zoiets zocht ik. Maar je moet toch eerst informatie naar het LCD sturen voor je kan gaan schrijven? (niet de letters, maar nadere info...). Waar kan ik dat vinden?

Je moet inderdaad eerst het display initialiseren.
'k Zal die info er nog wel ff bij zetten vandaag.

moet ik dan

HD44780 controller initialiseren

hebben?

Yep.
En dan de instructies op volgorde van boven naar beneden naar het display sturen.

Ok, maar waarvoor dienen RS, R/W en E bits dan? En na de initialisatie kan ik dan gewoon de characters naar D0...D7 sturen?

Ok snap het nu een beetje dacht ik, de enable puls is toch hoog zetten als alle bits voor de instructie gezet zijn? Ik heb nu dus dit:

// PIC = PIC16F648
// COMPILER = HI-TECH PICC 7.86
// gemaakt door Berry Bakker, 2004

#include <pic.h>

bit LCD_RS	@ (unsigned) &PORTA*8+0;
bit LCD_RW	@ (unsigned) &PORTA*8+3;
bit LCD_E	@ (unsigned) &PORTA*8+4;

bit LCD_DB0	@ (unsigned) &PORTB*8+0;
bit LCD_DB1	@ (unsigned) &PORTB*8+1;
bit LCD_DB2	@ (unsigned) &PORTB*8+2;
bit LCD_DB3	@ (unsigned) &PORTB*8+3;
bit LCD_DB4	@ (unsigned) &PORTB*8+4;
bit LCD_DB5	@ (unsigned) &PORTB*8+5;
bit LCD_DB6	@ (unsigned) &PORTB*8+6;
bit LCD_DB7	@ (unsigned) &PORTB*8+7;

#define	NOP()	asm("NOP")
#define	LCD_ENABLE()	{LCD_E = 1; NOP(); LCD_E = 0;}

void init_ports(void);
void init_lcd(void);
void delay_10us(unsigned char);
void lcd_write_text(char);
void lcd_write_config(char);
void lcd_write(char);

__CONFIG(FOSC2);

void main(void)
{
	init_ports();
	init_lcd();
	
	lcd_write_text('H');
	
	for(;;)
	{
	}
}

void init_ports(void)
{
	TRISA = 0;
	TRISB = 0;
}

void init_lcd(void)
{
	LCD_E = 0;
	delay_10us(1500);	// Delay voor 15mS
	
	lcd_write_config(0x0C);	// Function set
	delay_10us(4);	// 40uS
	lcd_write_config(0x0F);	// On/Off control
	delay_10us(4);	// 40uS
	lcd_write_config(0x01);	// Clear display
	delay_10us(4);	// 40uS
	lcd_write_config(0x06);	// Entry mode
	delay_10us(4);	// 40uS
}

void delay_10us(unsigned char x)	// In 10 uS
{
 	while(x >= 1)
	{
    	NOP();
    	x--;
    }
}

void lcd_write_text(char text)
{
	LCD_RS = 1;	// Register
	LCD_RW = 0;
	
	lcd_write(text);
}

void lcd_write_config(char command)
{
	LCD_RS = 0;	// Register
	LCD_RW = 0;
	
	lcd_write(command);
}

void lcd_write(char data)
{
	LCD_DB0 = !!(data & 1);	// !! = char2bit
	LCD_DB1 = !!(data & 2);
	LCD_DB2 = !!(data & 4);
	LCD_DB3 = !!(data & 8);
	LCD_DB4 = !!(data & 16);
	LCD_DB5 = !!(data & 32);
	LCD_DB6 = !!(data & 64);
	LCD_DB7 = !!(data & 128);
	
	LCD_ENABLE();	// Enable puls
}

ik hoop dat je al ken je geen C hier toch een beetje wijs uit kan worden. Wat die !! betreft, zo deed een kennis van mij het, dus ik dacht dat dat misschien de enigste oplossing hiervoor was...

zit er geen LCD library in je compiler ?? Zo ben je nog wel ff bezig ?
Precies niet want deze heeft het ook zelf geschreven, misschien kan je de routines ovenemen.
http://www.bobblick.com/techref/projects/lcdterm/lcdterm6.c

[Bericht gewijzigd door elektron_ op ]

Hmmm ja... Ik heb hier ook code die cker weten werkt, van een kennis dus dan zou ik ook nog eens wat kunnen navragen,maar ik vogel het liever eerst zelf uit... Ik denk dat het toch ergens fout gaat met de w8 looopjes, dat die te kort zijn ofzo... Hij cleart het display ook niet, opzich wel vaag... Ik denk dat ik maar een omslachtig wachtlusje ga maken die telkens de Busy flag uitleest... Misschien dat het dan wel gaat lukken. Of nog andere ideen?

Ok domme vraag:

zijn er nog andere controllers als die HD44780? Zul je net zien dat ik die heb! Ik heb nu alle stappen op uw site gevolgt maar het werkt niet... Ik gebruik de code boven. In MPlab doet het wat ik ervan verwacht, het zet de goede pinnen hoog enzo. Maar het display blijft 8 digits gevult en 8 digits leeg aangven... Heel raar als er spanning opkomt doet ie dat altijd automatich. Is dat een foutcode ofzo? Als ik handmatig alles op GND zet behalve LCD_Data0 die op +5v en dan enable ff een puls geven, wordt het scherm niet blank. Ik heb dan verder natuulijk geen initialisatie gedaan...

Als de helft van het scherm leeg blijft, moet je na 8 karakters het adres veranderen van de RAM, dan vult de rest van je scherm zich ook met de karakters.
Succes!

Ik snap niet helemaal wat je bedoelt, maar als je denkt dat hij mijn ernaartoe gestuurde gegevens laat zien, dat doet ie niet. Hij laat zomaar alle pixels van de eerste 8 characters vol zien, de rest leeg..

Oke even een paar opmerkingen waar het mischien aan kan liggen.
als je een lcd aanzet zonder init krijg je inderdaad een donkere regel zoals je al beschreef.

Wat me opvalt in je code, (heb het vergeleken met m1n eigen code)

Het signaal RW (gebruik je dit op te kiezen tussen lezen en schrijven)? zo ja zorg er dan voor dat je alleen naar het display schrijft, dus de pen aan massa of+5v

Het signaal RS ik hoop niet dat dit reset ofzo is, maar je heb naast het E signaal ook een signaal nodig dat aangeeft of je commando (init) stuurt of data. Hier zou je RS voor kunnen gebruiken of mischien doe je dit al. Echter ik zie niet dat je dit signaal in de init laag maakt. Dit signaal moet namelijk laag zijn bij commando`s en hoog bij data (karakters).

Het signaal E, je klokt de data in op de opgaande flank, volgen mij staat in het datasheet dat dit op de neergaande flank moet gebeuren. Altans ik doe dit wel en mijn display werken altijd zonder problemen.

Dan de init seqeunce, je moet hem zelf maar na lopen maar dit is de mijne

0x30
0x28
0x08
0x01
0x06
0x0c zet display aan /cursor aan en knipperen
0x81 zet cursor/geheufgen op juiste positie

succes, hoop dat je er aan uit komt

Het signaal RS ik hoop niet dat dit reset ofzo is, maar je heb naast het E signaal ook een signaal nodig dat aangeeft of je commando (init) stuurt of data. Hier zou je RS voor kunnen gebruiken of mischien doe je dit al. Echter ik zie niet dat je dit signaal in de init laag maakt. Dit signaal moet namelijk laag zijn bij commando`s en hoog bij data (karakters).

RS is het kiezen van het data of command register. In mijn init roep ik lcd_write_config() aan en die zet RS op 0 zoals het moet. Dan zou het aan de E liggen?

Om te overzien dat het geen fout in de code is heb ik Dr_nellis' instructies handmatig (lees: de draadjes aan + of - verbinden) verstuurd, maar de Clear Screen werkt dan ook niet... Ik denk dus dat
1) het een andere controller is
2) het display kapot is (tis een 1*16 display en de helft wordt gevult, niet alles!)

Nee hoor.
Er zijn 1x16 displays die eigenlijk 2X8 zijn naast elkaar en niet onder elkaar.
Je moet om bij de tweede helft te komen het display initialiseren als een twee rijig display en en schrijven naar de tweede regel.
Regel 1 heeft dus 8 karakters
regel 2 heeft ook 8 karakters maar ze liggen achter de eerste 8.

Hier is mijn code, deze werkt gegarandeerd op een 2x16

LCDwrite(char Data)
{
bitset(PORTB,6); /* E = hoog */
PORTA = Data / 16;
bitclr(PORTB,6);
bitset(PORTB,6);
PORTA = Data;
bitclr(PORTB,6);
bitset(PORTB,6);

}

LCDinit()
{
bitclr(PORTB,7); /*LCD in commando mode zetten */
LCDwrite(0x30);
Delay(7800);
LCDwrite(0x30);
Delay(7800);
LCDwrite(0x30);
Delay(7800);
LCDwrite(0x28);
Delay(7800);
LCDwrite(0x08);
Delay(7800);
LCDwrite(0x01);
Delay(7800);
LCDwrite(0x06);
Delay(7800);
LCDwrite(0x0C);
Delay(7800);
LCDwrite(0x81);
bitset(PORTB,7);
}

Mischien dat dit duidelijker is, in de volledige code word LCDinit eerst aangeroepen en daarna ga ik karakterschrijven met LCDwrite

Dit is wel bedoeld voor 4 datalijnen en niet 8

Nou het helpt geen ene *********** om het als 2 regel display te initialiseren hoor!!! Dit is nu mijn code


void init_lcd(void)
{
	LCD_E = 0;
	delay_10us(1500);	// Delay voor 15mS
	
	lcd_write_config(0x30);	// Function set
	delay_10us(500);	// Delay voor 5mS
	lcd_write_config(0x30);	// Function set
	delay_10us(11);	// Delay voor 110uS
	lcd_write_config(0x30);	// Function set
	delay_10us(11);	// Delay voor 110uS
	lcd_write_config(0x38);	// Zet 8 bits, 2 regels, 5x7 font
	delay_10us(5);	// Delay 50uS
	lcd_write_config(0x0C);	// Display aan, cursor uit
	delay_10us(5);	// Delay 50uS
	lcd_write_config(0x01);	// Clear display
	delay_10us(165);	// Delay 1.65mS
	lcd_write_config(0x06);	// Increment display position, geen display shift
	delay_10us(5);	// Delay 50uS
}

void lcd_write_config(char command)
{
	LCD_RS = 0;	// Register
	LCD_RW = 0;
	
	lcd_write(command);
}

void lcd_write(char data)
{
	LCD_DB = data;
	
	LCD_ENABLE();	// Enable puls
}

:(