PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Große Zeichen auf 16*2 LCD



Malte0815
05.05.2010, 22:07
Hallo.
Ich bin nun schon ne Weile am suchen hab aber nicht das gefunden was ich Suche. Ich möchte große Ziffern auf einem 16*2 LCD darstellen also 1/2 Zeichen pro Zeile. Weis jemand ob das zu machen ist? Ich möchte damit beim einschalten des Displays eine Akkuspannung anzeigen die gut zu erkennen ist.

Gruß Markus

PICture
05.05.2010, 23:03
Hallo Malte0815!

Ich habe das mit selbstdefinierten Zeichen auf einem PIC mit ASM realisiert (siehe Foto). Ob es auch mit Bascom geht, weiß ich nicht, weil ich Bascom nicht kenne.

MfG

Malte0815
05.05.2010, 23:12
Genau sowas Suche ich ;). Hab allerdings von asm gar keine Ahnung. Vielleicht hat ja noch jemand einen Tipp.

wkrug
05.05.2010, 23:20
In BASCOM gibt es doch einen Zeicheneditor. mit dem man genau diese selbstdefinierten Zeichen erstellen kann ?!
Das Problem ist leider, das nur 8 Zeichen im Speicherbereich des LCD's untergebracht werden können.
Eine 7 Segment Anzeige über 2 Zeilen sollte sich aber damit erzeugen lassen.
TOOLS->LCD Designer
Guck Dir mal die Zeichen von PICTURE an und bastel die mit dem BASCOM Editor nach.
Nun nur noch für die gewünschten Zahlen eine Tabelle, wo das obere und das untere Zeichen ausgewählt werden und fertig ist der Lack.

PICture
06.05.2010, 00:04
Ich habe eben nur 8 selbstdefinierte Zeichen verwendet, weil in Display-RAM nur soviel passt. Deswegen wiederholen sich gleiche Zeichen in oberer und unterer Zeile.

MfG

Malte0815
06.05.2010, 08:37
Ah ok. Ich dachte vielleicht gibt's schon fertige Befehle in bascom die ich noch nicht kenne ;). Dann werd ich's mal so probieren.
Vielen dank.

Jaecko
06.05.2010, 11:02
In Bascom gibts dafür einen Befehl wie DefLCDChar.
Die Parameter hierzu müsste man aber dann entweder ausrechnen oder mit dem schon genannten LCD-Designer errechnen lassen.

radbruch
06.05.2010, 11:32
Hallo

@PICture: Sehr pfiffig dein "Zeichensatz":) Könntest du vielleicht die Datensätze dazu posten?

Gruß

mic

PICture
06.05.2010, 14:50
Hallo!

@ radbruch

Das ASM Programm befindet sich im Forum "PIC Microcontroller" unter "Tips&Tricks" in meinem Beitrag von 17.04.2009, 02:44.

Die selbstdefinierte Zeichen sind im Unterprogramm "Init". Ich hoffe das du dir sie daraus selber extrahieren kannst. Bei Problemen melde dich, bitte, erneut. :)

MfG

radbruch
06.05.2010, 15:50
Hallo

Na prima, mein erster Besuch im PIC-Bereich des Forums:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=437434#437434

Ich hatte ja irgendwas wie db "5f,ea,c2,.... erwartet ;)

Trotzdem danke. Mal schaun wie man das nach Bascom konvertieren kann...

Gruß

mic

PICture
06.05.2010, 17:09
Man braucht wahrscheinlich nur die Hexzahlen zwischen "call Char" für Bascom auf Dezimalzahlen wandeln. Wenn man das als Tabelle haben will, sollte mit "db" gehen. Z.B. Zeichen "0" als "db 3,3,3,3,3,3,3,3" usw.

MfG

radbruch
06.05.2010, 19:26
Hallo

Ich hab's mal umgesetzt, Bascom-Programmierer mögen mir verzeihen:

http://radbruch.roboterbastler.de/nibobee/doppelthohezeichen_klein.jpg (http://radbruch.roboterbastler.de/nibobee/doppelthohezeichen.jpg)

Ein kleiner Bug in der oberen Zeile: Auch mein LCD hat nur 8 Sonderzeichen. Im Code ist das aber korrigiert:

' nibobee mit Bascom "Doppelthohe Ziffern" 6.5.10 mic

' Doppelthohe Ziffern: https://www.roboternetz.de/phpBB2/viewtopic.php?t=54147
' nibobee mit 4bit-LCD: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=51821

' Zeichensatz von PICture: https://www.roboternetz.de/phpBB2/viewtopic.php?p=437434#437434


$regfile = "m16def.dat"
$crystal = 15000000
$hwstack = 32
$swstack = 8
$framesize = 24

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.0 , Rs = Portc.1
Config Lcd = 20 * 4
Config Lcdbus = 4 ' oje

Deflcdchar 0 , &H03 , &H03 , &H03 , &H03 , &H03 , &H03 , &H03 , &H03 ' Zeichensatz von PICture
Deflcdchar 1 , &H1F , &H1F , &H03 , &H03 , &H03 , &H03 , &H03 , &H03
Deflcdchar 2 , &H03 , &H03 , &H03 , &H03 , &H03 , &H03 , &H1F , &H1F
Deflcdchar 3 , &H1F , &H1F , &H03 , &H03 , &H03 , &H03 , &H1F , &H1F
Deflcdchar 4 , &H1F , &H1F , &H18 , &H18 , &H18 , &H18 , &H1F , &H1F
Deflcdchar 5 , &H1F , &H1F , &H1B , &H1B , &H1B , &H1B , &H1B , &H1B
Deflcdchar 6 , &H1B , &H1B , &H1B , &H1B , &H1B , &H1B , &H1F , &H1F
Deflcdchar 7 , &H1F , &H1F , &H1B , &H1B , &H1B , &H1B , &H1F , &H1F

Dim Ziffer(10) As Byte
Ziffer(1) = &H56 ' 0
Ziffer(2) = &H00 ' 1
Ziffer(3) = &H14 ' 2
Ziffer(4) = &H32 ' 3
Ziffer(5) = &H60 ' 4
Ziffer(6) = &H42 ' 5
Ziffer(7) = &H46 ' 6
Ziffer(8) = &H10 ' 7
Ziffer(9) = &H76 ' 8
Ziffer(10) = &H53 ' 9

Dim B As Byte , Temp As Byte

Cls ' clear the LCD display
Cursor Off Noblink
Lcd "Nibobee mit LCD" ' display this at the top line
Locate 3 , 1
Lcd "Doppelthohe Ziffern"

Wait 2

Cls
For B = 1 To 8 ' es sind nur 8 Userzeichen ;)
Locate 1 , B
Temp = B - 1 ' ächz
Lcd Chr(temp)
Locate 2 , B
Lcd Temp
Next
Wait 2
For B = 1 To 10
Locate 3 , B
Temp = Ziffer(b ) / 16 ' Bit 7-4 sind die obere Zifferhälfe
Lcd Chr(temp)
Locate 4 , B
Temp = Ziffer(b) And &H0F ' und Bit 3-0 die Untere ;)
Lcd Chr(temp)
Next

Do
Loop
End

Gruß

mic

&H72 für die 9?

PICture
06.05.2010, 19:38
Wow! Das sieht auf deinem Display viel besser als auf meinem aus! :)

Es ist also mit jedem µC möglich wenn man sich dafür etwas bemüht...

Möglicherweise lassen sich mit z.B. 4x16 Zeichen noch grössere erzeugen. ;)

MfG

b_spitzer
09.05.2010, 17:48
Hallo zusammen,

ich habe das Projekt gerade gut gebrauchen können! Danke auch.
Ich programmiere in C auf dem AT89C5131 und AT89C4051 und habe dafür das Programm mal angepasst:
Erstmal die Deklaration der Arrays (wandern später vermutlich aus Platzgründen in EEPROM) im Programmspeicher (Schlüsselwort code)

// 8 User-Definierte Zeichen zum zusammenbau der Ziffern
static code char Symbol0[8]={0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03};
static code char Symbol1[8]={0x1f,0x1f,0x03,0x03,0x03,0x03,0x03,0x03};
static code char Symbol2[8]={0x03,0x03,0x03,0x03,0x03,0x03,0x1f,0x1f};
static code char Symbol3[8]={0x1f,0x1f,0x03,0x03,0x03,0x03,0x1f,0x1f};
static code char Symbol4[8]={0x1f,0x1f,0x18,0x18,0x18,0x18,0x1f,0x1f};
static code char Symbol5[8]={0x1f,0x1f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b};
static code char Symbol6[8]={0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1f,0x1f};
static code char Symbol7[8]={0x1f,0x1f,0x1b,0x1b,0x1b,0x1b,0x1f,0x1f};

und die Deklaration der Ziffern 0-9 (bei der 9 habe ich die Darstellung leicht geändert)

// 2-Zeilige Zusammensetzung der Ziffern aus den 8 User-Definierten Zeichen
// High-Nibble für obere Zeile, Low-Nibble für untere Zeile
code unsigned char Ziffer[10] = {0x56,0x00,0x14,0x32,0x60,0x42,0x46,0x10,0x76,0x72 };// 9 war 53

So. erstmal das.

tschuessle
Benrhard

b_spitzer
09.05.2010, 17:53
Zweiter Teil: die Funktionen
Zunächst die User-Zeichen deklarieren:


void Set_Characters(void){
definierelcdsymbol(Symbol0, 0);
definierelcdsymbol(Symbol1, 1);
definierelcdsymbol(Symbol2, 2);
definierelcdsymbol(Symbol3, 3);
definierelcdsymbol(Symbol4, 4);
definierelcdsymbol(Symbol5, 5);
definierelcdsymbol(Symbol6, 6);
definierelcdsymbol(Symbol7, 7);
}

und als "printf-Ersatz" eine Funktion, die eine Char-Variable als 3-Stellige Zahl mit unterdrückten 0-en ausgibt:

void Ausgabe_3s2z(unsigned char Zahl, unsigned char Pos)
{ unsigned char Hunni, Zehner, Einer;
Hunni = Zahl / 100;
Einer = Zahl % 100;
Zehner = Einer / 10;
Einer = Einer % 10;
cursorpos(Pos + 0);
if (Hunni==0) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Hunni] /16); // High-Nibble
if (Zahl <= 9) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Zehner]/16); // High-Nibble
charlcd(Ziffer[Einer] /16); // High-Nibble

cursorpos(Pos + 0x40); // Zweite Zeile
if (Hunni==0) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Hunni] &0X0F); // Low-Nibble

if (Zahl <= 9) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Zehner]&0X0F); // Low-Nibble
charlcd(Ziffer[Einer] &0X0F); // Low-Nibble
}

und zum Schluß noch eine Funktion, die eine Int-Variable (bei mir Geschwindigkeit in 1/10 km/h) als 3.1-Stellige Zalh ausgibt. Der Dezimalpunkt ist leider nicht mehr definierbar, so dass ich auf ein Zeichen aus dem Erweiterten Zeichensatz des LCD zurückgegriffen habe...

void Ausgabe_3s1_2z(unsigned int Zahl, unsigned char Pos)
{ unsigned char Hunni, Zehner, Einer, Nachkomma;
unsigned int Rest;
Hunni = Zahl / 1000;
Rest = Zahl % 1000;
Zehner = Rest / 100;
Rest = Zahl % 100;
Einer = Rest / 10;
Nachkomma = Rest % 10;
cursorpos(Pos + 0);
if (Hunni==0) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Hunni] /16); // High-Nibble
if (Zahl <= 99) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Zehner]/16); // High-Nibble
charlcd(Ziffer[Einer] /16); // High-Nibble
charlcd(0x20);
charlcd(Ziffer[Nachkomma] /16); // High-Nibble

cursorpos(Pos + 0x40); // Zweite Zeile
if (Hunni==0) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Hunni] &0X0F); // Low-Nibble

if (Zahl <= 99) charlcd(0x20); // führende 0 unterdrücken
else charlcd(Ziffer[Zehner]&0X0F); // Low-Nibble
charlcd(Ziffer[Einer] &0X0F); // Low-Nibble
// Komma Symbolisieren
charlcd(0xa5);
charlcd(Ziffer[Nachkomma] &0X0F); // Low-Nibble
}
unn tschuess
Bernhard