Hallo
habe zusätzlich die freien Daatenleitungen auf GND gesetzt
Das würde ich nicht machen. Wenn das LCD, aus welchen Gründen auch immer, hier etwas ausgeben möchte, knallt´s! Ist eigentlich r/w mit GND verbunden?
Ein 4x20-LCD an meinem RP6 (auch ein Mega32):
https://www.roboternetz.de/phpBB2/ze...ag.php?t=41805
Der Code (hoffentlich richtig an deine Belegung angepasst):
Code:
// LCD 20x4 (LMC-SSC4A20) an den PC0-3, PC5 und PC7 10.2.2011 mic
// 4-Bit-Ansteuerung ohne busy-Abfrage:
// 1 - GND - GND
// 2 - Vcc - Vcc
// 3 - Kontrast (0-0,5V)
// 4 - RS - PC7
// 5 - R/W - GND
// 6 - E - PC5
// 7 - nc
// 8 - nc
// 9 - nc
// 10 - nc
// 11 - Data4 - PC0
// 12 - Data5 - PC1
// 13 - Data6 - PC2
// 14 - Data7 - PC3
// 15 - A - Vcc
// 16 - K - GND
#include <avr/io.h>
#include <util/delay.h>
#define demospeed 50
#define d4h (PORTC|=1)
#define d4l (PORTC&=~1)
#define d5h (PORTC|=2)
#define d5l (PORTC&=~2)
#define d6h (PORTC|=4)
#define d6l (PORTC&=~4)
#define d7h (PORTC|=8)
#define d7l (PORTC&=~8)
#define eh (PORTC|=32)
#define el (PORTC&=~32)
#define rsh (PORTC|=128)
#define rsl (PORTC&=~128)
void strobe(void)
{
eh;
_delay_ms(1);
el;
}
void lcd_write8(uint8_t wert, uint8_t pause)
{
if(wert & 16) d4h; else d4l;
if(wert & 32) d5h; else d5l;
if(wert & 64) d6h; else d6l;
if(wert & 128) d7h; else d7l;
strobe();
_delay_ms(pause);
}
void lcd_write4(uint8_t wert, uint8_t pause)
{
if(wert & 16) d4h; else d4l; // high nipple
if(wert & 32) d5h; else d5l;
if(wert & 64) d6h; else d6l;
if(wert & 128) d7h; else d7l;
strobe();
_delay_ms(pause);
if(wert & 1) d4h; else d4l; // low nipple
if(wert & 2) d5h; else d5l;
if(wert & 4) d6h; else d6l;
if(wert & 8) d7h; else d7l;
strobe();
_delay_ms(pause);
}
void lcd_cls(void)
{
rsl;
lcd_write4(1,2);
rsh;
}
void lcd_locate(uint8_t x, uint8_t y)
{
rsl;
switch (y) {
case 0: lcd_write4(0x80+x, 40); break; // 0. Zeile
case 1: lcd_write4(0xc0+x, 40); break; // 1. Zeile
case 2: lcd_write4(0x94+x, 40); break; // 2. Zeile
case 3: lcd_write4(0xd4+x, 40); break; // 3. Zeile
}
rsh;
}
void lcd_writeChar(uint8_t zeichen)
{
lcd_write4(zeichen,1);
}
void lcd_writeString(char *string)
{
while(*string)
lcd_writeChar(*string++);
}
void lcd_init(void)
{
DDRC |= 0b10101111;
PORTC &= ~0b10101111;
rsl;
_delay_ms(100);
lcd_write8(0b00100000,100); // Function Set: 4bit-Modus starten
lcd_write4(0b00101000,40); // Function Set: 2 Zeilen, Font 0 (0010NFxx)
lcd_write4(0b00000001,40); // Display Clear
lcd_write4(0b00000110,40); // Entry Mode Set: inc, no shift
lcd_write4(0b00001100,40); // Display On and Cursor
//lcd_write4(0b00001111,40); // Display On and Cursor
rsh;
_delay_ms(1);
}
int main(void)
{
uint8_t i; // Hilfsvariable
lcd_init(); // lcd initialisieren
lcd_cls(); // Display löschen
lcd_locate(0,0); // Schreibpositon festlegen
for(i=0; i<20; i++) {lcd_writeChar('*'); _delay_ms(demospeed); }
lcd_locate(0,1);
for(i=0; i<20; i++) {lcd_writeChar('a'+i); _delay_ms(demospeed/2); }
lcd_locate(0,2);
for(i=0; i<20; i++) {lcd_writeChar('A'+i); _delay_ms(demospeed/3); }
lcd_locate(0,3);
for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }
for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }
_delay_ms(2000);
lcd_cls();
lcd_locate(2,0);
lcd_writeString("RP6 ROBOT SYSTEM");
lcd_locate(0,2);
lcd_writeString("LC-Display an LED1-6");
lcd_locate(9,3);
lcd_writeString("16.7.08 mic");
while(1){
}
return 0;
}
Vielleicht hilf dir das?
btw. verwende ich fünf der sechs Datenleitungen gleichzeitig auch zum Einlesen von fünf Tastern ;)
Poste mal dein aktuelles Programm... (bitte in Code-Tags)
Gruß
mic
Lesezeichen