Ich versuch einfach mal ein simples lcd anzusteuern aber es funktioniert leider nicht! Ich vermute die Initialisierung ist vielleicht falsch Mein mikrocontrollerist Pic 16F648A mein Stromlaufplan sieht so aus(sehen sie bitte das bild) -> LCD Module 162f BC BC Meine code : #include <INLINE.H> // Ist fuer Assembleranweisungen notwendig #include <MATH16.H> /****************** Portbelegung ********************************************************/ #define RB4 4 #define RB5 5 #define RA0 0 #define RA3 3 //#define LCD_Enable 2 //RA2 //#define LCD_RS 1 //RA1 //#pragma bit LCD_Enable @ PORTA.2 //#pragma bit LCD_RS @ PORTA.1 #define LCD_RS 0b.00000010 //RS-Pin ist Bit 1, RA1 #define LCD_En 0b.00000100 //Enable-Pin ist Bit 2, RA2 #pragma config |= 0b.11111110100010 // Konfigurationswort // Bit 4,1-0: FOSC=HS (010) // Bit 2 : WDTE=OFF (0) // Bit 3 : PWRTE=ON (0) // Bit 5 : MCLRE( RESET-Pin )=1 // Bit 6 : BODEN=off(0) // Bit 7 : LVP =1 = RB4/PGM pin has PGM function, low-voltage programming enabled // Bit 8 : CPD =OFF (1) // Bit 12-9 : Unimplemented // Bit 13 : CP=OFF (1) /****************** Konstanten **********************************************************/ #define degre 0b11011111 // Das Zeichen ° für Temperatur // die Display Befehle #define CLEAR_DISPLAY 0x01 // DB1 wird gesetzt #define CURSOR_HOME 0x02 // DB2 wird gesetzt #define SET_FUNKTION 0x20 // DB5 wird gesetzt #define ACHT_BIT_MODE 0x10 // DB4 wird gesetzt #define ZWEI_LINE 0x08 // DB3 wird gesetzt #define DOTs_5x10 0x04 // DB2 wird gesetzt #define DISPLAY_CURSER_MODE 0x08 // DB3 wird gesetzt #define DISPLAY_ON 0x04 // DB2 wird gesetzt #define CURSER_ON 0x02 // DB1 wird gesetzt #define BLINKING_ON 0x01 // DB0 wird gesetzt #define ENTRY_MODE_SET 0x04 // DB2 wird gesetzt #define INKREMENT 0x02 // DB1 wird gesetzt #define DISPLAY_IS_SHIFTED 0x01 // DB0 wird gesetzt #define code1 0x3F // 00111111 #define code2 0xFF // 11111111 #define code3 0xFF // 11111111 void delay_us(char micro) { #asm pause nop nop decfsz micro,f goto pause #endasm } void delay_ms( uns16 ms) { while(ms) // Schleife verlassen wen ms=0 ist { OPTION = 2; // Vorteiler auf 8 einstellen TMR0 = 131; // 125 * 8 = 1000 (= 1 ms) while (TMR0); // abwarten einer Milisekunde ms--; // "ms" mit jeder Milisekunde ernidrigen } } void display_enable(void) { PORTA|=LCD_En; //LCD_Enable=1; delay_us(1); // kurze Pause PORTA &=~(LCD_En); //LCD_Enable=0; } void display_befehl(unsigned char command) { PORTA &=~LCD_RS; //RS auf 0 setzen PORTB &= 0xC0; // 11000000 PORTB |= (command & 0x3F); // 3F= 00111111 // D6 an PORTA.3, D7 an PORTA.0 if (command & 0x40) // 1000000 PORTA |= 0x40; else PORTA &= ~0x40; if (command & 0x80) //10000000 PORTA |= 0x80; else PORTA &= ~0x80; display_enable(); delay_ms(1); } void display_zeichen(unsigned char zeichen) { PORTA|=LCD_RS; // RS auf 1 setzen--> LCD soll das Zeichen anzeigen PORTB &= 0xC0; // 11000000 PORTB |= ( zeichen & 0x3F); // 00111111 // D6 an PORTA.3, D7 an PORTA.0 if ( zeichen & 0x40) // 1000000 PORTA |= 0x40; else PORTA &= ~0x40; if ( zeichen & 0x80) //10000000 PORTA |= 0x80; else PORTA &= ~0x80; display_enable(); delay_ms(1); } // Sende den Befehl zur Löschung des Displays void display_clear(void) { display_befehl(CLEAR_DISPLAY); delay_ms(5); } void display_init(void) { delay_ms(15); //PORTA &=~(1<<LCD_RS); display_befehl(0x30); delay_ms(5); display_befehl(0x30); delay_us(100); display_befehl(0x30); delay_us(100); display_befehl( SET_FUNKTION | ACHT_BIT_MODE | ZWEI_LINE ); // 8Bit Modus 2 Zeilen 5x7 display_befehl(DISPLAY_CURSER_MODE ); // Display aus Cursor aus kein Blinken display_clear(); // Display Clear display_befehl(ENTRY_MODE_SET | INKREMENT); // inkrement / Keine shift } // Sendet den Befehl: Cursor Home void cursor_return_home(void) { display_befehl(CURSOR_HOME); delay_ms(5); } // setzt den Cursor in Zeile und Spalte void set_cursor(unsigned char x, unsigned char y) { display_befehl(DISPLAY_CURSER_MODE | DISPLAY_ON | CURSER_ON); unsigned char position = 0; switch (x) { case 1: position = 0x80 + 0x00 + y; break; // 1er Zeile case 2: position = 0x80 + 0x40 + y; break; // 2er Zeile } display_befehl(position); // Curser-Unterstrich ausblinden display_befehl(DISPLAY_CURSER_MODE| DISPLAY_ON ); } // Schreibt einen String auf das LCD void display_string(const char *string) { while(*string) { display_zeichen(*string); string++; } } void main(void) { char c = 'a'; const char *str = "abcd"; CMCON=0x07; // CMCON = 0b00000111.... Porta=digital I/O TRISA=0b.10110000; TRISB=0b.11000000; display_init(); display_clear(); display_string(c); display_clear(); display_string(str); // set PB7 as output TRISB &= ~0x80; while(1){ PORTB ^= 0x80; } }
>sehen sie bitte das bild
Welches Bild? Das ist ein Word Dokument.
Wer zieht sich sowas schon rein ;)
Als erstes: char c = 'a'; display_string(c); char ist kein String sondern nur ein Zeichen. Beide Zeilen schon mal entsorgen. Das kann so nicht gehen. Was sollen die Dioden und Pulldowns an deinem Display? Dein Bild sagt fast nichts über deinen Anschluss des LCD aus. Welches Text-Display hat schon 34 Pins? Laut deinem Quellcode 8 Bit Ansteuerung. Trag mal Werte in deine Schaltung ein.
Die Schaltung ist nicht von mir gemacht. ich sollte nur Software ….
wieviel Stunden hast Du dich mit dem Problem schon beschäftigt?
Seit ein paar Tagen versuche ich dieses Problem zu lösen aber klappt leider nicht
>Seit ein paar Tagen versuche ich dieses Problem zu lösen aber klappt >leider nicht Das Programm sieht doch gar nicht so schlecht aus. Hat schon mal irgendwer das Display mit dieser Beschaltung zum laufen gebracht? Die Größe der Pulldowns könnte ein Problem sein. Das Display hat evtl. interne Pullups. Wegen der Dioden könnte es also passieren das das Display keinen anständigen Lowpegel mehr bekommt. Also weg mit den Dioden (überbrücken) und den Pulldowns (entfernen). R9 oder R10 könnten für das Backlight sein. Welcher von beiden kann ich dir nicht sagen. Problem: Wahrscheinlich ist einer der beiden ein Pulldown für RW. Der müsste eigentlich auch gebrückt werden. Falls man da den falschen erwischt ist das Backlight hin ! R12 und R11 sind für den Kontrast. Da sollte man besser einen 22k Trimmer für nehmen. Versuchsweise mal R11 kurzschliessen. Mehr als das das Display komplett schwarz wird passiert dann nicht.
>R9 oder R10 könnten für das Backlight sein. >Welcher von beiden kann ich dir nicht sagen. R10 hängt ja an Plus ;) Also R9 brücken.
Mein Programm läuft Fehler frei. aber statt erwünschter String zu bekommen, bekomme ich nur fff .ich weiß nicht wovon es hängt ab.
>Hat schon mal irgendwer das Display mit dieser Beschaltung >zum laufen gebracht? Ja aber nicht C sondern mit assembler
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.