AVR- PLC
Ágó István
istvan3 at gmail.com
Wed Aug 8 02:29:21 CEST 2007
Szerintem nem bonyolult a kód. asm-ben se lenne egy nagy mutatvány megírni
//Globális változók
unsigned char GOMB_UJ=0, GOMB_REGI=0, szamlalo;
//Megszakítási rutin (2..3ms)
void irq(void)
{
if (szamlalo) //ha a szamlalo nem nulla, akkor megnézzük a gombok
állapotát
{
if ((PORTA&0x07)^GOMB_UJ) szamlalo--; //ha nincs változás, akkor
csökkentjük szamlalo értékét
else GOMB_UJ=(PORTA&0x07), szamlalo=8; //ha van, akkor eltároljuk
az új állapotot, és visszaállítjuk szamlalot 8-ra
}
}
//A főprogram:
void main(void)
{
char j,kod;
while(1) //ez a főprogram végtelen ciklusa
{
kod=0, j=1; //j alsó bitjét 1-re állítjuk
if (!szamlalo) //ide akkor jön be, ha szamlalo elért 0-ra
{
if (GOMB_UJ^GOMB_REGI) //ide akkor jön be, ha a gombok új és
régi stabil állapota között van eltérés
{
while (!kod) //ismétli, amíg meg nem találja az eltérést
(amíg kod egyenlő 0-val)
{
if ((GOMB_UJ^GOMB_REGI)&j) //ha változás van azon a
gombon, amelyik bit a j változóban egyes
{
if (GOMB_UJ&j) //ha a gomb új állapota egyes
kod=j; //akkor a kod a j értékét megkapja
(tehát kod értéke lehet 1, 2, 4, 8, stb.
}
j<<=1; //j-t balra léptetjük 1-el
}
GOMB_REGI=GOMB_UJ; //eltároljuk az új állapotot
}
szamlalo=8; //szamlalot visszaállítjuk 8-ra, hogy a megszakítási
rutin ismét figyelje a gombokat
}
switch (kod)
{
case 1: //ha a kód 1 (0. lábon levő gomb lett lenyomva),
akkor ide kerül a kiszolgáló rutin
balra=!balra;
break;
case 2: //ha a kód 2 (1. lábon levő gomb)
if (impuls!=50)
impuls++;
break;
case 4: //ha a kód 4 (2. lábon levő gomb)
if (impuls!=10)
impuls--;
break;
//és így tovább, ahány gomb van
}
}
Szlifka Tibor <eltib at monornet.hu> írta, 2007.08.08.:
>
>
> > Ha érdekel, előkeresem a C kódot...
>
> Ha publikus, köszönettel venném!
> Bár C-ül nagyon gyenge vagyok, de mostanában elég sok C forrást
> nézegettem, hogy talán olvasni fogom tudni.
>
> --
> tib
>
> -----------------------------------------
> elektro[-flame|-etc]
>
More information about the Elektro
mailing list