Kappler hat geschrieben:
Der doppeltgroße Zeichensatz gefällt mir auch...
Hast du hierzu Infos, welche Standardzeichen bzw. Sonderzeichen (wie sehen die aus?) zur Darstellung der Zahlen von 0-9 gebraucht werden?
Das würde einiges an Arbeit sparen...
Der ist so klug angelegt, dass er nur die unteren 128 Zeichen des Standard-Zeichensatzes nutzt (die wirklich bei allen Displays gleich sind) und die oberen 128 ignoriert. Die wenigen Sonderzeichen, die benutzt werden passen locker in die 8 verfügbaren Plätze, da muss man nicht mal zur Laufzeit umdefnieren. Ich schau gerade mal... Moment... Mein letztes eigenes Spielprojekt, was nur diese "Uhr" nachgebaut hat....
Code: Alles auswählen
void DisplayInit(void)
{
struct REGPACK r;
// init LCD SC2002A, 4x16 Character
// set to 8-bit-interace, 2 lines, 5x7 character set
outportb(LCDCTRL,0x38); // 00111000b
r.r_ax = 0x0000; // Task Sleep
r.r_bx = 0x0002; // 2ms
intr(0xAD,&r);
// set display on, set cursor on (blink)
outportb(LCDCTRL,0x0C); // 00001100b
r.r_ax = 0x0000; // Task Sleep
r.r_bx = 0x0002; // 2ms
intr(0xAD,&r);
// clear display
outportb(LCDCTRL,0x01); // 00000001b
r.r_ax = 0x0000; // Task Sleep
r.r_bx = 0x0002; // 2ms
intr(0xAD,&r);
// autoincrement DDRAM Adress, no Shift
outportb(LCDCTRL,0x06); // 00000110b
r.r_ax = 0x0000; // Task Sleep
r.r_bx = 0x0002; // 2ms
intr(0xAD,&r);
outportb(LCDCTRL,0x40); // CGRAM Address für Char 0x00
r.r_ax = 0x0000; r.r_bx = 0x0001; intr(0xAD,&r);//Oberstrich basteln
outportb(LCDDAT,0x1f); //*****
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
//Char 0x01 Linksstrich basteln
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
//Char 0x02 Zunten basteln
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x02); //...*.
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x04); //..*..
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x08); //.*...
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x1f); //*****
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
//Char 0x03 Doppelstrich basteln
outportb(LCDDAT,0x1f); //*****
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x1f); //*****
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
//Char 0x04 Rechtsstrich basteln
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
//Char 0x05 Zoben basteln
outportb(LCDDAT,0x1f); //*****
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x02); //...*.
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x04); //..*..
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x08); //.*...
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
//Char 0x06 Backslash basteln
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x10); //*....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x08); //.*...
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x04); //..*..
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x02); //...*.
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x01); //....*
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
outportb(LCDDAT,0x00); //.....
r.r_ax = 0x0000; r.r_bx = 0x0002; intr(0xAD,&r);
}
Das sind die Zeichen, die du selbst definieren musst (der Interrupt-Aufruf ist ein 2ms sleep , der in so kleiner Auflösung nicht eleganter vom damals benutzten Betriebssystem unterstützt wurde).
Und hier kommen die Ziffern 0 bis 9 in "Grossschrift" hintereinander, dass man sie im Array problemlos mit dem Faktor 3 multipliziert und anschließend zeichenweise indiziert adressieren kann. Wenn du also auf dem Display die Ziffer ausgeben willst, deren Wert in der Variable i steht, so musst du in der oberen Zeile
ZStr1[3*i],ZStr1[3*i+1],ZStr1[3*i+2] und in der unteren Zeile
ZStr2[3*i],ZStr2[3*i+1],ZStr2[3*i+2] ausgeben.
Fröhliches String-Basteln und indizieren wünsche ich. Praktischerweise sind alle "Großziffern" 3 Standardzeichen breit und 2 Standardzeichen hoch...
Code: Alles auswählen
char * ZStr1
= {"/\000\006" //0 oben
" /\001" //1 oben
" \000)" //2 oben
" \003)" //3 oben
"\004_\001" //4 oben
"\004\003\000"//5 oben
" \002 " //6 oben
" \000\005" //7 oben
"(\003)" //8 oben
"(\003)"}; //9 oben
;
char * ZStr2
= {"\006_/" //0 unten
" \001" //1 unten
" \002_" //2 unten
" _)" //3 unten
" \001" //4 unten
" _)" //5 unten
"(_)" //6 unten
" / " //7 unten
"(_)" //8 unten
" / "}; //9 unten
;
Die oktal dargestellten Zeichen 001 bis 006 sind die selbstdefinierten Sonderzeichen, alles Andere sind normale Zeichen aus dem Standard-Zeichensatz.
Hoffe geholfen zu haben - auch wenns C ist. Aber vordefinierte Strings wird man auch in anderen Sprachen weiterverwursten können. Keine Ahnung wie man das da mit nichtdarstellbaren Sonderzeichen macht, notfalls hex oder binär. Ich find Oktal eh doof, aber mitten im String ists halt schlecht auf hex oder binär umzustellen C halt. Manchmal etwas seltsam.
chrysophylax.