LCD Große Zahlen

Hi, ich habe ein 2*16 Char Display welches ich mit der ShiftRegLCD Lib ansteuere. Jetzt habe ich gefunden das man mittels Custom Chars Zahlen über zwei Zeilen darstellen kann, http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213319639. Das Problem das ich habe ist das ich nicht weiß wie ich das für die ShiftRegLCD Lib umsetzen soll. http://code.google.com/p/arduinoshiftreglcd/wiki/Usage hier habe ich den create befehl gefunden da ich aber den Code aus meinem ersten Link nicht wirklich verstehe kann ich es nicht umändern. Hat das schonmal jemand umgesetzt? Oder mir helfen wie ich das selbst schaffe?

Gruß Max

Die großen Zahlen werden erzeugt indem neue Zeichen definiert werden. Der HD44780 gibt die Möglichkeit 8 Zeichen zu definieren und diese einmal in den HD44780 geladen entsprechen den Zeichen 0 bis 7. Die Bibiothek hat eine Funktion haben die diese Zeichen definiert und dann sind nur die Zeichen 0 bis 7 auf die richtigen Posizionen zu schreiben. http://code.google.com/p/arduinoshiftreglcd/wiki/Usage im Kapitel: Custom character generation:

uint8_t bell[8]  = { B00000100,
                     B00001110,
                     B00001110,
                     B00001110,
                     B00011111,
                     B00000000,
                     B00000100 };

srlcd.createChar(3, bell);

Beware the characters are only 5 pixels wide, so the 3 upper bits must always be zero.

Grüße Uwe

Hier mit geht das wohl

Custom character generation

There can be up to 8 custom generated characters.

srlcd.createChar(uint8_t location, uint8_t charmap[])

Where location is a number from 0 to 7, and charmap[] is an 8 element byte array of a character pattern. Beware the characters are only 5 pixels wide, so the 3 upper bits must always be zero.

For example, to make a bell character at character position 3:

uint8_t bell[8]  = { B00000100,
                     B00001110,
                     B00001110,
                     B00001110,
                     B00011111,
                     B00000000,
                     B00000100 };

srlcd.createChar(3, bell);

Ich verstehe hauptsächlich den Code nicht :

//create some strings to index into for displaying the big numbers
//			    0	   1	  2	  3	  4	    5	   6	 7	   8	   9
char bignumchars1[]={4,1,4,0, 1,4,32,0, 3,3,4,0, 1,3,4,0, 4,2,4,0,   4,3,3,0, 4,3,3,0, 1,1,4,0,   4,3,4,0, 4,3,4,0};
char bignumchars2[]={4,2,4,0, 2,4,2,0,  4,2,2,0, 2,2,4,0, 32,32,4,0, 2,2,4,0, 4,2,4,0, 32,32,4,0, 4,2,4,0, 2,2,4,0};

...
//cycle through printing out 0 to 9
void loop (void){    
  for(int x = 0;x<10;x++){
    lcd.gotoXY(0,0);
    lcd.print(bignumchars1+x*4);
    lcd.gotoXY(0,1);
    lcd.print(bignumchars2+x*4);
    delay(1000);
  }
}    
...

void setup (void){
...
//creating the custom fonts:
  LcdCommandWrite(B01001000);  // set cgram
  byte chars[]={
    B11111,B00000,B11111,B11111,B00000,
    B11111,B00000,B11111,B11111,B00000,
    B00000,B00000,B00000,B11111,B00000,
    B00000,B00000,B00000,B11111,B00000,
    B00000,B00000,B00000,B11111,B00000,
    B00000,B00000,B00000,B11111,B01110,
    B00000,B11111,B11111,B11111,B01110,
    B00000,B11111,B11111,B11111,B01110};
	  
    for(byte x=0;x<5;x++)
	for(byte y=0;y<8;y++)
	    LcdDataWrite(chars[y*5+x]); //write the character data to the character generator ram    
...
}

Der ist halt leider für eine andere Lib geschrieben ich weiß nicht wie ich den umändern muss, würde es reichen die lcd befehel zu übersetzten also anstatt lcd.print dann srlcd.print zuschreiben?

char bignumchars1[]={4,1,4,0, 1,4,32,0, 3,3,4,0, 1,3,4,0, 4,2,4,0,   4,3,3,0, 4,3,3,0, 1,1,4,0,   4,3,4,0, 4,3,4,0};
char bignumchars2[]={4,2,4,0, 2,4,2,0,  4,2,2,0, 2,2,4,0, 32,32,4,0, 2,2,4,0, 4,2,4,0, 32,32,4,0, 4,2,4,0, 2,2,4,0};

Jedes große Zeichen besteht aus 4 Zeichen für die obere Zeile und 4 Zeichen für die untere Zeile.
Diese 2 Arrays übersetzen eine Ziffer in die 4x2 selbst definierten Zeichen.
also die 2 ist
3,3,4,0
4,2,2,0 .
Genaueres siehst Du in 2 Bildern auf dem esten Beitrag des http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213319639
das 2. Bild sind die 5 selbstdefinierten Zeichen und das dritte Bild sind die Ziffern aus diesen 5 neuen Zeichen zusammengesetzt.

void loop (void){    
  for(int x = 0;x<10;x++){
    lcd.gotoXY(0,0);
    lcd.print(bignumchars1+x*4);
    lcd.gotoXY(0,1);
    lcd.print(bignumchars2+x*4);
    delay(1000);
  }
}

Druckt die Zeichen von 0 bis 9 in 1 Sekunden Intervallen auf das Display. X ist dabei die Ziffer

void setup (void){
...
//creating the custom fonts:
  LcdCommandWrite(B01001000);  // set cgram
  byte chars[]={
    B11111,B00000,B11111,B11111,B00000,
    B11111,B00000,B11111,B11111,B00000,
    B00000,B00000,B00000,B11111,B00000,
    B00000,B00000,B00000,B11111,B00000,
    B00000,B00000,B00000,B11111,B00000,
    B00000,B00000,B00000,B11111,B01110,
    B00000,B11111,B11111,B11111,B01110,
    B00000,B11111,B11111,B11111,B01110};
	  
    for(byte x=0;x<5;x++)
	for(byte y=0;y<8;y++)
	    LcdDataWrite(chars[y*5+x]); //write the character data to the character generator ram    
...
}

LcdCommandWrite(B01001000); ist der Befehl um die Zeichen neu zu definieren.

for(byte x=0;x<5;x++)
for(byte y=0;y<8;y++)
LcdDataWrite(chars[y*5+x]);
Schreibt das Array chars ins Zeichenram (character generator ram) des HD44780

chars sind die daten für die neuen Zeichen; eine 1 ist dabei ein Schwarzer Punkt auf dem Display; 0 ist kein Punkt.

PS: nimm die library, die ich Dir geschickt habe um die Zeichen zu definieren.
Grüße Uwe

Danke du hast schonmal Licht ins dunkele gebracht. Was micht gewundert hatte das bei den zwei Arrays für die erste und zweite Zeile ab und zu eine 32 steht ist das dann ein zeichen was schon im Ram ist? Wenn ich die die Nummern einmal in den cgram geschrieben habe sind sie drinn und ich kann die Routine löschen? Bei Ram gehe ich meistens davon aus das er nach dem trennen vom Netz verloren geht.

Eine Nacht drüber schlafen wirkt wunder jetzt habe ich die byte char Matrix verstanden.

Danke für deine Hilfe!

Die 32 ist ein Leerzeichen. Also bereits definiert. Die selbst definierten Zeichen mußt Du bei jedem Einschalten neu laden, da das RAM ohne Spannungsversorgung den Inhalt verliert. Du kannst Die Zeichen aber auch, falls nötig, für jeden neuen Text auf dem Display neu definieren. Bitte. Grüße Uwe

Danke nochmal habe es jetzt hinbekommen.