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


von Steffen K. (stek)


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).
1
#include  <msp430x16x.h>
2
#include <stdio.h>
3
#include <string.h>
4
5
int lcd_warte;
6
7
void init_LCD(void);
8
void LCD_wait(int zeit);
9
void LCD_putinitData(int daten);
10
11
void main(void)
12
{
13
  WDTCTL = WDTPW + WDTHOLD;                 // watchdog aus
14
  TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode
15
16
  P1DIR = 0xFF;
17
  P1OUT = 0x00;
18
  P4DIR = 0xFF;                             // All P4.x outputs
19
  P4OUT = 0;                                // All P4.x reset
20
  P5DIR = 0xFF;                             // All P5.x outputs
21
  P5OUT = 0;                                // All P5.x reset
22
  
23
  lcd_warte=0;
24
25
  _BIS_SR(GIE);
26
  
27
  init_LCD();
28
29
  for(;;)
30
  {
31
  }
32
}
33
34
#pragma vector=TIMERA0_VECTOR
35
__interrupt void Timer_A(void)
36
{
37
  CCTL0 = !CCIE;                            // CCR0 interrupt disabled
38
  lcd_warte=1;
39
}
40
41
42
void init_LCD(void)
43
{
44
  LCD_wait(492);
45
  LCD_putinitData(0x30);
46
  LCD_wait(140);
47
  LCD_putinitData(0x30);
48
  LCD_putinitData(0x30);
49
50
  LCD_putinitData(0x38);
51
  LCD_putinitData(0x08);
52
  LCD_putinitData(0x01);
53
  LCD_putinitData(0x07);
54
}
55
56
void LCD_wait(int zeit)
57
{
58
  lcd_warte=0;
59
  CCR0= zeit;
60
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
61
  do {
62
  }while(lcd_warte==0);
63
  P1OUT ^= 0x01;                            // Toggle P1.0 for testing
64
}
65
66
void LCD_putinitData(int daten)
67
{
68
  P4OUT = daten;
69
  P5OUT = 0x01;
70
  LCD_wait(50);
71
  P5OUT &= ~0x01;
72
  LCD_wait(50);
73
}

: Verschoben durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.