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