Hallo, ich habe dieses (http://www.reichelt.de/?;ACTION=3;LA=0;GROUPID=3005;ARTICLE=31653;APE=0;SID=31dmHv86wQAR8AAAOeeEo31c9a0fc77def4657a3a3e06e3a57f37) display, und möchte es im 4-Bit-Modus ansteuern. Dazu ahbe ich hier im Forum ein Beispielprogramm in C gefunden. Jedoch zeigt das Display nach dem Anschließen an einen Port in der unteren Reihe nur schwarze Balken an. Egal welcher Port, egal ob ein Programm auf dem µC ist oder nicht. Woran kann das ligen?
>Woran kann das ligen? keine Ahnung, meine Glaskugel ist gerade in Reparatur Einfach so fällt mir ein: stimmt der Kontrast? sonst: -alles durchmessen -Code+Schaltplan zeigen ein bisschen lesen wird nicht dir nicht Schaden: http://sprut.de/electronic/lcd/index.htm http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
> Woran kann das liegen? Nach der Aussage: >Jedoch zeigt das Display nach dem Anschließen an einen Port in der > unteren Reihe nur schwarze Balken an. Egal_ _welcher Port, egal ob ein > Programm auf dem µC ist oder nicht. ...liegt es daran, dass du nicht weisst, was du tust, oder? - Schaltplan - Programm Das ist das mindeste, was du uns zur Verfügung stellen solltest. Dann können wir dir auch helfen. Ralf
Hier die Dateien: C-Datei:
1 | /*
|
2 | LCD4b.c
|
3 | ---------------------------------------------------------------------------------------
|
4 | LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
|
5 | ---------------------------------------------------------------------------------------
|
6 | */
|
7 | |
8 | #include <avr/io.h> |
9 | #include "lcd4b.h" |
10 | #include <avr/delay.h> |
11 | |
12 | |
13 | int main(void) |
14 | {
|
15 | DDRD |= 0b11111100; //Pins 2-7 als Ausgänge |
16 | |
17 | DDRC = 0xff; |
18 | _delay_ms(2000); |
19 | PORTC=0x00; |
20 | _delay_ms(500); |
21 | PORTC=0xff; |
22 | |
23 | lcd_linit(); //LCD Initialisieren |
24 | lcd_clear(); //Display löschen |
25 | lcd_out("Hallo Welt"); //Text ausgeben |
26 | lcd_command(line2); //2. Zeile |
27 | lcd_out("!!!"); //Text ausgeben |
28 | |
29 | while(1); |
30 | }
|
31 | |
32 | |
33 | // sendet ein Datenbyte an das LCD
|
34 | void lcd_data(char byte) |
35 | {
|
36 | char sich_byte; |
37 | sich_byte = byte; |
38 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen |
39 | byte |= (1<<lcd_rs); //RS setzen |
40 | PORT = byte; //oberes Nibbel Ausgeben |
41 | lcd_enable(); |
42 | |
43 | byte = sich_byte; |
44 | byte = byte<<4; //Nibbles vertauschen |
45 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen |
46 | byte |= (1<<lcd_rs); //RS setzen |
47 | PORT = byte; //unteres Nibbel Ausgeben |
48 | lcd_enable(); |
49 | |
50 | kpause(); |
51 | }
|
52 | |
53 | //sendet einen Befehl an das LCD
|
54 | void lcd_command(char byte) |
55 | { //wie lcd_data, nur ohne RS zu setzen |
56 | char sich_byte; |
57 | sich_byte = byte; |
58 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen |
59 | PORT = byte; //oberes Nibbel Ausgeben |
60 | lcd_enable(); |
61 | |
62 | byte = sich_byte; |
63 | byte = byte<<4; //Nibbles vertauschen |
64 | byte &= ~0x0f; //Bit 0-3 auf 0 setzen |
65 | PORT = byte; //unteres Nibbel Ausgeben |
66 | lcd_enable(); |
67 | |
68 | kpause(); |
69 | }
|
70 | |
71 | //erzeugt den Enable-Puls
|
72 | void lcd_enable(void) |
73 | {
|
74 | PORT |= (1<<lcd_e); //Enable auf High |
75 | kpause(); //kurze pause |
76 | PORT &= ~(1<<lcd_e); //Enable auf Low |
77 | }
|
78 | |
79 | //Pause nach jeder Übertragung
|
80 | void kpause(void) |
81 | {
|
82 | _delay_us(48); //48us Pause |
83 | }
|
84 | |
85 | |
86 | //Längere Pause für manche Befehle
|
87 | void lpause(void) |
88 | {
|
89 | _delay_ms(5); //5ms Pause |
90 | }
|
91 | |
92 | //Initialisierung
|
93 | void lcd_linit(void) //Wenn der Display gleich nachdem er mit Spannung versorgt wurde |
94 | { //in Betrieb genommen werden soll |
95 | unsigned char i; |
96 | for(i=0;i<10;i++) |
97 | {
|
98 | _delay_ms(10); |
99 | }
|
100 | lcd_init(); |
101 | }
|
102 | |
103 | //Initialisierung
|
104 | void lcd_init(void) |
105 | {
|
106 | PORT = 0b00100000; //Interface auf 4-Bit setzen |
107 | |
108 | lcd_enable(); |
109 | lpause(); |
110 | |
111 | |
112 | lcd_command(0b00101000); // 2-zeilig, 5x8-Punkt-Matrix |
113 | lcd_command(0b00001100); // Display ein |
114 | lcd_command(0b00000110); // Kursor nach rechts wandernd, kein Display shift |
115 | }
|
116 | |
117 | //Sendet den Befehl zur Löschung des Displays
|
118 | void lcd_clear(void) |
119 | {
|
120 | lcd_command(0x01); |
121 | lpause(); |
122 | }
|
123 | |
124 | //gibt einen Text aus
|
125 | void lcd_out(char *s) |
126 | {
|
127 | while (*s) //so lange *s != '\0' also ungleich dem "String-Endezeichen" |
128 | {
|
129 | lcd_data(*s); //Zeichen ausgeben |
130 | s++; |
131 | }
|
132 | }
|
133 | /*
|
134 | -----------------------------------------------------------------------------------------------
|
135 | LCD4b developed by Johannes K.
|
136 | -----------------------------------------------------------------------------------------------
|
137 | */
|
und die Headerdatei:
1 | /*
|
2 | LCD4b.h
|
3 | ---------------------------------------------------------------------------------------
|
4 | LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
|
5 | ---------------------------------------------------------------------------------------
|
6 | Für die Ansteuerung des Displays werden 6 Pins benötigt.
|
7 | |
8 | Pinbelegung:
|
9 | PORT Pin lcd_rs RS
|
10 | PORT Pin lcd_e E
|
11 | PORT Pin 4 Datenbit 4
|
12 | PORT Pin 5 Datenbit 5
|
13 | PORT Pin 6 Datenbit 6
|
14 | PORT Pin 7 Datenbit 7
|
15 | R/W und Datenbits 0-3 auf GND
|
16 |
|
17 | PORT, lcd_rs, lcd_e können frei gewählt werden
|
18 | |
19 | Software:
|
20 | AVR-GCC 3.3
|
21 | AVR Libc 1.2.3
|
22 |
|
23 | Hardware:
|
24 | AVR-uController
|
25 | */
|
26 | #ifndef F_CPU
|
27 | #define F_CPU 1000000UL //Prozessor Frequenz in Hz
|
28 | #endif
|
29 | |
30 | #define lcd_e 3 //E Pinnummer
|
31 | #define lcd_rs 2 //RS Pinnummer
|
32 | #define PORT PORTD //Portname
|
33 | |
34 | #define line1 0b10000000 //Adresse im Speicher des LCD-Controllers für die 1. Zeile
|
35 | #define line2 0b11000000 //Adresse im Speicher des LCD-Controllers für die 2. Zeile
|
36 | |
37 | extern void lcd_data(char byte); |
38 | extern void lcd_command(char byte); |
39 | extern void lcd_enable(void); |
40 | extern void kpause(void); |
41 | extern void lpause(void); |
42 | extern void lcd_linit(void); |
43 | extern void lcd_init(void); |
44 | extern void lcd_clear(void); |
45 | extern void lcd_out(char *s); |
46 | /*
|
47 | -----------------------------------------------------------------------------------------------
|
48 | LCD4b developed by Johannes K.
|
49 | -----------------------------------------------------------------------------------------------
|
50 | */
|
Belegung: Pins (LCD) 1, 3, 5 und 7-10 an Masse Pins (LCD) 11-14 an PORTD 4-7 E wie beschrieben an 3 und rs an 2
Mir ist selber noch ein möglicher Fehler eingefallen. DB4 soll ja an Pin4. Ist Pin4 von 0 oder 1 an gezählt?
anzeige schrieb: > Mir ist selber noch ein möglicher Fehler eingefallen. > > DB4 soll ja an Pin4. Ist Pin4 von 0 oder 1 an gezählt? Hi, ich würde sagen da solltest du mal ins Datenblatt des Display schauen wie der Hersteller es benennt! Möglich ist beides... Gruß Carsten
Beim STK500 ist Pin4 der, neben dem Px4 (x=A oder B oder C oder D) steht.
Gut, dann wird das vielleicht mein Fehler sein. Ich habe E und RS dann auf die STK500-Pins 1 und 2 gelegt, und die Bits 4-7 auf die STK500-Pins 3-6. Wie kann ich in der Software das jetzt wieder "gradebiegen"? E und RS kann ich einfach im Header ändern. Wie geht das für die Datenbits?
Pins (LCD) 11-14 müssen auf die STK500-Pins 4-7 des entsprechenden Ports (bei deinem geposteten Code PortD). Ist doch viel einfacher als die Software umzuschreiben?
Das würde ich eben wissen, was man machen muss, um die 4 Bits um ein Pin zu verschieben. Bei E und RS war es ja ganz einfach.
Hi >Das würde ich eben wissen, was man machen muss, um die 4 Bits um ein Pin >zu verschieben. Bei E und RS war es ja ganz einfach. Dann musst du aber noch die Software umschreiben. Das > char sich_byte; > sich_byte = byte; > byte &= ~0x0f; //Bit 0-3 auf 0 setzen > byte |= (1<<lcd_rs); //RS setzen > PORT = byte; //oberes Nibbel Ausgeben > lcd_enable(); > byte = sich_byte; > byte = byte<<4; //Nibbles vertauschen > byte &= ~0x0f; //Bit 0-3 auf 0 setzen > byte |= (1<<lcd_rs); //RS setzen > PORT = byte; //unteres Nibbel Ausgeben > lcd_enable(); basiert darauf, das Bit4..7 an Port4..7 hängen. Reichen deine C-Kenntnisse aus, das anzupassen? MfG Spess
Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links geschoben werden. Wie weiß ich aber nicht.
Hi >Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links >geschoben werden. Wie weiß ich aber nicht. Meine C-Kenntnisse sind nur rudimentär, aber wie wäre es mit '>>'? MfG Spess
Hi Nachtrag: >Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links >geschoben werden. Wie weiß ich aber nicht. Nicht links, sondern rechts. MfG Spess
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.