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.
