Hallo,
warum benutzt ihr nicht die Standart LCD Befehle von Bascom? Damit kann man doch soo einfach ein 4*20 Display ansteuern!!
Gruß Michi
Hallo!
Auch wenn ich so langsam anfange zu nerven...
Ich habe ja mein LCD nun mit der Library von Ronny angesteuert.
Text funktioniert auch tadellos, aber es werden keine Zahlen angezeigt.
Hier mal mein Programm:
Das LCD sieht nun folgendermassen aus:Code:$regfile = "m8def.dat" 'für ATMEL ATmega8 $crystal = 11059200 'Quarz: 11,0592 MHz $lib "dip_lcd.lib" Ddrc = &B00001111 Ddrb = &B00110000 Config Lcd = 20 * 4a Initlcd Cls 'Pin PB0-PB3 auf Out Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim W As Word , Channel As Byte Dim Spannung As Single Channel = 5 ' "a" für spezielles Display 'Initlcd Do W = Getadc(5) Spannung = W * 0.01953125 thirdline Lcd Fusing(spannung , "##.##") ; "V" locate 2 , 1 Lcd "Irgendein Text" Loop End
{V
Irgendein Text
(frei)
(frei)
Ich versteh erstens die geschwungene Klammer nicht ({) und es wird immer in der ersten Zeile anstatt der 3. angezeigt!
Ich bitte um Hilfe, bin echt verzweifelt!!!
Vielen Dank!
Marten83
Hallo,
warum benutzt ihr nicht die Standart LCD Befehle von Bascom? Damit kann man doch soo einfach ein 4*20 Display ansteuern!!
Gruß Michi
Ähm... wenn das auch richtig gehen würde wäre das ja kein Problem.
Tut es aber nicht!
Steht hier aber auch alles, oder?
Hier wurde auch schon eine Lösung gepostet:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10766
HI!
Ich hab das mal ausprobiert wie das in dem Link beschrieben wurde.
Leider will mein Bascom nicht so wie dort (invalid datatype [0]).
Steht für die Zeile: If Zeichen......
Kompilieren geht also nicht!
Weiss jemand woran das liegt?
Marten83
Hi,
bei mir läuft das so hier ohne Probleme:
Code:$regfile = "m8def.dat" 'Mega8 $crystal = 8000000 Declare Sub Lcdinit Declare Sub Lcdwrite(byval Zeichen As Byte) Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3 Config Lcd = 20 * 4a Waitms 100 'damit das LCD etwas Zeit bekommt um nach dem Einschalten empfangsbereit zu sein... Call Lcdinit Cls do ..... loop Sub Lcdinit Call Lcdwrite(&B00101100) Call Lcdwrite(&B00001001) Call Lcdwrite(&B00101000) Call Lcdwrite(&B00000110) Call Lcdwrite(&B00001100) End Sub Sub Lcdwrite(byval Zeichen As Byte) ' Höherwertiges Nibble setzen If Zeichen.4 = 1 Then Portd.4 = 1 Else Portd.4 = 0 If Zeichen.5 = 1 Then Portd.5 = 1 Else Portd.5 = 0 If Zeichen.6 = 1 Then Portd.6 = 1 Else Portd.6 = 0 If Zeichen.7 = 1 Then Portd.7 = 1 Else Portd.7 = 0 ' Höherwertiges Nibble übertragen Portd.2 = 1 Waitms 1 Portd.2 = 0 Waitms 1 ' Niederwertiges Nibble setzen If Zeichen.0 = 1 Then Portd.4 = 1 Else Portd.4 = 0 If Zeichen.1 = 1 Then Portd.5 = 1 Else Portd.5 = 0 If Zeichen.2 = 1 Then Portd.6 = 1 Else Portd.6 = 0 If Zeichen.3 = 1 Then Portd.7 = 1 Else Portd.7 = 0 ' Niederwertiges Nibble übertragen Portd.2 = 1 Waitms 1 Portd.2 = 0 Waitms 1 End Sub
MfG Dani.
Hi!
Ich könnte mir selbst in den A.... treten!!
Hab den Fehler gefunden.
Die Definitionen sollte man schon mit in das ganze Geschehen einbeziehen...!!!
Vielen Dank an Alle die mir geholfen haben!
Marten83
Hallo Mitnander!
Ich würde an dieser Stelle mal eben eine Frage in den Raum werfen.
Und zwar tüftle ich auch gerade an einem 4x20 Zeichen DIP LCD mit KS0073 Controller.
Da hätte ich zwei Grundlegende Fragen die mir den Einstieg Sehr erleichtern würden:
1. Verständnisfrage (Newbiefrage)
Im Datenblatt wird neben RS, RW, E und D0...D7 noch ein "Bit" nenn ich es mal genannt. Nämlich RE. Würde mich mal ganz stark interessiren was das zu bedeuten hat.
2. Beim Initialisieren.
nach dem FunctionSet heißt es ja "wait for more than 39µs",
Genügt es da auch zu warten, bis das Busyflag wieder 0 ist, oder funktioniert das hier nochnicht? Kann mir gut vorstellen dass es nicht funktioniert, da ja hier erst mal die Schnittstelle aktiviert wird. Und wenn nein, ab wann Funktioniert das mit dem BUSYBIT....
Bei mir hackts nämlich noch ganz stark... weiß nicht ob er meine Befehle gefressen hat oder nicht.
Gruß,
Franz
Mit diesem Programm Lese ich aus dem LCD.
Das Display gibt immer nur 0xFF aus.... ist es evtl Defekt?
Ich hab zum Testen mal LED an D0----7 angeschlossen, über 1KOhms...
Auch bei RESET ändert sich nichts an der Anzeige... ich glaub ich habs gegrillt???
Code:void LCD_INPUT(void){ //LCD_DATA als INPUT und Pullup aus LCD_DATA_DDR = 0x00; LCD_DATA_PORT = 0x00; //LCD_CTRL als Output und Pullup aus LCD_CTRL_DDR &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E); LCD_CTRL_PORT &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E); } void LCD_OUTPUT(void){ //LCD_DATA als OUTPUT und Pullup aus LCD_DATA_DDR = 0xFF; LCD_DATA_PORT = 0x00; //LCD_CTRL als Output und Pullup aus LCD_CTRL_DDR &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E); LCD_CTRL_PORT &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E); } uint8_t LCD_READ( uint8_t RS ){ //Datenrichtungseinstellung für READ LCD_INPUT(); //Registerwahl if( RS ) { LCD_CTRL_PORT |= (1<<LCD_RS); } //RS = 0 Steuerregister else { LCD_CTRL_PORT &= ~(1<<LCD_RS); } //RS = 1 Datenregister //RW HIGH setzen LCD_CTRL_PORT |= (1<<LCD_RW); //Enable HIGH setzen LCD_CTRL_PORT |= (1<<LCD_E); //Bisschen Warten bis Daten anliegen uint8_t t = 0; while( t < 200 ){ t++; } //DATEN LESEN uint8_t data = LCD_DATA_PIN; //Enable LOW setzen LCD_CTRL_PORT &=~ (1<<LCD_E); //RW LOW setzen LCD_CTRL_PORT &=~ (1<<LCD_RW); return data; }
Gruß,
Franz
Ach ich Hirsch!
RS, RW, E waren EINGÄNGE.....
IN DEN AR*CH BEISS...
Wie Peinlich, aber meine Fragen stehen noch offen...
EDIT: Jetzt funktioniert es!
Gruß,
Franz
Lesezeichen