-
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:
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
Das LCD sieht nun folgendermassen aus:
{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?
-
-
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
-
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.
-
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;
}
-
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!