www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Display Displaytech 162B - Ansteuerung der 2. Zeile?


Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte am LCD-Display auch die 2. Zeile nutzen.
Das LCD-Init wurde im 4Bit-Modus für 2 Zeilen geschrieben.
Ich müsste jetzt eine Funktion für die Ausgabe der 2.Zeile 
programmieren, wo die 1.Ausgabe an der Adresse 40h startet.

Hat jemand einen Vorschlag, wie ich das am Besten lösen kann?
Ich habe mir gedacht, die Funktion void lcd_write_zeile1(char *t) für 
die 2.Zeile zu kopieren. Wie starte ich aber hier mit Adresse 40h?

Hier der Code:
/****************************************************************
*  LCD Ausgabe für Hitachi HD44780 kompatible LCD Controller  *
*                                *
*  Mikroontroller:  AT90PWM316                  *
*  Clock:      8MHz intern                  *
*  LCD-Display:  Displaytech 162B              *
*  LCD-Controller:  KS0070B                    *              
*                                *
*  Konfiguration:  PORT D7 = LCD D7              *
*           PORT D6 = LCD D6              *
*           PORT D5 = LCD D5              *
*           PORT D4 = LCD D4              *
*          PORT D3 = LCD E               *
*          PORT D2 = LCD RS              *
*          GND    = LCD Vss + LCD R/W  + LCD K      *
*          +5V    = LCD Vdd              *
*          Poti  = LCD V0              *
*  +5V (über R = 1kOhm)  = LCD A                *
****************************************************************/

#define F_CPU    8000000

#include <avr/io.h>
#include <util/delay.h>

#define  LCDPORT      PORTD
#define  LCDDDR      DDRD
#define LCD_PIN_RS    2
#define LCD_PIN_E    3
#define LCD_PIN_D4    4
#define LCD_PIN_D5    5
#define LCD_PIN_D6    6
#define LCD_PIN_D7    7


/***** LCD STEUERBEFEHLE *****/

#define LCD_CLEAR    0x01 // Display löschen
#define LCD_HOME    0x02 // Cursor an den Anfang zurück
#define LCD_ON      0x0C // 0x0C = LCD ON, Cursor OFF
//#define LCD_ON      0x0E // 0x0E = LCD ON, Cursor ON
#define LCD_OFF      0x08 // Display OFF

/***** HILFSDEFINITIONEN *****/

#define  BEFEHL      0
#define DATEN      1
#define sbi(sfr, bit)   (sfr  |=  (1<<bit))
#define cbi(sfr, bit)   (sfr  &=  ~(1<<bit)) 


/****** Sendet ein Byte an den LCD Controller ******/
void lcd_send(unsigned char type, unsigned char c)
{
  if (type==BEFEHL)
    cbi(LCDPORT, LCD_PIN_RS); /* RS=0: Befehl folgt ... ******/
  else
    sbi(LCDPORT, LCD_PIN_RS); /* RS=1: Daten folgen ... ******/

  /* (1) HIGH NIBBLE wird gesendet ******/
  if (bit_is_set(c, 7)) 
    sbi(LCDPORT, LCD_PIN_D7); 
  else cbi(LCDPORT, LCD_PIN_D7);
  
  if (bit_is_set(c, 6)) 
    sbi(LCDPORT, LCD_PIN_D6); 
  else cbi(LCDPORT, LCD_PIN_D6);
  
  if (bit_is_set(c, 5)) 
    sbi(LCDPORT, LCD_PIN_D5); 
  else cbi(LCDPORT, LCD_PIN_D5);
  
  if (bit_is_set(c, 4)) 
    sbi(LCDPORT, LCD_PIN_D4); 
  else cbi(LCDPORT, LCD_PIN_D4);

  /* Flanke zur Übernahme der Daten senden ... ******/
  sbi(LCDPORT, LCD_PIN_E);
  _delay_ms(1);
  cbi(LCDPORT, LCD_PIN_E);

  
  /* (2) LOW NIBBLE wird gesendet ******/
  if (bit_is_set(c, 3)) 
    sbi(LCDPORT, LCD_PIN_D7); 
  else cbi(LCDPORT, LCD_PIN_D7);

  if (bit_is_set(c, 2)) 
    sbi(LCDPORT, LCD_PIN_D6); 
  else cbi(LCDPORT, LCD_PIN_D6);

  if (bit_is_set(c, 1)) 
    sbi(LCDPORT, LCD_PIN_D5); 
  else cbi(LCDPORT, LCD_PIN_D5);

  if (bit_is_set(c, 0)) 
    sbi(LCDPORT, LCD_PIN_D4); 
  else cbi(LCDPORT, LCD_PIN_D4);

  /* Flanke zur Übernahme der Daten senden ... ******/
  sbi(LCDPORT, LCD_PIN_E);
  _delay_ms(1);
  cbi(LCDPORT, LCD_PIN_E);

  /* (3) Auf den LCD Controller warten ...******/
  _delay_ms(5);
}


/****** Stellt eine Zeichenkette am LCD dar ******/
void lcd_write_zeile1(char *t)
{
  unsigned char i;
  for (i=0;i<255;i++)
  {
    if (t[i]==0) // String-Ende? Dann raus hier ...
      return;
    else 
      lcd_send(DATEN, t[i]);
  }
}

/****** Initialisierung des LCD Controllers *****/
void lcd_init()
{
/* Port auf Ausgang schalten */
  LCDPORT = 0x00;
  LCDDDR  = 0xFF;

  _delay_ms(40); // Warten bis LCD bereit ...

/* 4-bit Modus konfigurieren ------Function-Set 1*/    
  sbi(LCDPORT, LCD_PIN_D5);
  cbi(LCDPORT, LCD_PIN_D4);

  _delay_ms(40);
/* 4-bit Modus konfigurieren ------Function-Set 2*/
  sbi(LCDPORT, LCD_PIN_D5);
  cbi(LCDPORT, LCD_PIN_D4);
  
  _delay_ms(5);
/* 4-bit Modus konfigurieren ------Function-Set 3*/
  sbi(LCDPORT, LCD_PIN_D5);
  cbi(LCDPORT, LCD_PIN_D4);

/* 4-Bit Modus starten ... */ 
  sbi(PORTD, LCD_PIN_E);
  cbi(PORTD, LCD_PIN_E);
  _delay_ms(5); 

/* 2 Zeilen, 4-Bit Modus */
  lcd_send(BEFEHL, 0x28);
  //lcd_send(BEFEHL, 0x14);  

  lcd_send(BEFEHL, LCD_OFF);
  lcd_send(BEFEHL, LCD_CLEAR);

  lcd_send(BEFEHL, 0x06);
  lcd_send(BEFEHL, LCD_ON);
}


/****** Hilfsfunktion: Warte i Sekunden ******/
void sekunde(char i)
{
  unsigned char k;
  for (;i>0;i--)
  {
    for (k=0;k<10;k++)
      _delay_ms(50);
  }
}

/*****    HAUPTPROGRAMM    *****/

int main(void)
{
  _delay_ms(50);
  lcd_init();
  lcd_write_zeile1("Starting LCD...");

  while (1)
  {
    sekunde(5);
    lcd_send(BEFEHL, LCD_CLEAR);
    lcd_write_zeile1("LCD-Test");

    sekunde(5);
    lcd_send(BEFEHL, LCD_CLEAR);
    lcd_write_zeile1("LCD-Test Zeile2");
  }
}


Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI

>Wie starte ich aber hier mit Adresse 40h?

Mit dem Befehl 'Set DDRAM-Adress' den Adresspointer des Displays auf $40 
setzen.

MfG Spess

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mir da bitte ein Beispiel geben?
Mit Pointer hab ichs noch nicht so drauf!

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Mit Pointer meinte ich die Adresse, auf der das nächste Zeichen 
ausgegeben wird.

Ich kann eigentlich kein C.
#define LCD_SETDDRAM      0x80 // Set Display RAM Address

.....
    lcd_send(BEFEHL, LCD_SETDDRAM +0x40);

MfG Spess

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert!

Danke!

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.