Styra grafisk LCD med AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
klopaz
Inlägg: 45
Blev medlem: 26 december 2003, 03:37:48

Styra grafisk LCD med AVR

Inlägg av klopaz »

Halloj.

Jag sitter och försöker få en grafisk display att fungera med min avr, men jag lyckas inte så bra.
Jag använder mig av denna display, en ATmega8 och följande kod:

Kod: Markera allt

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>

void writeLCD(char RS, char RW, unsigned char DATA) {
	if(RS == 1)
		PORTC |= 0x02; // Set pin 1 (RS) on port C high.
	else
		PORTC &= 0xFD; // Set pin 1 (RS) on port C to low.
	if(RW == 1)
		PORTC |= 0x04; // Set pin 2 (RW) on port C to high.
	else
		PORTC &= 0xFB; // Set pin 2 (RW) on port C to low.
	PORTD = DATA; // Write DATA to port D.
	// Create one pulse on pin 3 (E).
	PORTC &= 0xF7; // Set pin 3 (E) on port C to low.
	_delay_loop_1(100); // Delay for 750µs. EDIT: Delay * 100
	PORTC |= 0x08; // Set pin 3 (E) on port C to high.
	_delay_loop_1(100); // Delay for 750µs. EDIT: Delay * 100
	PORTC &= 0xF7; // Set pin 3 (E) on port C to low.
}

void toggleLCDBacklight() {
	PORTC ^= 0x01; // Toggle LSB on port C. LCD Backlight on/off.
}

void setLCDAddress(unsigned char X, unsigned char Y, char CS1, char CS2) {
	// Select which driver(s) to use.
	if (CS1 == 1)
		PORTC |= 0x10; // Set pin 4 (CS1) on port C to high. Use CS1.
	else
		PORTC &= 0xEF; // Set pin 4 (CS1) on port C to low. Don't use CS1.
	if (CS2 == 1)
		PORTC |= 0x20; // Set pin 5 (CS2) on port C to high. Use CS2.
	else
		PORTC &= 0xDF; // Set pin 5 (CS2) on port C to low. Don't use CS2.
	// Convert raw addresses to X and Y address commands.
	X |= 0xB8; // Set pin 3, 4, 5, 7 high.
	X &= 0x40; // Set pin 6 low.
	Y |= 0x40; // Set pin 6 high.
	Y &= 0x80; // Set pin 7 low.
	writeLCD(0, 0, X); // Send X address command to LCD.
	writeLCD(0, 0, Y); // Send Y address command to LCD.
}

int main(void) {
	// Configure ports
	DDRC = 0x3F; // Set pin 0 - 5 as outputs on port C.
	DDRD = 0xFF; // Set pin 0 - 7 as outputs on port D.
	PORTC = 0x01; // Set LSB (backlight) high and clear all other outputs on port C.
	PORTD = 0x00; // Clear all outputs on port D.
	
	// Init LCD
	writeLCD(0, 0, 0x3F);
	setLCDAddress(1, 1, 1, 0);
	writeLCD(1, 0, 0xFF);
	writeLCD(1, 0, 0xFF);
	writeLCD(1, 0, 0xF0);
	writeLCD(1, 0, 0xF0);
	setLCDAddress(8, 8, 0, 1);
	writeLCD(1, 0, 0xFF);
	writeLCD(1, 0, 0xFF);
	writeLCD(1, 0, 0xF0);
	writeLCD(1, 0, 0xF0);
}
Det händer ingenting på displayen när jag kör programmet. Vrider jag på min kontrast potentiometer så kan jag få displayen i två lägen, ett där den är helt blå och ett där den är helt vit.

Jag känner mig ganska säker på att det inte är någonting som är felkopplat eftersom jag använt mig av detta schema med enda förendringen att jag kopplat in pinnarna till en avr istället för till paralellporten.

Någon som har en ide om vad som kan vara fel? Eller kanske sitter du på ett litet testprogram till denna display?
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg av MicaelKarlsson »

Har du kollat så initieringen är rätt?

Om inte skulle du ju kunna koppla pinnarna till LED för att kontrollera att de går höga och låga på rätt sätt, är delayen tillräckligt lång/kort?
Användarvisningsbild
Xyzzy
Inlägg: 1222
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Inlägg av Xyzzy »

Kolla länken nedan, där kan du simulera displayen och dess I/Os för att se om du förstått initieringen rätt... (iaf om det är en standardcontroller på displayen)
http://www.geocities.com/dinceraydin/dj ... cdsim.html
klopaz
Inlägg: 45
Blev medlem: 26 december 2003, 03:37:48

Inlägg av klopaz »

Tack för hjälpen båda två!

Jag lyckades tillslut komma fram till att experimentplattan jag kopplade på tydligen hade ledningsbanor vertikalt på sektionerna mitten och horisontellt i kanterna :evil:
Tror att mitt testprogram hade lite buggar också, så jag skrev ett nytt och nu fungerar allt 8)
Skriv svar