LCD editor
Papp Zoltán
zombi at c2.hu
Sat Jul 1 01:59:53 CEST 2006
2006.06.30. 13:40:04 dátumon Moczik Gabor <pm at progzmaster.hu> írta:
> En ugy tervezem megoldani, hogy eleve a karakterkeszlet lesz
> proporcionalis,
> azaz le lesz tarolva az adott karakter szelessege, es nem lesz felesleges
> ures pixel oszlop. Ez karakterenkent 1 byte tobblet, viszont
> osszessegeben
> nem okoz ennyit, mert az elhagyott ures oszlopok miatt kevesebb adatot
> kell
> tarolni.
> Az overhead annyi, hogy ha mondjuk a 254-es kodu betu kell, akkor nem
> tudjuk, hogy az adatteruleten hol kezdodik, mert ossze kell szamolni az
> elotte levo betuk szelesseget.
>
> Lehet indextablat csinalni minden karakterhez, de az rengeteg helyet
> foglal,
> lehet minden 16-ik karakterhez, ez mar kevesebbet, de rossz esetben 15-ot
> kell szamolni.
> Ha a ROM keves, de RAM van meg, akkor ki lehet szamolni a betukeszlet
> kivalasztasakor a tipikus indexeket, es ez alapjan dolgozni.
Ez igaz, a sebesség és a helyméret fordítottan arányos...
>> Én valamilyen "paraméterezhető" kimeneti formátumra gondolok, amit
>> mindenki magának állíthat be. Persze ez nagy meló, de univerzális. (nézd
>
> Vegul is...
> Kellhet egy olyan kimenet, ami egyszer szukseges (pl. valtozonev), blokk
> kezdo jel, elvalasztojel, blokk zaro jel, adat formatum.
>
> Pl. C nyelvu tomb eseten:
> start: 'const char %font_name%[%font_size_bytes%] ='
> block start: '{'
> blockend: '}'
> delimiter: ', '
> formatum: '0x%2X'
>
> Ezt egyszeru leprogramozni, de ezzel meg mindig nem lehet meta-adatokat
> tarolni, tovabba ki kell valasztani, hogy 1byte egy oszlopot vagy egy
> sort
> ir le, stb.
>
Én inkább valamilyen egyszerű BASIC/C hibrid leíró-nyelvre gondolok, egy
printf-szerű lekezeléssel, valami ilyesmire:
Mondjuk hagyjuk el a "printf" szót, és ami a kimenet, azt tegyük
macskakörmök közé. Az egyes változókat és azok leírását ugyanúgy
definiáljuk, mint a printf-nél. Legyen egy 3D tömbünk (ez is parancs):
PX(karakterkód,oszlop,sor) aminek értéke 0/1 lehet, ezek a pixelek.
Ugyanígy két másik tömbünk: ROW(karakterkód,sor,msb),
COL(karakterkód,oszlop,msb), ami adott sor ill. oszlop értékét adja, ha
MSB==TRUE, akkor balra ill. fent van az MSB, ha FALSE, akkor jobbra, ill.
lent. Használhassunk változókat, mondjuk max. 26-ot ($A-$Z, a $ jel
mutatja, hogy ezek változók), ezekkel el tudjuk végezni pár alapműveletet
(+,-,/,*,%,>>,<<), természetesen zárójelezve; legyen egy egyszerű
FOR($V,kezdő,vég)/NEXT(lépésszám) ciklus [lépésszám elhagyható, ekkor
alapban 1]. Használhassunk egy IF(feltétel)/ELSE/ENDIF utasítást,
feltételként kiértékelhető legyen boolean változó, ill. pár művelet
(<,>,==,,||). A fontkészlet egyéb paramétereit nevesítsük, pl: FONTNAME,
WIDTH, HEIGHT, CHAR_FIRST, CHAR_LAST, PROP (proporcionális? ->
TRUE/FALSE), COLDATA (adatok oszloponként? -> TRUE/FALSE(soronként)).
Speciális feltételes utasítás (megfelel a C-ben a
(feltétel?igaz:hamis)-nak) : SEL(feltétel,igaz,hamis)
FOR,NEXT,IF,ELSE,ENDIF,SEL után már ne lehessen utasítást írni az
egyszerűség, a lekezelhetőség és az átláthatóság kedvéért.
A kimeneti fájlnevet a FILENAME(...) paranccsal állítjuk be, ami egy
printf-szerűség egyben; ha nem adjuk meg, akkor a program rákérdez, hogy
ez legyen-e a neve.
Lehessen használni //-t megjegyzésként.
Vannak használható rendszer-konstansok (a fontkészlet beállításaiban
szerepelnek):
FONTNAME="Font5x7"
WIDTH=5
HEIGHT=7
CHAR_FIRST=65
CHAR_LAST=67
PROP=FALSE //nem proporcionális, azaz fix méret
COLDATA=TRUE //adatok oszloponként
//a LETTERSPACING és ROWSPACING gondolom a karaterek és a sorok közti
távolság
LETTERSP=1
ROWSP=1
//és még lehet sok más változó, ami majd kialakul
A leírás pl. így nézne ki, ami mondjuk a MOCZIK.OUT :-) fájl tartalma is
egyben:
//========= Moczik Gábor így szereti a fontkimenetet :-) ==========
FILENAME("%s.fnt",fontname) //"Font5x7.fnt"
"unsigned char %s_data[] = {\n",fontname
FOR($C,char_first,char_last)
" "
FOR($X,0,WIDTH-1)
"0x%2X",COL($C,$X,FALSE)
SEL(($C<WIDTH-1)&&($C<CHAR_LAST),",","")
NEXT
"\n"
NEXT
"};\n\n"
"const struct GFont St%s = {\n",FONTNAME
" GF_%s,\n",SEL(PROP,"PROP","FIXED")
" GF_%s,\n",SEL(COLDATA,"COLDATA","ROWDATA")
" %d, /* first char */\n",CHAR_FIRST
" %d, /* last char */\n",CHAR_LAST
" %d, /* width */\n",WIDTH
" %d, /* height */\n",HEIGHT
" %d, /* letterspacing */\n",LETTERSP
" %d, /* rowspacing */\n",ROWSP
" sizeof(%s_data),\n",FONTNAME
" %s_data\n",FONTNAME
"};\n\n"
"const struct GFont* %s = &St%s;\n",FONTNAME,FONTNAME
//================ Itt a vége, fuss el véle ===============
Aminek a kimenete olyan, ami neked kell:
> Nekem pl. ilyen formatum kell:
és tényleg :-)
> unsigned char Font5x7_data[] = {
> 0x7E,0x11,0x11,0x11,0x7E,
> 0x7F,0x49,0x49,0x49,0x36,
> 0x3E,0x41,0x41,0x41,0x22
> };
>
> const struct GFont StFont5x7 = {
> GF_FIXED,
> GF_COLDATA,
> 65, /* first char */
> 67, /* last char */
> 5, /* width */
> 7, /* height */
> 1, /* letterspacing */
> 1, /* rowspacing */
> sizeof(Font5x7_data),
> Font5x7_data
> };
>
> const struct GFont* Font5x7 = &StFont5x7;
Ez egyébként egy szép nagy interpreter és egy szép feladat, de nem
kivitelezhetetlen, de ezzel bármilyen szöveges formátumot ki tudsz
exportálni. Gondolom kell majd még bele pár parancs, pl: BYTE(x,y), ami az
x szám y-ik bájtját adja vissza alulról, pl. a BYTE(0x12345678,2) a
0x34-et adja vissza, ha x 16bites szám, akkor BYTE(x,0) megfelel az alsó
bájtnak, stb...
Bináris kimenetnél a "....%c..." formázást érdemes használni, ill. a
"....\x0A\x0C...." hexa-karakter-definíciókat
Ekkor a ".....%c....",ROW($C,$X,TRUE) vagy ilyesmi használható, 16 bitnél
pl:
$Z=ROW($C,$X,TRUE)
"....%c%c....",BYTE($Z,0),BYTE($Z,1)
parancsokkal lehetne két-bájtos kiírást készíteni, konfigurálható a big-
ill. little-endian is (vagy akármi)
Na röviden ennyi.... :-)
--
Papp Zoltán
OneWay Electronics
More information about the Elektro
mailing list