Most megnézzük, mit lehet kezdeni az előző cikk végén kifogásolt dologgal. A probléma az, hogy csak szemmel látható, a futás sebességének változása. Ez nem valami korrekt, mivel semmiféle kézzelfogható viszonyítási alapunk nincs.
Hirdetés
Keresünk valamilyen kijelzési formát, amivel a konkrét szám érték megjeleníthető. Erre legalkamasabb az
LCD kijelző. Nekem a kisérleti panelen egy EW162G tipusú 2x16 karakteres
LCD kijelző van. Ezt a típust, minden további nélkül, illeszthetjük a PIC-hez.
A PicPascal-nak többféle verziója létezik. Pl. én a melóhelyemen használtam a PicPascal Pro-t, otthon pedig a 8-as demo verziót amelyel 2 kb-os programot lehet írni.
Mivel a Pro sokkal fejlettebb, ezért inkább az ezzel a verzióval készült Progival mutatnám be a kijelzést.
A program deklarációs része néhány új dologgal bővült. Mindjárt az első, ami igen szembetűnő, hogy egy rakás változót deklaráltunk.
Ezekkel a változókkal kezeli a program a kijelzőt. Ami ebben nagyon jó, hogy a PIC bármelyik portjára, sőt akár több portra is, tehetjük a kijelzőt, bitenként beállítva, hogy a kijelző melyik lába, melyik port, melyik bit-jére kerüljön. Most itt a D port 7, 6, 5, 4, Bit-jére tettük a kijelző adatvezetékének felső négy bit-jét, a D-3-ra az Enable lábat, a D-2-re pedig az RS-t. A kijelző táp, kontraszt, R/W, és a háttérvílágításra szolgáló lábainak bekötését a kijelző adatlapja ismerteti, ezt nem írom le külön. Nekünk itt az adatforgalomra szolgáló rész a fontos. Amennyiben az adatlap szerint bekötjük a kijelzőt, minden további nélkül menni fog.
Ezenkívül még van egy új sor, a deklarációs részben.
Text : Array[3] Of char;
Ez egy tömbváltozó, karakter típusú. Ez a változó fogja a Speed_Fut értékét, konvertálás után az
LCD kijelzőn megjeleníteni.
program FeryService;
Const Speed_Fel=0; Speed_le=1;
Var Loop, Bemenet, Speed_Fut : byte;
Text : Array[3] Of char;
var LCD_RS : sbit at RD2_bit;
var LCD_EN : sbit at RD3_bit;
var LCD_D4 : sbit at RD4_bit;
var LCD_D5 : sbit at RD5_bit; // LCD Port Beállítás
var LCD_D6 : sbit at RD6_bit;
var LCD_D7 : sbit at RD7_bit;
var LCD_RS_Direction : sbit at TRISD2_bit;
var LCD_EN_Direction : sbit at TRISD3_bit;
var LCD_D4_Direction : sbit at TRISD4_bit;
var LCD_D5_Direction : sbit at TRISD5_bit;
var LCD_D6_Direction : sbit at TRISD6_bit;
var LCD_D7_Direction : sbit at TRISD7_bit;
//---------------------------- Pic_Init ---------------------------------------
Procedure Pic_Init;
Begin
TrisC:=$00;
LatC:=$00;
TrisB:=$FF;
PortB:=$00;
Intcon2.RBPU := 0;
Loop:=0;
Bemenet:=0;
Speed_Fut := EEprom_read(0);
If Speed_Fut = $FF Then Speed_Fut := 70;
LCD_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, '* FERYSERVICE * ');
Lcd_Out(2, 1, ' FUTO FENY ');
Delay_ms(3000);
Lcd_Cmd(_LCD_Clear);
Lcd_Out(1, 1, ' * FUTOFENY * ');
Lcd_Out(2, 1, 'VDELAY : ');
Lcd_Out(2, 13, 'mS');
End;
//---------------------------- Pic_Init -----------------------------------------
A Pic_Init procedúrában is van néhány változás.
Az
LCD_Init() sort a kijelző miatt be kell tenni ide, de a többi már szabadon választott.
Ac "
Lcd_Cmd(_
LCD_CURSOR_OFF);" direkt
LCD utasítás, kikapcsolja a kurzor megjelenítését.
A következő sorban kiíratjuk az oldal nevét a kijelzőre, de ide bármit kiírathatunk 16 karakterig.
Miután várunk 3 mp-et letöröljük a display-t az
Lcd_Cmd(_
LCD_Clear); utasítással, majd pozíció szerint íratjuk ki, azokat a szövegeket, amik mindig fixen maradnak a kijelzőn.
Ezzel a Pic_init procedúrát kivégeztük, itt több változás nincs.
//------------------------- Sebesség szabályozás ---------------------------
Procedure Speed_Adj;
Begin
Bemenet:= not PortB;
If Bemenet.Speed_Fel = 1 Then
Begin
Delay_ms(300);
Speed_Fut := Speed_Fut +5;
If Speed_Fut >= 120 Then Speed_Fut := 120;
EEprom_write(0, Speed_Fut); //EEprom-ba Kiír!
End;
If Bemenet.Speed_Le = 1 Then
Begin
Delay_ms(300);
Speed_Fut := Speed_Fut -5;
If Speed_Fut <= 5 Then Speed_Fut := 5;
EEprom_write(0, Speed_Fut); //EEprom-ba Kiír!
End;
ByteToStr(Speed_Fut, Text);
Lcd_Out(2, 10, Text);
End;
//------------------------- Sebesség szabályozás ---------------------------
Na most a legszebb... Beleírtunk a deklarációs részbe és a Pic_Init-be egy csomó mindent, azért, hogy a Speed_Adj procedúrába, két sorral elintézzhessük a Speed_Fut változó értékének a konvertálását, és kiíratását.
ByteToStr(Speed_Fut, Text);
Mint az utasítás nevéből sejthető is, Byte-os változó értékét konvertálja át sztring típussá, hogy megetethető legyen a kijelzővel.
Ezután a kijelző 2-ik sorába, a 10-ik karakter pozicióba íratjuk ki a Speed_Fut változó értékét.
Ahogy mi változtatjuk a gombok nyomkodásával a Speed_Fut értékét, úgy változik a kijelzőn is az érték.
Még egy apróság, most hogy van kijelző, és látni lehet az értéket, amit beállítunk, a prellezést kiküszöbölő időzítést, átállítottuk 300ms-re.
Ez azért jó nekünk, mert ha folyamatosan nyomjuk a gombot, akkor 300ms-ként lép egyet fel vagy lefelé.
//---------------------------- LED villogtatás --------------------------------
Procedure Led_Blink;
Begin
PortC:=$03;
For Loop:=0 to 5 do
Begin
Speed_Adj;
VDelay_ms(Speed_Fut);
asm
rlncf PortC,F;
End;
End;
For Loop:=0 to 5 do
Begin
Speed_Adj;
VDelay_ms(Speed_Fut);
asm
rrncf PortC,F;
End;
End;
End;
//---------------------------- Főprogram --------------------------------------
Begin
Pic_init;
While True Do
Begin
Led_Blink;
End;
End.
//-------------------------- Program Vége -------------------------------------
Már kijelzőnk is van, de megint támadt a programunknak egy kis hiányossága.
Mindössze egyféle futófény effektet ismer, holott írhatunk még neki számtalan procedúrát, amelyek mindenféle, futó, villogó, ugráló, stb. fényeffektust képes előállítani.
Egyenlőre 1-2 effektet még meg lehet oldani, de ha többet akarunk akkor minden procedúrába be kell írni a Speed_Adj procedúrát, ráadásul jó lenne valahogy az effekteket egyrészt automata, másrészt manuális váltásba tenni.
Pontosan erre találták ki a megszakításokat...
Folytatjuk...
Fájlok:
Fájlnév | Fájlméret | Letöltve |
A cikkhez tartozó fájlok csak bejelentkezés után tölthetőek le! |
Hozzászólások
Hozzászólás csak bejelentkezés után lehetséges...