Forum: Mikrocontroller und Digitale Elektronik KS0066U LCD-Display --> Cursor Position


von C. H. (hedie)


Lesenswert?

Hallo

Ich habe heute das erste mal ein Display vollständig selbst 
angesteuert....
Also ohne CopyPaste....

Hat dadurch zwar ein wenig länger gedauert jedoch verstehe ich nun jeden 
einzelnen Ablauf....

Ich bin jedoch dennoch auf ein Problem gestossen bei welchem ich euch 
gerne um Rat fragen möchte....

Ich habe ein LCD-Display von Reichelt (1x16 Zeichen - Displaytech 161A) 
dieses ist nicht! mit dem HD44780 Kompatibel sondern hat hie und da 
gewisse unterschiede... wie zb das die 16 Zeichen als 2 Display Linien 
angesteuert werden müssen....

Hier ist das Datenblatt des Controllers: KS0066U 
http://www.datasheetcatalog.org/datasheet/SamsungElectronic/mXuuzvr.pdf

Ich habe zur Ansteuerung des Displays ein Schieberegister verwendet
Bei der Seriellen übertragung muss zuerst das höchstwertige bit 
übertragen werden.

Hier ist mein bisheriger Code:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define LCD_PORT        PORTB
5
#define LCD_DDR         DDRB
6
#define LCD_RS          PB3
7
#define LCD_EN          PB2
8
#define LCD_DATA  PB1
9
#define LCD_CLK    PB0
10
11
12
void write_byte(unsigned char ucByte, unsigned char ucRS)
13
{
14
unsigned char ucCount = 0;
15
unsigned char ucMasked = 0;
16
  
17
ucByte = ~(ucByte);  //Invertieren für STK500
18
  
19
  if(ucRS > 0) LCD_PORT |= (1<<LCD_RS);  // RS auf 1 Setzen
20
  if(ucRS == 0) LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
21
  
22
  LCD_PORT &= ~(1<<LCD_EN);
23
  
24
  while(ucCount != 8)
25
  {
26
    ucCount ++;
27
    
28
    ucMasked = (ucByte & 0x80);
29
    if(ucMasked == 0) LCD_PORT |= (1<<LCD_DATA);
30
    if(ucMasked > 0) LCD_PORT &= ~(1<<LCD_DATA);
31
    
32
    LCD_PORT |= (1<<LCD_CLK);
33
    _delay_ms(1);
34
    LCD_PORT &= ~(1<<LCD_CLK);
35
    _delay_ms(1);
36
    
37
    ucByte = (ucByte << 1);
38
  }
39
  
40
  LCD_PORT |= (1<<LCD_EN);  // Enable auf 1 setzen
41
  _delay_ms(1);
42
  LCD_PORT &= ~(1<<LCD_EN);
43
44
}
45
46
47
48
49
void init_lcd(void)
50
{
51
  _delay_ms(100);    //Warten bis LCD bereit....
52
  write_byte(0x3C,0);  //2 Line  5x8 Dot Mode
53
  write_byte(0x0C,0);  //Display on - Cursor off - Blink off  
54
  write_byte(0x01,0);  //Clear Display
55
  write_byte(0x06,0);  //Increment mode - entire shift off
56
}
57
58
59
void main(void)
60
{
61
  LCD_DDR = 0xFF;
62
  
63
  init_lcd();
64
  
65
  //write_byte(~(0x1D),0);//Cursor nach rechts
66
  //write_byte(~(0x1B),0);//Cursor nach links
67
  
68
  write_byte('T',1);
69
  write_byte('E',1);
70
  write_byte('S',1);
71
  write_byte('T',1);
72
  
73
  while(1);
74
75
}

Mein Fragen....

Im Tutorial für AVR GCC steht für die String ausgabe folgende Funktion:
1
void lcd_string(char *data)
2
{
3
    while(*data) {
4
        lcd_data(*data);
5
        data++;
6
    }
7
}

Wie kann ich die grösse bzw. die Anzahl zeichen welche innerhalb von 
data stehen herausfinden? und wie kann ich auf ein einzelnes Zeichen 
innerhalb dieses Arrays zugreifen?

Und die zweite frage....
Wie kann ich bei diesem Controller die Display Linie wechseln und die 
Cursor Position festlegen?

Danke schonmal...

Liebe Grüsse

von Micha (Gast)


Lesenswert?

>Wie kann ich die grösse bzw. die Anzahl zeichen welche innerhalb von data
>stehen herausfinden?
Mit strlen (in string.h).

>und wie kann ich auf ein einzelnes Zeichen innerhalb dieses Arrays zugreifen?
Z.B. so
1
lcd_data(*data);

>Wie kann ich bei diesem Controller die Display Linie wechseln und die Cursor
>Position festlegen?
Siehe Seite 16 Punkt 8 im Datenblatt
>http://www.datasheetcatalog.org/datasheet/SamsungElectronic/mXuuzvr.pdf

von Micha (Gast)


Lesenswert?

>Wie kann ich bei diesem Controller die Display Linie wechseln und die Cursor
>Position festlegen?
Siehe dazu auch Seite 9 im Datenblatt.

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.