Fórum témák

» Több friss téma
Fórum » PIC programozás assemblyben
 
Témaindító: sonajkniz, idő: Máj 30, 2015
Témakörök:
Lapozás: OK   34 / 34
(#) majkimester válasza Pali79 hozzászólására (») Feb 3, 2026 / 1
 
Én hasonlót úgy csináltam, hogy a háttérben binárisan tárolom a kiírandó számot, és megjelenítéskor konvertálom a bcd-vé, majd annak számjegyeit megjelenítem.

Gombnyomást figyelem, ha jön egy számjegy, először megnézem, hogy befére-e még, azaz a szám jelen esetben 999 alatt van (3 számjegy), ha nem akkor eldobom.

Ha befér, akkor megszorzom (igazából shifelés + összeadással) a számot 10-zel, majd hozzáadom az újabb számjegy értékét.

A 4 számjegy 16 biten tárolható, azaz 2 byte. Nekem erre vannak makróim, amivel pl megy az összehasonlitás, összeadás, shift. stb. (CMPC16, MOV16, ADD16, SHL16, stb.), de meg lehet csinálni enélkül is, csak munkásabb.
(#) sonajkniz válasza Pali79 hozzászólására (») Feb 3, 2026 / 1
 
Csak megjeleníteni szeretnéd, vagy valós értékké tenni?
Azaz ha beütöd, hogy 1,2,3 az simán csak így jelenjen meg, vagy legyen belőle 123?
Mert ha a megjelenítés csak a cél, akkor baromi egyszerű.
Használsz 4 változót, 1000-es 100-as 10-es 1-es helyiérték.
Alapban mindegyik 0. Billentyű lenyomásakor billentyű értékét tárolod BILLENTYU változóban, majt a 100-as helyiértéket átmásolod az 1000-es be, a 10-est a 100-asba az 1-est a 10-esbe BILLENTYU-t az 1-esbe. Ha konkrét szám is kell, akkor tagonként felszorzod a helyiértékkel, majd összeadod.
(#) Pali79 válasza sonajkniz hozzászólására (») Sze, 18:08 /
 
Köszönöm szépen neked is és majkimesternek is a segítséget.
Egy kicsit visszább kellett lépjek, mert rájöttem, hogy egy csomó felesleges dolog volt a kódban.
Most ott tartok, hogy le tudom kérdezni a billentyűzetet, egy táblázatból kiolvasom a hozzátartozó értéket és megjelenítem a kijelzőn.
Most abban kérnék segítséget, hogyan tudnám megoldani azt, hogy tudjam volt e gombnyomás?
Jelenleg úgy működik, hogy bekapcsolom a billentyűzeten az első oszlopot, végigkérdezem a sorokat, ha volt gombnyomás, akkor beállítom a gomb számértékének megfelelő értékre a változót, 0-tól, 9-ig.
Sajnos nem jut eszembe semmilyen módszer arra, hogy megbizonyosodjak arról, hogy volt-e megnyomva egy gomb vagy sem.
(#) majkimester válasza Pali79 hozzászólására (») Sze, 19:31 /
 
Ezt én úgy csinálom, hogy van egy vátozó KEYB_buffer, amiben az uoljára megnyomott gomb érékét tárolom, és van egy KEYB_flags változó, amiben különböző állapotokat tárolok egy-egy biten:
BUFFERFULL - bufferben van feldolgozatlan adat, addig nem rakok új adatot bele, amíg az előző fel nem lett dolgozva.
DEBOUNCE - egyszer beolvastam egy gombot, de mégegyszer is ugyanazt kell olvasnom, hogy elfogadjam helyesnek az értéket.
WAITREL - a felengedére várok, addig nem rakok újabb értéket a KEYB_buffer-be, amíg az előző gombot el nem engedték.

Van egy KEY_poll függvényem, amit timer IT-ből 10 ... 50 mS-enként hívok, ha a buffer tele, akkor nem csinál semmit, amig azt fel nem dolgoztam, ha üres, akkor megnézi a bill mátrixot, ha van lenyomott gomb, eltárolja egy temp változóba és beáíítja a DEBOUNCE flag-et, kövekező hívásnál ha még mindig ugyanaz az érték, akkor berakja a bufferbe és beállítja a BUFFERFULL flag-et és a WAITREL-t is. A KEY_poll következőben arra vár, hogy ne legyen lenyomott gomb.

A főprogramban meg van egy KEYB_get, ami a BUFFER_FULL flag alapján visszatér 0-val, ha nincs semmi a bufferben, vagy a lenyomott gomb ASCII kódjával, ha van. Ekkor törli a BUFFER_FULL-t.

Lehet elsőre bonyolúltnak látszik, de korrekt eredményt ad.
(#) Pali79 válasza majkimester hozzászólására (») Sze, 20:07 /
 
Még rágódom rajta, valóban egy kicsit bonyolult. Azt a részt nem nagyon értem, hogy honnan tudni, hogy a buffer tele van? Hiszen a nulla is egy gombnak az értéke, praktikusan a nulláé
(#) majkimester válasza Pali79 hozzászólására (») Sze, 21:26 / 1
 
azért van a BUFFERFULL flag, ami jelzi ezt. Ha akarsz ITT belenézhetsz. keyboard_101.zip
(#) sonajkniz válasza Pali79 hozzászólására (») Pé, 18:34 / 1
 
Bocs, de napok óta nem ültem gép előtt.
Én nem olyan profi, cserébe egyszerű módszert szoktam használni. Elindítom a billentyűzet beolvasását mátrixból 12 lépésben. Első sor olvasásához kimenet bekapcsol, majd egyenként nézem a bemeneteket. Ha van találat, bekapcsolok egy beírok egy értéket egy változóba (az adott gomb értékét), kiugrok az olvasási rutinból a beírási rutinba. Ott először ellenőrzök egy bitet, ami azt mondja meg, volt-e már itt a program. Ha volt kiugrok onnan, és megy a program a dolgára. Ha nem volt, először bekapcsolom ezt a bitet, majd elvégzem amit kell a vátozóba írt adattal, majd megy tovább a program. A bit akkor törlődik, ha a beolvasás lefutott és nem talált megnyomott gombot.
(#) Pali79 válasza sonajkniz hozzászólására (») Vas, 8:35 / 1
 
Megintcsak köszönöm mindkettőtöknek!
Nagyon jó ötleteket adtatok. Végül egy talán nem túl elegáns, de egyszerű megoldást találtam ki. A gombok értékei felülírják a váltózó értékét, 0-12 közötti értékkel. A változó értékének legfelső bitjét 1-be állítom a gombok rutinjának elején, utána ezt ellenőrzöm a kiértékelés során. Ha egy maradt, akkor nem volt gombnyomás, ha nulla, akkor megnézem milyen érték íródott bele.
Következő: »»   34 / 34
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem