www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD_Routine_atmega32


Autor: cler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Habe ein Problem bezüglich einer LCD_Routine.

Und zwar: Es wird zwar der einzelne Buchstabe angezeigt, jedoch wird 
dieser  von der angegebenen Position verschoben.


Meine Frage ist daher: Was mach ich falsch?

Takt: 4 MHz
LCD_display: HD44780 2 zeilig
AVR: atmega32

Pinkonfigurationen:

DB7...PC7
 6      6
 5      5
 4      4
EN     PC2
RW     GND
RS      3


Da ich das Busyflag nicht abfragen kann, musste ich dies durch 
Delayfunktionen lösen.

siehe Quellcode:
//LCD
void    _long_delay(void);
void    _lcd_write_command(unsigned char);
void    LCD_Write(unsigned char *);
void    LCD_Init(void);
char    LCD_Putchar(char);
#define LCD_Clear  {_lcd_write_command(0x01); _long_delay();_long_delay();}
void    LCD_Gotoxy(unsigned char  , unsigned char );
void    LCD_Gotoxy2(unsigned char  , unsigned char );
void    LCD_DezAusgabe(unsigned long wert , char stellen , unsigned char punkt);
void LCD_Puts(const char *s);


void _long_delay(void)
{
long t = 3000;
while (t--);
}

void _short_delay(void)
{
int t = 350;
while (t--);
}


void _lcd_write_command(unsigned char data)
{
  DDRC |= (0x80+0x40+0x20+0x10+0x08);
  LCD_PORT_w = (data & 0xf0) | DISPLAY_EN;
  LCD_PORT_w = (data & 0xf0) | DISPLAY_EN;
  LCD_PORT_w = (data & 0xf0) | DISPLAY_EN;
  LCD_PORT_w = (data & 0xf0);
  LCD_PORT_w = (data & 0xf0);
  LCD_PORT_w = (data & 0xf0);
  LCD_PORT_w = (data << 4) | DISPLAY_EN;
  LCD_PORT_w = (data << 4) | DISPLAY_EN;
  LCD_PORT_w = (data << 4) | DISPLAY_EN;
  LCD_PORT_w = (data << 4);
    DDRC &= ~(0x80+0x40+0x20+0x10+0x08);
   PORTD &= ~0x08;
 
}

void _lcd_write_4bit(unsigned char data)
{
 DDRC |= (0x80+0x40+0x20+0x10+0x08);
  LCD_PORT_w = (data << 4) | DISPLAY_EN;
  LCD_PORT_w = (data << 4) | DISPLAY_EN;
  LCD_PORT_w = (data << 4) | DISPLAY_EN;
  LCD_PORT_w = (data << 4);
  LCD_PORT_w = (data << 4);
    DDRC &= ~(0x80+0x40+0x20+0x10+0x08);
 PORTD &= ~0x08;
 
}

void lcd_write_byte(unsigned char data)
{
 DDRC |= (0x80+0x40+0x20+0x10+0x08);
  LCD_PORT_w = (data & 0xf0) | DISPLAY_EN | DISPLAY_RS;
  LCD_PORT_w = (data & 0xf0) | DISPLAY_EN | DISPLAY_RS;
  LCD_PORT_w = (data & 0xf0) | DISPLAY_RS;
  LCD_PORT_w = (data & 0xf0) | DISPLAY_RS;
  LCD_PORT_w = (data << 4)   | DISPLAY_EN | DISPLAY_RS;
  LCD_PORT_w = (data << 4)   | DISPLAY_EN | DISPLAY_RS;
  LCD_PORT_w = (data << 4)   | DISPLAY_RS;
    DDRC &= ~(0x80+0x40+0x20+0x10+0x08);
 PORTD &= ~0x08;
 
}


int my_pput(int zeichen)
{
 lcd_write_byte((char) zeichen);
 return(1);
}

// initialize the LCD controller
void LCD_Init(void)
{

LCD_PORT_DDR = 0xff;// - (0x01 + 0x02) ;//0xf0 | DISPLAY_RS | DISPLAY_EN;
_long_delay();
_long_delay();
_lcd_write_4bit(0x03);     // noch 8 Bit
_long_delay();
_lcd_write_4bit(0x03);     // noch 8 Bit
_long_delay();
_lcd_write_4bit(0x03);     // noch 8 Bit
_long_delay();
_lcd_write_4bit(0x02);     // jetzt 4 Bit
_long_delay();

_lcd_write_command(0x28);     // 4 Bit Zweizeilig
//-
_long_delay();
_long_delay();
_lcd_write_command(0x1C);     
_long_delay();
_lcd_write_command(0x74);     
_long_delay();
_lcd_write_command(0x52);     // 
_long_delay();
_lcd_write_command(0x69);     // Contrast 

// ----------------------------
//-
_long_delay();
_lcd_write_command(0x08);     // Display aus
_long_delay();
_lcd_write_command(0x01);     // Clear
_long_delay();
_lcd_write_command(0x06);     //Entry mode
_long_delay();
_lcd_write_command(0x08 + 4); // Display an
_long_delay();
}


void LCD_Gotoxy(unsigned char x , unsigned char y)
 {
  _short_delay();
  switch(y)
  { case 0 : _lcd_write_command(x + 0x80); break;
    case 1 : _lcd_write_command(x + 0xC0); break;
    case 2 : _lcd_write_command(x + (0x80 + 20)); break;
    case 3 : _lcd_write_command(x + (0xC0 + 20)); break;
  }
  
}


void LCD_Write(unsigned char *this_text)
{
 unsigned char i = 0;
  
 while(this_text[i] != 0) 
  {
   lcd_write_byte(this_text[i++]);
   _long_delay();
   
  }
    
  
}


char LCD_Putchar(char zeichen)
{
_short_delay();
 lcd_write_byte((char) zeichen);
 return(1);
}
void LCD_Puts(const char *s)
{
   register char c;

    while ( (c = *s++) ) {
        LCD_Putchar(c);
    }
}



int main()
{
LCD_Init();
LCD_Clear;
LCD_Gotoxy(0,0);
LCD_Puts("Hallo Welt");
for(;;)
{
}
return 0;
}







Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und zwar: Es wird zwar der einzelne Buchstabe angezeigt, jedoch wird
> dieser von der angegebenen Position verschoben.

Wundert mich, weil du im angegebenen Programm nur eine Ausgabe eines 
Textes (Hallo Welt") machst und keinen einzelnen Buchstaben aus gibst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.