Segédletek.hu

Segédletek weblap szerkesztéshez!
ingyen letöltés

| Mind | PHP | HTML | CSS | Java |
|Legújabbak |Legtöbbször olvasottak|

7 szegmenses kijelző:

Sorozat - Kijelzők:

Aki látta annak idején a Sliders című amerikai sorozatot (és szerette is), annak különleges csemegével szolgálhatok.
A hét szegmenses kijelző lényege, hogy a decimális számokat hét különböző vonallal kirajzolni, hogy azok még hasonlítsanak is arab társaikra (aminek, mint megtudtam, semmi köze Arábiához:))
A script kirajzol egy számsort ilyen formában...

Akkor lássuk a medvét!

Először is tisztában kell lenni a kijelző felépítésével.
http://needback.ath.cx/segedletek.hu/7segment/7segment.JPG
Mint láthatjuk, ez egy 8-ast alkot. Nézzük az összes számot.
http://needback.ath.cx/segedletek.hu/7segment/7segmentfull.jpg
Ha a felső vonaltól óramutató járása szerint megyünk, felcímkézhetjük a vonalakat.
http://needback.ath.cx/segedletek.hu/7segment/7segmentindex.JPG
És ezzel már el is jutottunk oda, hogy meghatározhatjuk, mely szegmens melyik számban szerepel
Érték   Világító szegmensek
0       123456
1        23   
2       12 45 7
3       1234  7
4        23  67
5       1 34 67
6       1 34567
7       123     
8       1234567
9       1234 67

No, látható, hogy a számok kicsit megdöntve vannak (ha jól számoltam, akkor 72 fokosak, és nem pálinka... de kár). Ez egy kis nehezítés, de most nem fogom levezetni a számításokat, amivel kiszámoltam a vonalak kezdeti- és végpontját.
Sz  Xb  Yb  Xe  Ye
1   15  10  40  10
2   43  12  38  37
3   37  42  32  67
4    4  70  29  70
5    6  42   1  67
6   12  12   7  37
7   10  40  35  40

No, most már tisztában vagyunk a méretekkel, felépítésekkel, kezdődhet a programozás.
<?php
////////////////////////////////////////////////////////
//            Számlálót megjelenítő script            //
//                Készítette: Needback                //
//                                                    //
//  Ez a script lehetőséget nyújt arra, hogy számokat //
//   jelenítsünk meg egy 7 szegmenses kijelzősoron.   //
//  A script jellegzetessége, hogy egyedileg testre   //
//   szabható. Mind méretileg, mind színileg, mind    //
//                     hosszilag.                     //
//                                                    //
////////////////////////////////////////////////////////
// Szerkesztés innentől...                            //
//                                     ////////////////////////////////
$bgca=    array(0,0,0);                //háttér színe                //
$pirosaarray(255,0,0);              //világító szegmens színe     //
$darkreda=array(64,0,0);               //nem világító szegmens színe //
$odd=0.5;                              //méretarány                  //
$numcount=6;                           //szegmensek száma (minimum)  //
$s='0';                                //megjelenített számsorozat   //
//                                     ////////////////////////////////
//... idáig                                           //
////////////////////////////////////////////////////////
//Innentől jön a kód                                  //
//                                                    //
//Szerkeszteni mindenkinek csak saját felelősségére!!!//
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
$numcount=max($numcount,strlen($s));                    //először is be kell állítani a kijelző hosszát
for ($i=strlen($s);$i<$numcount;$i++) { $s='0'.$s; }    //a szegmensek száma csak a minimumot állítja be
header('Content-type: image/jpeg');                     //mivel rajzolni szeretnénk, egy képet kell használnunk
$img=imageCreate($odd*(40*$numcount+10)+2,$odd*80);     //a mérete arányos a megadott méretaránnyal ($odd)
$bgc=    imageColorAllocate($img,    $bgca[0],    $bgca[1],    $bgca[2])//színek definiálása
$piros=  imageColorAllocate($img$pirosa[0]$pirosa[1]$pirosa[2]);
$darkred=imageColorAllocate($img,$darkreda[0],$darkreda[1],$darkreda[2]);
imagesetthickness($img,$odd*6);                         //és a vonalvastagság
for ($i=0;$i<$numcount;$i++) {                          //és akkor rajzoljunk
 DrawDigit($s{$i},$i);                                  //elemenként...
}
imagejpeg($img);                                        //majd kép küldése a böngészőnek

function DrawDigit($digit,$pos) {                       //itt határozzuk meg, hogy az adott érték milyen vonalakat rajzoltat ki
$i=$pos*40+5;                                           //a pozíció pedig, hogy helyileg hol helyezkedik el
switch ($digit) {                                       //itt található az első táblázat kódokra bontva. először mindig a sötét vonalakat rajzoltajuk ki
 case '0': D(7,$i,1); D(1,$i,0); D(2,$i,0); D(3,$i,0); D(4,$i,0); D(5,$i,0); D(6,$i,0); break;
 case '1': D(1,$i,1); D(4,$i,1); D(5,$i,1); D(6,$i,1); D(7,$i,1); D(2,$i,0); D(3,$i,0); break;
 case '2': D(3,$i,1); D(6,$i,1); D(1,$i,0); D(2,$i,0); D(4,$i,0); D(5,$i,0); D(7,$i,0); break;
 case '3': D(5,$i,1); D(6,$i,1); D(1,$i,0); D(2,$i,0); D(3,$i,0); D(4,$i,0); D(7,$i,0); break;
 case '4': D(1,$i,1); D(4,$i,1); D(5,$i,1); D(2,$i,0); D(3,$i,0); D(6,$i,0); D(7,$i,0); break;
 case '5': D(2,$i,1); D(5,$i,1); D(1,$i,0); D(3,$i,0); D(4,$i,0); D(6,$i,0); D(7,$i,0); break;
 case '6': D(2,$i,1); D(1,$i,0); D(3,$i,0); D(4,$i,0); D(5,$i,0); D(6,$i,0); D(7,$i,0); break;
 case '7': D(4,$i,1); D(5,$i,1); D(6,$i,1); D(7,$i,1); D(1,$i,0); D(2,$i,0); D(3,$i,0); break;
 case '8': D(1,$i,0); D(2,$i,0); D(3,$i,0); D(4,$i,0); D(5,$i,0); D(6,$i,0); D(7,$i,0); break;
 case '9': D(5,$i,1); D(1,$i,0); D(2,$i,0); D(3,$i,0); D(4,$i,0); D(6,$i,0); D(7,$i,0); break;
 default:  D(1,$i,1); D(2,$i,1); D(3,$i,1); D(4,$i,1); D(5,$i,1); D(6,$i,1); D(7,$i,0); break; //ha az $s-ben nem csak decimális számok lennének
 }
}
function D($line,$left,$t) {                            //itt már azt nézzük, hogy a vonal hol helyezkedik el
switch ($line) {                                        //és a második táblázat kódolva...
 case 1: DrL($left+15,10,$left+40,10,$t); break;
 case 2: DrL($left+43,12,$left+38,37,$t); break;
 case 3: DrL($left+37,42,$left+32,67,$t); break;
 case 4: DrL($left+04,70,$left+29,70,$t); break;
 case 5: DrL($left+06,42,$left+01,67,$t); break;
 case 6: DrL($left+12,12,$left+07,37,$t); break;
 case 7: DrL($left+10,40,$left+35,40,$t); break;
 }
}
function DrL($fx,$fy,$tx,$ty,$t) {                      //na, a tényleges rajzolás, már tudjuk hova, mit
 global $img, $piros, $darkred, $odd;                   //gyorsan behívjuk a színeket, a képet és az arányt globálisba
 $cl=($t==0)?$piros:$darkred;                           //majd megnézzük milyen színt kell használni
 ImageLine($img,Floor($odd*$fx),Floor($odd*$fy),Floor($odd*$tx),Floor($odd*$ty),$cl)//és rajzolunk (huhh... megvan :))
}
?>
Természetesen meghívni egy másik oldalból az <img src="... formában tudjátok.

Remélem sikerült érthetően kommentezni... mindenesetre pár hozzáfűznivaló:
Az $s változó tartalmát bárhonnan be lehet hívni, csak arra figyelni kell, hogy string típusú legyen.
Amint azt említettem, 72 fokos a dőlésszöge a szegmenseknek, de ha érzitek magatokban az erőt, a D függvényben átírhatjátok a számokat Mint látjátok, 40 széles, és 80 magas egy szegmens (90 fok esetén), de mivel eldől, egymás fölé dőlnek, így azt is bele kell számolni, hogy nehogy lefedjék egymást. Az $i=$pos*40+5; részben a +5 pont ezt hivatott kivédeni. Ha egymásba nyúlnak, ennek növelésével tudjátok orvosolni a problémát.
A másik, hogy van még pár karakter, amit könnyűszerrel bele lehet rakni. Sajna a hexadecimal karakterek kiesnek, mert a D-hez szükséges szegmensek ugyanazok, mint a 0-é. (Vagy a B és a 8)
De még itt sem állunk meg&... ki mondta, hogy 7 szegmens kell?
Egy kis módosítással akár szöveget is jeleníthetünk meg konstans szegmensekkel (ferde vonalakkal bővülnek a lehetőségeink)... de egy már egy másik történet.

Írta: Needback - 2007-12-07 15:41:44

* Nem vagy bejelentkezve!
* Nem töltheted le a segédlet forrását egyben!
* Nem szavazhatsz a segédletre!
* Nem írhatsz a segédlethez tartozó fórum témába!


requiem 2007-12-07 00:00:00
Király a cikk, bár annyira nincs túlrészletezve a használata. Akkor egy kis segítség hozzá, ha esetleg valakinek nem lenne világos, itt egy példa:
Legyen a script neve: szamlalo.php
a $s='0' sort cseréld ki erre:
$s=$_GET['s'] Ezután egy html fájlban:
<img src="szamlalo.php?s=12345" />
...
Tetszik ez a cumó, királyos :D
Csatlakozz a GDF-hez
Játssz, és nyerj SZIN jegyet És tanulj nálunk tovább
gdf.info.hu

Mondjon Bon jourt...
és legyen Öné az 1.000.000 € nyeremény! Partouche Poker Tour a bwin-en.
www.bwin.com

Miért fizetne többet?
Akciós élelmiszer, műszaki cikk, gyümölcs, bútor. Nézzen be, megéri!
www.tesco.hu

Lakástakarék
Éljen a lehetőséggel! Állami támogatás. Kedvező fix törlesztő és futamidő.
lakastakarek.com

10.000 €-t keresni havonta
Hogyan keressünk pénzt könnyedén? Kezdjen pénzt keresni még ma!
www.penzt-keresni.net

Hirdessen itt