mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik benötige Hilfe bei LCD--Code (Denkfehler?)


Autor: Steffen K. (stek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich weiß, das Thema gabs schon zur Genüge und ich zweifle auch an mir 
selbst... :/ Aber anscheinend habe ich irgend einen Denkfehler bei der 
Ansteuerung meines LCDs.
Das ist ein LCD161A mit KS0066U...laut diesem und anderer Foren sollte 
das sehr einfach sein (und vom Prog-Aufwand her ist es das auch); jedoch 
will es nicht funktionieren. Ich arbeite mit einem MSP430F1611 (mit32kHz 
getaktet), laut LCD-Datenblatt reichen die 3,3V als Logikpegel.

Ich habe das Problem, dass das Display die linken 8 Balken anzeigt 
(klar, Selbstinit mit 1 Zeile), sich aber warum-auch-immer nicht von 
Hand initialisieren bzw. ansprechen lässt. Da ich die gleichen Probleme 
mit 2 Displays habe muss es also an meinem Sourcecode liegen 
(Verbindungen stimmen alle...habe in meiner Verzweiflung schon im 
Sende-Befehl ein Breakpoint gesetzt und die jeweiligen Pegel am Display 
ausgemessen...).

Kann mir mal jemand auf die Sprünge helfen...ich glaub ich bin grad 
betriebsblind. :(

R/W ist auf Ground, RS auf P5.1, E auf P5.0, die 8 Datenleitungen auf P4
Die benötigten Wartezeiten realisiere ich via TimerA, der Übergabewert 
der Wait-Funktion beschreibt die abzuwartenden Clocks (also 1/32768).
#include  <msp430x16x.h>
#include <stdio.h>
#include <string.h>

int lcd_warte;

void init_LCD(void);
void LCD_wait(int zeit);
void LCD_putinitData(int daten);

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // watchdog aus
  TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode

  P1DIR = 0xFF;
  P1OUT = 0x00;
  P4DIR = 0xFF;                             // All P4.x outputs
  P4OUT = 0;                                // All P4.x reset
  P5DIR = 0xFF;                             // All P5.x outputs
  P5OUT = 0;                                // All P5.x reset
  
  lcd_warte=0;

  _BIS_SR(GIE);
  
  init_LCD();

  for(;;)
  {
  }
}

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
  CCTL0 = !CCIE;                            // CCR0 interrupt disabled
  lcd_warte=1;
}


void init_LCD(void)
{
  LCD_wait(492);
  LCD_putinitData(0x30);
  LCD_wait(140);
  LCD_putinitData(0x30);
  LCD_putinitData(0x30);

  LCD_putinitData(0x38);
  LCD_putinitData(0x08);
  LCD_putinitData(0x01);
  LCD_putinitData(0x07);
}

void LCD_wait(int zeit)
{
  lcd_warte=0;
  CCR0= zeit;
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  do {
  }while(lcd_warte==0);
  P1OUT ^= 0x01;                            // Toggle P1.0 for testing
}

void LCD_putinitData(int daten)
{
  P4OUT = daten;
  P5OUT = 0x01;
  LCD_wait(50);
  P5OUT &= ~0x01;
  LCD_wait(50);
}

: Verschoben durch Moderator

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.