Source Code und Doku zum Anschluss eines Standart LCDs an einen AVR µC. Mfg Ulrich Radig
Hallo Ulrich, ich hätte eine Frage zur Doku, Seite 4, ganz unten. Das stimmt doch nicht, wie du es angegeben hast, oder ? Hat das 4x20 schon zwei Controller ? Ich kenne das so, wie im Anhang. Hab allerdings auch schon gehört, das es da wohl Abweichungen geben soll. Gruß Thorsten
Hallo, Ja das 4 x 20 hat 2 Controller somit 2 Enable Signale, werde ich noch in der Doku ändern. Mfg Ulrich
Normalerweise hat ein 4x20 nur einen Controller, jedenfalls reicht er aus und andere hab ich noch nie gesehen. Das 4x27, was es bei Pollin gerade gibt, hat es zwei Controller.
Hallo Ulrich, ich habe deinen Quelltext leicht abgeändert (anpassen an den WinAVR Compiler, der kein sbi und cbi mehr kennt) übernommen und das LCD an PortD an einem Mega88 angeschlossen. Hier die Quelltextauszüge: main.h
1 | // LCD 2x16 auf Port D
|
2 | #define LCD_ZEILEN 2 //Anzahl der Zeilen 1,2 oder 4
|
3 | #define LCD_DDR DDRD //Port an dem das Display angeschlossen wurde
|
4 | #define LCD_OUT PORTD
|
5 | #define LCD_IN PIND
|
6 | #define LCD_RS 4 //Pin für RS
|
7 | #define LCD_RW 5 //Pin für Read/Write
|
8 | #define LCD_E 6 //Pin für Enable
|
9 | #define LCD_DATAOUTPUT 0x0f
|
10 | #define LCD_DATAINPUT 0x00
|
main.c
1 | void lcd_init () |
2 | {
|
3 | char tmp = LCD_ZEILEN; |
4 | //Set Port Direction Register to Output for LCD Databus und LCD
|
5 | Steuerbus
|
6 | LCD_DDR = LCD_DATAOUTPUT+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E); |
7 | //Wait a short Time afer Power on
|
8 | _delay_ms(500); |
9 | lcd_write (0x22,0); //Init in 4 Bit Mode |
10 | //Wait a short Time afer Power on
|
11 | _delay_ms(50); |
12 | lcd_write (0x22,0); //Init in 4 Bit Mode (Zur Sicherheit nochmal) |
13 | if (tmp == 1) |
14 | {
|
15 | lcd_write (0x20,0); //1 Zeilen |
16 | }
|
17 | else
|
18 | {
|
19 | lcd_write (0x28,0); //mehrere Zeilen |
20 | }
|
21 | lcd_write (0x0C,0); //Display On |
22 | lcd_write (0x80,0); //Set DD-Ram Adresse = 0 |
23 | return; |
24 | }
|
25 | |
26 | // by Ulrich Radig
|
27 | // löscht das LCD, den Text im Buffer des LCD-Structs,
|
28 | // die Cursor-Eigenschaften (nicht sichtbar, Position 0, etc.)
|
29 | void lcd_clear () |
30 | {
|
31 | lcd_write (1,0); //Clear Display |
32 | lcd_write (0x80,0); //Set DD-Ram Adresse = 0 |
33 | return; |
34 | }
|
35 | |
36 | void lcd_clear () |
37 | {
|
38 | lcd_write (1,0); //Clear Display |
39 | lcd_write (0x80,0); //Set DD-Ram Adresse = 0 |
40 | return; |
41 | }
|
42 | |
43 | void lcd_write (char data, char type) |
44 | {
|
45 | //Set Port Direction Register to Output for LCD Databus und LCD
|
46 | Steuerbus
|
47 | LCD_DDR = LCD_DATAOUTPUT+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E); |
48 | //Soll ins Seuer oder Datenregister geschrieben werden?
|
49 | if (type == 0) |
50 | {
|
51 | (LCD_OUT &= ~(1<<LCD_RS)); // cbi(LCD_OUT,LCD_RS); //RS = 0 |
52 | Steuerregister
|
53 | }
|
54 | else
|
55 | {
|
56 | (LCD_OUT |= (1<<LCD_RS)); // sbi(LCD_OUT,LCD_RS); //RS = 1 |
57 | Dataregister
|
58 | }
|
59 | //Schreibsignal setzen
|
60 | (LCD_OUT &= ~(1<<LCD_RW)); // cbi(LCD_OUT,LCD_RW); //Zum Schreiben |
61 | RW-Pin = Low |
62 | //Schreiben der 1. 4Bit an das LCD Display
|
63 | LCD_OUT = ((LCD_OUT & 0xF0) + ((data & 0xF0)>>4)); //Write Nibbel MSB |
64 | (LCD_OUT |= (1<<LCD_E)); // sbi(LCD_OUT,LCD_E); |
65 | (LCD_OUT &= ~(1<<LCD_E)); // cbi(LCD_OUT,LCD_E); |
66 | //Schreiben der 2. 4Bit an das LCD Display
|
67 | LCD_OUT = (LCD_OUT&0xF0) + (data&0x0F); //Write Nibbel LSB |
68 | (LCD_OUT |= (1<<LCD_E)); // sbi(LCD_OUT,LCD_E); |
69 | (LCD_OUT &= ~(1<<LCD_E)); // cbi(LCD_OUT,LCD_E); |
70 | |
71 | //loop_until_bit_is_clear(Read_LCD(0),BusyBit); //Wartet bis LCD
|
72 | wieder bereit |
73 | return; |
74 | }
|
75 | |
76 | int main () |
77 | {
|
78 | lcd_init(); // LCD initialiseren |
79 | lcd_clear(); |
80 | |
81 | // 2do test
|
82 | for(;;) |
83 | lcd_write('a',1); |
84 | }
|
Und jetzt das Problem: Das LCD (Batron BT 2160)initialisert nur eine Zeile. Wo liegt das Problem? Ich seh keines, müsste eigentlich funktionieren.
OK, hat sich erledigt, ich habe unvorsichtigerweise in der Fkt lcd_write in Zeile 71 die Abfrage des Busy-Bits rausgenommen. Nun habe ich einfach eine delay-Fkt eingesetzt und nun geht es.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.