Hallo liebe Forumgemeinde, Ich habe bereits einiges mit Mikrocontrollern gemacht, meist mit einem ATmega 8 und habe damit auch schon LCD Module ähnlicher Art über den 4 Bit Modus betrieben. Nun habe ich mir eine kleine Schaltung mit ein paar Tastern, einer LED, einem Piezo, einem ATtiny 2313 und dem besagten Display mit einem HD47780 kompatiblen Kontroller gebastelt. Das Display ist an den PORTB des tinys angeschlossen. Die Datenleitungen an den Bits 0..3 und die Enable Leitung auf Pin 6 und die RS Leitung auf Pin 7. Die R/W Leitung habe ich auf Erde gelegt. Nun habe ich versucht, meine bereits funktionierenden Beispiele vom ATmega und einem anderen DIsplay an das Display anzupassen. Das hat nichts bewirkt. Dann habe ich angefangen zu googlen und bin auf zwei Code Beispiele hier im Forum gestoßen, die ich auch ausprobiert habe, die jedoch beide nur komische Ausgaben hervorgebracht haben( genauer, Zeichen auf dem Ganzen DIsplay, am meisten Schwarze Felder). Dann habe ich versucht die Kommunikation selbst zu implementieren in dem angehängetn Code Beispiel. Das hat dann wieder nicht zu der gewünschten Ausgeabe geführt, sondern nur ein komisches Zeichen auf einer Position ausgegeben und den Cursor in der 2. Zeile Blinken lassen. Nun frage ich mich, was das Problem ist. Ich schließe einen Hardware Fehler aus, da das Display ja anscheinend initialisiert wird und auch irgendetwas ausgibt. Aber was kann es dann sein? Falls noch Fragen da sind, die ich noch nicht beantwortet habe, bitte Fragen. Vielen Dank schon mal im vorraus lifesbest23
Also bei mir geht es mit folgendem Code wunderbar:
1 | struct bits { |
2 | u8 b0:1; |
3 | u8 b1:1; |
4 | u8 b2:1; |
5 | u8 b3:1; |
6 | u8 b4:1; |
7 | u8 b5:1; |
8 | u8 b6:1; |
9 | u8 b7:1; |
10 | } __attribute__((__packed__)); |
11 | |
12 | #define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
|
13 | |
14 | |
15 | #define LCD_D4 SBIT( PORTD, 0 )
|
16 | #define LCD_DDR_D4 SBIT( DDRD, 0 )
|
17 | |
18 | #define LCD_D5 SBIT( PORTD, 1 )
|
19 | #define LCD_DDR_D5 SBIT( DDRD, 1 )
|
20 | |
21 | #define LCD_D6 SBIT( PORTD, 2 )
|
22 | #define LCD_DDR_D6 SBIT( DDRD, 2 )
|
23 | |
24 | #define LCD_D7 SBIT( PORTD, 3 )
|
25 | #define LCD_DDR_D7 SBIT( DDRD, 3 )
|
26 | |
27 | #define LCD_RS SBIT( PORTD, 7 )
|
28 | #define LCD_DDR_RS SBIT( DDRD, 7 )
|
29 | |
30 | #define LCD_E0 SBIT( PORTD, 4 )
|
31 | #define LCD_DDR_E0 SBIT( DDRD, 4 )
|
32 | |
33 | #define LCD_on() PORTC |= (1<<PC4)
|
34 | #define LCD_off() PORTC &= ~(1<<PC4)
|
35 | |
36 | static void lcd_nibble( u8 d ) |
37 | {
|
38 | LCD_D4 = 0; if( d & 1<<4 ) LCD_D4 = 1; |
39 | LCD_D5 = 0; if( d & 1<<5 ) LCD_D5 = 1; |
40 | LCD_D6 = 0; if( d & 1<<6 ) LCD_D6 = 1; |
41 | LCD_D7 = 0; if( d & 1<<7 ) LCD_D7 = 1; |
42 | |
43 | LCD_E0 = 1; |
44 | _delay_us( 1 ); // 1us |
45 | LCD_E0 = 0; |
46 | }
|
47 | |
48 | |
49 | static void lcd_byte( u8 d ) |
50 | {
|
51 | lcd_nibble( d ); |
52 | lcd_nibble( d<<4 ); |
53 | _delay_us( 45 ); // 45us |
54 | }
|
55 | |
56 | |
57 | void lcd_command( u8 d ) |
58 | {
|
59 | LCD_RS = 0; |
60 | lcd_byte( d ); |
61 | switch( d ){ |
62 | case 1: |
63 | case 2: |
64 | case 3: _delay_ms( 2 ); // wait 2ms |
65 | }
|
66 | }
|
67 | |
68 | /* Print single char from RAM and/or send data */
|
69 | void lcd_data( u8 d ) |
70 | {
|
71 | LCD_RS = 1; |
72 | lcd_byte( d ); |
73 | }
|
74 | |
75 | void lcd_init( void ) |
76 | {
|
77 | uint8_t i=0; |
78 | LCD_DDR_D4 = 1; |
79 | LCD_DDR_D5 = 1; |
80 | LCD_DDR_D6 = 1; |
81 | LCD_DDR_D7 = 1; |
82 | LCD_DDR_RS = 1; |
83 | LCD_DDR_E0 = 1; |
84 | |
85 | _delay_ms(50); |
86 | |
87 | LCD_E0 = 0; |
88 | LCD_RS = 0; // send commands |
89 | _delay_ms( 15 ); // wait 15ms |
90 | |
91 | lcd_nibble( 0x30 ); |
92 | _delay_ms( 5 ); // wait >4.1ms |
93 | |
94 | lcd_nibble( 0x30 ); |
95 | _delay_us( 100 ); // wait >100µs |
96 | |
97 | lcd_nibble( 0x30 ); // 8 bit mode |
98 | _delay_us( 100 ); // wait >100us |
99 | |
100 | lcd_nibble( 0x20 ); // 4 bit mode |
101 | _delay_us( 100 ); // wait >100us |
102 | |
103 | lcd_command( 0x28 ); // 2 lines 5*7 |
104 | lcd_command( 0x08 ); // display off |
105 | lcd_command( 0x01 ); // display clear |
106 | lcd_command( 0x06 ); // cursor increment |
107 | lcd_command( 0x0C ); // on, no cursor, no blink |
108 | |
109 | /* lets insert our custon chars
|
110 | * to adress 0x00 in CG-RAM
|
111 | */
|
112 | lcd_command( 0x40 ); |
113 | while(i < 8) |
114 | lcd_data(pgm_read_byte(&custom_chars[i++])); |
115 | |
116 | |
117 | lcd_command( 0x01 ); // clear screen |
118 | |
119 | }
|
:
Bearbeitet durch User
Da ich GCC verwende müsste ich ja u8 durch uint8_t ersetzen, oder?
Und woher kommt die Funktion pgm_read_byte und das custom_chars Array? kann ich die ganze while schleife einfach durch ein
1 | lcd_data('H'); |
ersetzen?
Ok, jetzt zeigt es ein H in der zweiten Position an. Es sollte zwar die erste sein, aber zumindest ist es das richtige Zeichen. Vielen Dank Timmo :) Ach und das man die while Schleife durch was ersetzen soll, ist unsinn. Ich habe sie einfach nur auskommentiert.
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.