www.mikrocontroller.net

Forum: Compiler & IDEs LCD Display an Atmega168


Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum


Ich hab mir bei my AVR einen Atmel168 plus display gekauft. nun veruche 
ich verzeifelt das LCD zu betreiben, leider funktionieren die 
mitgelieferten Codes nicht richtig. Wer kann mir bitte helfen
Anbei der Code; Ich hab das Programm soweit debuggen können das es 
kompiliert wird. Wenn ich es auf den u controller spiele passiert 
allerdings nix????




mfg Peter




//---------------------------------------------------------------------- 
-----
// Title      :Rahmen für ein AVR ATmega8 C-Programm mit LCD
// Date       :10.04.2005
// Version    :1.0
// Autor      :Dipl. Ing. Päd. Alexander Huwaldt
//---------------------------------------------------------------------- 
-----
#define   F_CPU 3686400
#include  <avr\io.h>
#include  <util\delay.h>
#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
#define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))
#define outp(VAL,ADRESS) ((ADRESS) = (VAL))
#define inp(VAL) (VAL)

//////////////////////////////////////////////////////////////////////// 
/////
// allgemeine-Funktionen
//---------------------------------------------------------------------- 
-----
//  wait_ms(..) - Wartet einige Millisekunden
//  Die Dauer ist nicht kalibriert.
//  PE:  miliSec=Anzahl der zu wartenden Millisekunden
//---------------------------------------------------------------------- 
-----
void wait_ms(int miliSec)
{
  _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);  // 4 Zyklen 
warteschleife
}
void wait_us(int mikroSec)
{
  _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec);  // 4 Zyklen 
warteschleife
}
//////////////////////////////////////////////////////////////////////// 
//////
//  LCD-Funktionen für myAVR-Board + myAVR-LCD
//  4-BitModus an PortD Bit 4-7
//  PortD Bit 2 = RS, high=Daten, low=Kommando
//  PortD Bit 3 = E, high-Impuls für gültige Daten
//---------------------------------------------------------------------- 
-----
//  lcd_send(..) - sendet ein Byte an LCD im 4-Bit-Modus
//  RS muss vorher richtig gesetzt sein
//  PE:  data=zu sendendes Byte
//---------------------------------------------------------------------- 
-----
void lcd_send(char data)
{
  // aktuelles RS ermitteln
  char rs=PORTD;
  rs&=4;
  // High-Teil senden
  char tmp=data;
  tmp&=0xf0;
  tmp|=rs;
  PORTD=tmp;
  // Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);
  // Low-Teil senden
  tmp=data;
  tmp&=0x0f;
  tmp*=16;
  tmp|=rs;
  PORTD=tmp;
  // Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);
  // verarbeiten lassen
  wait_ms(1);
}
//---------------------------------------------------------------------- 
-----
//  lcd_cmd(..) - sendet ein Kommando an LCD
//  PE:  cmd=Kommando-Byte
//---------------------------------------------------------------------- 
-----
void lcd_cmd(char cmd)
{
  cbi(PORTD,2);    // RS löschen = Kommando
  lcd_send(cmd);    // senden
}
//---------------------------------------------------------------------- 
-----
//  lcd_write(..) - sendet ein Zeichen (Daten) an LCD
//  PE:  text=Zeichen
//---------------------------------------------------------------------- 
-----


//---------------------------------------------------------------------- 
-----
//  lcd_write(..) - sendet ein Zeichen (Daten) an LCD
//  PE:  text=Zeichen
//---------------------------------------------------------------------- 
-----
void lcd_write(char text)
{
  sbi(PORTD,2);    // RS setzen = Daten
  lcd_send(text);    // senden
}
//---------------------------------------------------------------------- 
-----


//  lcd_home(..) - Cursor auf Position 1,1
//---------------------------------------------------------------------- 
-----
void lcd_home()
{
  lcd_cmd(0x02);
  wait_ms(2);      // warten
}
//---------------------------------------------------------------------- 
-----
//  lcd_clear(..) - löscht die Anzeige im LCD
//---------------------------------------------------------------------- 
-----
void lcd_clear()
{
  lcd_cmd(0x01);
  wait_ms(2);      // warten
}
//---------------------------------------------------------------------- 
-----
//  lcd_on(..) - schaltet das LCD an
//---------------------------------------------------------------------- 
-----
void lcd_on()
{
  lcd_cmd(0x0E);
}
//---------------------------------------------------------------------- 
-----
//  lcd_off(..) - schaltet das LCD aus
//---------------------------------------------------------------------- 
-----
void lcd_off()
{
  lcd_cmd(0x08);
}
//---------------------------------------------------------------------- 
-----
//  lcd_goto(..) - setzt die Cursorposition
//   PE:  row = Zeile 1..2
//    col = Spalte 1..16
//---------------------------------------------------------------------- 
-----
void lcd_goto(int row, int col)
{
  row--;        // Null-basierend
  row&=0x01;      // sicherheitshalber
  row*=0x40;      // Zeile nach Bit 6 bringen
  col--;        // Null-basierend
  col&=0x0f;      // sicherheitshalber
  char tmp=row|col;
  tmp|=0x80;      // Cursor setzen
  lcd_cmd(tmp);    // senden
}
//---------------------------------------------------------------------- 
-----
//  lcd_init(..) - Schaltet die Ports und Initialisiert das LCD
//---------------------------------------------------------------------- 
-----
void lcd_init()
{
  // Port D = Ausgang
  DDRD=0xff;
  PORTD=0;
  // warten bist LCD-Controller gebootet
  wait_ms(50);
  // SOFT-RESET
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_ms(5);
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_us(100);
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_ms(5);

  // 4-BitModus einschalten
  PORTD=0x20;
  // Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_ms(5);

  // ab hier im 4-Bit-Modus
  lcd_cmd(0x28);    // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
  //lcd_off();
  lcd_cmd(0x06);    // Entry Mode
  lcd_on();
  lcd_clear();
}
//---------------------------------------------------------------------- 
-----
// Main-Funktion
//---------------------------------------------------------------------- 
-----
int main (void)
{
  wait_ms(200);
  lcd_init();
  lcd_goto(1,1);
  lcd_write(0x11);
  while (1) {  } // Mainloop
return 0;
}
//---------------------------------------------------------------------- 
-----

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was erwartest Du, was passieren soll? Dein Programm initialisiert zwar 
das LCD, schreibt aber sonst nichts raus...

Ersetzte im main() die Zeile

lcd_write(0x11);

durch

lcd_write('H');
lcd_write('e');
lcd_write('l');
lcd_write('l');
lcd_write('o');
lcd_write(' ');
lcd_write('W');
lcd_write('o');
lcd_write('r');
lcd_write('l');
lcd_write('d');


Wenn das klappt, dann bauee Dir eine Funktion, mit welcher Du ganze 
Strings, statt bloss einzelen Charakters senden kanst.

MfG  Peter

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

Erstmal Danke für deine Antwort. Kannst Du mir auch noch erklähren wie 
ich eine "Zahl" d.h zb das ergebniss eine berchnung senden kann?
Danke für die Mühe

mfg

Autor: Michael Potthoff (mipo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt die Zahl erst in einen String bzw. einzelne Buchstaben 
umwandeln! Ich versuche mal mein Glück


//------------- einzelne Buchstaben Version
uint8_t zahl;

lcd_write (zahl/100 +'0'); // 100er-Stelle +'0' entspricht dem 
ASCII-Offset für das Zeichen "0"
zahl = zahl % 100;  // modulo 100, d.h. der Rest von "/100"
lcdwrite (zahl/10)+'0'); // 10er Stelle
lcd_write (zahl % 10 +'0'); // der Rest von "/10" = 1er


//------------ in String umwandln und ausgeben

/*********************************************************************** 
**
Aus Peter Fleury's LCD-Routinen
Display string without auto linefeed
Input:    string to be displayed
Returns:  none
************************************************************************ 
*/
void lcd_puts(const char *s)
/* print string on lcd (no auto linefeed) */
{
    register char c;

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

}/* lcd_puts */

uint8_t zahl;
char   ergebnis;

itoa (zahl, ergebnis, 10); // umwandlung der zahl ins 10er-Zahlensystem
lcd_putc (ergebnis)

Autor: Michael Potthoff (mipo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ARG, die letzte Zeile ist natürlich

lcd_puts (ergebnis);

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.