Hallo liebe Leute,
so... hier der 1000ste 44780-lcd-Beitrag : )
Ich mach's kurz:
Entwicklungsboard mikroelektronika easyavr5a
uc Atmega8
c mit winavr/gcc
2x16 LCD, Industriestandard
Leine Busy-Abfrage (RW nicht geroutet)
Verdrahtung fix, siehe header.
Hier der Header für die LCD-Funktionen:
| 1 | /* lcd-routinen hd44780 4-bit */
 | 
| 2 | 
 | 
| 3 | #include <util/delay.h>
 | 
| 4 | #include <inttypes.h>
 | 
| 5 | 
 | 
| 6 | #define _lcdport   PORTD
 | 
| 7 | #define _lcddirection  DDRD
 | 
| 8 | #define _rs    PD2
 | 
| 9 | #define _en    PD3
 | 
| 10 | #define _d4    PD4
 | 
| 11 | #define _d5    PD5
 | 
| 12 | #define _d6    PD6
 | 
| 13 | #define _d7    PD7
 | 
| 14 | 
 | 
| 15 | 
 | 
| 16 | void initlcd (void);
 | 
| 17 | void lcden (void);
 | 
| 18 | void lcdcom (uint8_t sendbyte);
 | 
| 19 | void lcddata (uint8_t sendbyte);
 | 
| 20 | void lcdstring (char *stringpointer);
 | 
| 21 | char lcdcursor (uint8_t line, uint8_t column);
 | 
| 22 | 
 | 
| 23 | void initlcd (void) {
 | 
| 24 | _delay_ms(20);
 | 
| 25 | _delay_ms(20);
 | 
| 26 | _delay_ms(20);
 | 
| 27 | _delay_ms(20);
 | 
| 28 | _delay_ms(20);
 | 
| 29 | 
 | 
| 30 |   _lcddirection|=(1<<_rs)|(1<<_en)|(1<<_d4)|(1<<_d5)|(1<<_d6)|(1<<_d7);
 | 
| 31 |   _lcdport|=(1<<_d6)|(1<<_d7);  // init command 0x30
 | 
| 32 |   lcden();
 | 
| 33 |   _delay_ms(20);
 | 
| 34 |   lcden();
 | 
| 35 |   _delay_ms(20);
 | 
| 36 |   lcden();
 | 
| 37 |   _delay_ms(20);
 | 
| 38 |   _lcdport=(1<<_d5);    // init command 0x20 4-bit-mode
 | 
| 39 |   _delay_ms(20);
 | 
| 40 |   lcdcom(0b00101000);
 | 
| 41 |   lcdcom(0b00001100);
 | 
| 42 |   lcdcom(0b00010100);
 | 
| 43 |   lcdcom(0b00000110);
 | 
| 44 |   lcdcom(0b00000001);
 | 
| 45 |   lcdcom(2);
 | 
| 46 |   _delay_ms(20);
 | 
| 47 | 
 | 
| 48 |   }
 | 
| 49 |   
 | 
| 50 | void lcden (void) {      // enable-pulse 
 | 
| 51 |   _lcdport|=(1<<_en);
 | 
| 52 |   _delay_ms(1);
 | 
| 53 |   _lcdport&=~(1<<_en);
 | 
| 54 |   _delay_ms(1);
 | 
| 55 |   }
 | 
| 56 |   
 | 
| 57 | void lcdcom (uint8_t sendbyte) {
 | 
| 58 | _lcdport=sendbyte;      // erst upper nibble
 | 
| 59 | _lcdport=_lcdport&0xF0;      // mask lower nibble
 | 
| 60 | lcden();        
 | 
| 61 | sendbyte=sendbyte<<4;      // lower nibble hochschieben
 | 
| 62 | _lcdport=sendbyte;          
 | 
| 63 | _lcdport=_lcdport&0xF0;      // mask lower nibble    
 | 
| 64 | lcden();
 | 
| 65 | }
 | 
| 66 | 
 | 
| 67 | void lcddata (uint8_t sendbyte) {
 | 
| 68 | _lcdport=sendbyte;      // erst upper nibble
 | 
| 69 | _lcdport=_lcdport&0xF0;      // mask lower nibble
 | 
| 70 | _lcdport|=(1<<_rs);      // rs setzen, daten
 | 
| 71 | lcden();              
 | 
| 72 | sendbyte=sendbyte<<4;      // lower nibble hochschieben
 | 
| 73 | _lcdport=sendbyte;          
 | 
| 74 | _lcdport=_lcdport&0xF0;      // mask lower nibble
 | 
| 75 | _lcdport|=(1<<_rs);      // rs setzen, daten        
 | 
| 76 | lcden();              
 | 
| 77 | _lcdport&=~(1<<_rs);      // rs zurücksetzen
 | 
| 78 | 
 | 
| 79 | 
 | 
| 80 | void lcdstring (char *stringpointer){
 | 
| 81 |   while(*stringpointer)
 | 
| 82 |     lcddata(*stringpointer++);
 | 
| 83 |   }
 | 
Jetzt die Preisfrage:
Wenn ich den header includiere, die init gefolgt von einer Textausgabe 
aufrufe, passiert folgendes:
- Es werden je nach Text tlw. völlig sinnlose Zeichen ausgegeben. So 
führt zum Beispiel der String "Test" zur Ausgabe von "Test". Der String 
"KURTKROEMER" bringt aber "D_einhalb_U%". Mehr als vier Zeichen werde 
nie angezeigt. Selstamerweise verhält es sich bei einem Einzelnen 
Zeichen (gehen auch nich alle. "Q" z.B. geht) so, dass exakt jeder 
zweite Reset eine Ausgabe bringt. In den Resets dazwischen wird nichts 
angezeigt.
Hat jemand die Glaskugel gerade NICHT in reparatur und eine Idee?
Oder vielleicht zufällig gerade was in der Richtung aufgebaut, um den 
Code an einem Anderen Display zu testen?
Tausen Dank im Voraus,
Thomas