Pripojenie maticovej klávesnice k mikrokontroléru. AVR. Výcvikový kurz. Postup skenovania klávesnice. Zadanie práce v laboratóriu

Charakteristické rysy:

  • 64-klávesová maticová klávesnica 8 x 8
  • Nie sú potrebné žiadne externé komponenty
  • Ukončite režim spánku stlačením tlačidla
  • Jednoduchá integrácia s inými aplikáciami
  • Nízka spotreba
  • Softvérový debounce algoritmus
  • Podpora alternatívnych funkcií tlačidiel, ktoré možno jednoducho odstrániť, aby sa zmenšila veľkosť programu
  • Programový kód môže použiť akýkoľvek mikrokontrolér AVR, ktorý má aspoň 17 I/O portov a má prerušenie zmeny linky (v súčasnosti len ATmega162 a ATmega169)
  • Kód možno ľahko upraviť pre použitie v iných mikrokontroléroch pomocou bežného prerušenia (pozri príklad aplikácie "AVR240: 4 x 4 klávesnica - prebudenie pri stlačení klávesu")

Úvod

AT tento príklad aplikácia popisuje program ovládača maticového rozhrania klávesnice 8 x 8. Príklad aplikácie je určený na použitie v zariadeniach s vlastným napájaním. Mikrokontrolér AVR trávi väčšinu času v režime spánku, pričom sa aktivuje iba po stlačení tlačidiel klávesnice. Potom sa matica klávesnice naskenuje, informácie sa spracujú a systém sa vráti do režimu nízkej spotreby.

Taktiež zariadenie opísané v tomto príklade aplikácie podporuje alternatívne užívateľsky programovateľné funkcie ako napr uzáver uzáveru, Ctrl-, Shift- a Alt-. Testovacia aplikácia obsluhuje maticu klávesnice 4 x 4, ktorej každé tlačidlo zodpovedá jednému číslu a trom znakom. Alternatívne tlačidlá umožňujú zvoliť funkciu stlačeného tlačidla.

Obrázok 1. Testovacia aplikácia

Toto zariadenie je vhodné pre všetky aplikácie, ktoré používajú maticovú klávesnicu, ako sú diaľkové ovládače diaľkové ovládanie, Mobilné telefóny a poplachové a prístupové systémy. Aktualizovať softvér je vyrobený veľmi jednoducho vďaka prítomnosti samoprogramovacích a in-systémových programovacích funkcií v mikrokontroléroch rodiny ATmega. Tieto funkcie sú užitočné najmä pri použití týchto mikrokontrolérov v univerzálnych diaľkových ovládačoch.

Zariadenie opísané v tomto príklade aplikácie je založené na mikrokontroléri ATmega162. Avšak po malé zmeny programový kód je možné použiť v mikrokontroléri ATmega169.

Princíp fungovania

Zapojenie tlačidiel matice klávesnice 8 x 8 je znázornené na obrázku 2. Po stlačení tlačidla sa spoja zodpovedajúce riadky a stĺpce. Kliknutím na ľavé horné tlačidlo sa zatvorí stĺpec úplne vľavo a najvrchnejší riadok.


Obrázok 2. Pripojenie matice klávesnice

Matrice klávesnice je možné skenovať niekoľkými spôsobmi. Ak je možné stlačiť iba jedno tlačidlo, vyberte rýchly spôsob sken, ktorý súčasne vyberie (nastaví nízku hodnotu) všetky riadky a načíta stav stĺpcov. Potom sa vyberú všetky stĺpce a načítajú sa stavy riadkov. Vrátené hodnoty stĺpcov a riadkov sú spojené do kódu, ktorý identifikuje tlačidlo, ktoré bolo stlačené. Táto metóda je použitá v tomto príklade aplikácie.

Ak je potrebné udržiavať klávesnicu, ktorá umožňuje súčasné stláčanie tlačidiel, nie je možné použiť vyššie popísaný spôsob. V tomto prípade musia byť riadky skenované oddelene. Riadky musia byť vybrané (nastavené na nízku hodnotu) postupne, pričom všetky stĺpce musia byť zrušené. V tomto prípade sú určené všetky stlačené tlačidlá. V tomto prípade sa však objavia prepojenia. Obrázok 3 ukazuje výsledok stlačenia troch kláves, pri ktorom sa zdá, že je stlačené aj tlačidlo označené X. Výsledkom je chyba dekódovania.


Obrázok 3. Nesprávne dekódovanie pri súčasnom stlačení tlačidiel

Ak chcete zistiť stlačenie tlačidla a prebudiť sa zo spánku, použite prerušenie výmeny kolíkov dostupné na mikrokontroléri AVR, ktorý používate. Pred vstupom do režimu spánku sú všetky riadkové výstupy nastavené na nízku hodnotu, čo spôsobuje, že vstupy stĺpcov sa po stlačení tlačidiel javia ako nízke. To bude mať za následok prerušenie.

Pri použití prerušenia zmeny stavu vstupu je obsluhované iba jedno stlačenie. V tomto prípade nie je vytvorené automatické opakovanie stlačenia pri držaní tlačidla. Simulácia opakovaného lisovania by mala byť realizovaná samostatným podprogramom.

Alternatívne tlačidlá

Mnoho rozhraní klávesnice používa funkcie pomocných tlačidiel. To sa dá implementovať niekoľkými spôsobmi. Jednou z najbežnejších metód je vyhradiť niekoľko tlačidiel, ktorým sú priradené alternatívne funkcie. Keď sú tieto a bežné tlačidlá stlačené súčasne, vygeneruje sa sekundárny skenovací kód. Existujú aj varianty, kde sa alternatívne tlačidlo stlačí tesne pred stlačením primárneho tlačidla. V tomto prípade odpadá nutnosť sledovať súčasné kliknutia.

Alternatívne tlačidlá sa berú do úvahy iba vtedy, keď sú stlačené primárne tlačidlá. V tomto prípade sa alternatívne tlačidlá nazývajú „jednorazové“.

Je tiež možné implementovať „spúšťacie“ tlačidlá, ktoré pri prvom stlačení aktivujú alternatívne funkcie a pri opätovnom stlačení ich deaktivujú. V tomto prípade sa pre všetky následne stlačené tlačidlá používajú alternatívne funkcie. Takéto funkcie majú štandardne tlačidlo Caps Lock počítačová klávesnica. Tento príklad aplikácie používa jednorazové aj spúšťacie tlačidlá.

Použitím princípu sekvenčného skôr než súčasného stláčania tlačidiel sa vyhnete problémom spojeným s chybným dekódovaním. Ak stlačíte niekoľko tlačidiel súčasne, aplikácia to jednoducho ignoruje.

Kontaktovať chatovanie

Obrázok 4 zobrazuje odskok kontaktov pri stlačení tlačidla. Ako vidíte, je tu imitácia opakovaného lisovania. Aby sa predišlo nesprávnemu dekódovaniu, skenovací kód sa načíta nejaký čas po prerušení zmeny stavu. Tento algoritmus, nazývaný anti-bounce, tiež zabraňuje falošným pozitívam pri vystavení hluku. Debouncing môže byť tiež implementovaný pomocou hardvérového alebo digitálneho filtra, ale metóda použitá v tejto aplikácii je najmenej nákladná.


Obrázok 4. Kontaktné chatovanie

Implementácia

V tejto implementácii je použitý mikrokontrolér ATmega162. Odporúčania pre migráciu na mikrokontrolér ATmega169 sú uvedené na konci tohto dokumentu.

Klávesnica je pripojená k dvom 8-bitovým portom mikrokontroléra AVR. Jeden port (port D) je nakonfigurovaný tak, aby prevádzkoval všetky linky ako výstupy a je pripojený k radom matice klávesnice. Druhý port (port C) je nakonfigurovaný tak, aby prevádzkoval všetky linky ako vstupy a je pripojený k stĺpcom matice klávesnice. Podrobnejšie to môžete vidieť na obrázku 2. Pri skenovaní matice klávesnice musí port použitý ako výstup držať výstupy na nízkej úrovni a port použitý ako vstup musí mať zabudované pull-up odpory.

Popísané zariadenie využíva prvý riadok portu E na vygenerovanie sériového kódu zodpovedajúceho kódu stlačeného tlačidla. Dáta sa prenášajú pomocou vstavaného UART, ktorého použitie je popísané v príklade aplikácie AVR306.

Pri normálnom stlačení sa vygeneruje skenovací kód, ktorého hodnota leží v rozsahu od 0 do 63 (8 riadkov * 8 stĺpcov). Stlačením tlačidla na vyvolanie alternatívnej funkcie sa vygeneruje aj bežný skenovací kód, no okrem toho sa nastavia zodpovedajúce príznaky alternatívnych funkcií. Tieto stavové príznaky sú uložené v globálnej premennej.

Tri tlačidlá na volanie alternatívnych funkcií sú nakonfigurované tak, aby fungovali v režime spúšťových tlačidiel, a štyri - ako jednorazové tlačidlá. Kliknutím na tieto tlačidlá sa vygeneruje bežný skenovací kód, ktorý aplikácii umožňuje zaobchádzať s nimi ako s bežnými tlačidlami.

Ďalšia globálna premenná sa používa na odovzdanie skenovacieho kódu do aplikácie spolu s príznakmi. Na prenos kódu sa používa šesť najmenej významných bitov (od 0 do 63) a najvýznamnejší bit (MSB) označuje zmenu stavu. Ovládač klávesnice nastaví tento bit pri stlačení tlačidla. Aplikácia si tento bit vyžiada a po prečítaní skenovacieho kódu ho resetuje. Globálny byte a scanword sú zobrazené na obrázku 5.


Obrázok 5. Rozšírený kód skenovania

Program ovládača klávesnice je implementovaný ako obsluha prerušenia. Hlavný program uvedie mikroprocesor do režimu spánku. Po stlačení tlačidla ovládač klávesnice prebudí mikrokontrolér AVR, prijme skenovací kód a aktualizuje globálne bajty. Po vykonaní funkcií stlačených tlačidiel hlavný program uvedie mikrokontrolér späť do režimu spánku.

Iniciačný modul a hlavný program

Obrázok 6 zobrazuje inicializačný modul a hlavný program. Resetovanie príznakov alternatívnych funkcií a globálnych premenných, ako aj inicializácia portov je popísané vyššie. Ak nie je potrebné žiadne spracovanie, vyberie sa režim nečinného spánku.


Obrázok 6. Iniciačný modul a hlavný program

Hlavný modul dekodéra klávesnice Dekodér klávesnice je obsluha prerušení zmeny portu. Najprv sa vyberie režim nečinného spánku, ktorý umožňuje Mikrokontrolér AVR aktivovať, keď časovač pretečie, čo nie je možné, keď je mikrokontrolér v režime spánku po vypnutí. Časovač je nastavený tak, aby generoval prerušenie po 5 ms, čo je celkom dosť na ukončenie prechodov signálov na výstupoch. Počas tohto času oneskorenia hlavný program opäť získa kontrolu a môže aktivovať režim spánku. Na konci doby oneskorenia sa zavolá procedúra spracovania stlačenia tlačidla. Táto funkcia dopĺňa definíciu kódu stlačeného tlačidla. Na jeho konci sa na portových linkách všetkých liniek nastaví nízka úroveň a aktivuje sa režim spánku Power-down, z ktorého je možný výstup stlačením tlačidla. Bloková schéma tohto softvérového modulu je znázornená na obrázku 7.

Obrázok 7. bloková schéma hlavného softvérového modulu dekodéra klávesnice

Skenovanie klávesnice (ovládanie stlačenia tlačidla) Obrázok 8 je bloková schéma podprogramu skenovania klávesnice. Najprv sa výsledok naskenuje podľa stĺpcov. Najmenej významné tri bity skenovacieho kódu (stĺpce) sa zvyšujú, kým sa v riadku stĺpca nenájde nízka úroveň. Potom sa smer liniek portu obráti a skenovanie sa zopakuje. Toto hľadá nízku úroveň na riadkoch riadkov. Potom sa zavolá podprogram spracovania skenovacieho kódu.


Obrázok 8. Bloková schéma rutiny skenovania klávesnice

Najprv funkcia spracovania skenovacieho kódu skopíruje vygenerovaný skenovací kód do globálnej premennej. Potom sa skenovací kód porovná s kódmi tlačidiel alternatívnych funkcií a vygenerujú sa zodpovedajúce príznaky alternatívnych funkcií. Tieto príznaky sa skopírujú do globálnej premennej. Ak stlačené tlačidlo nie je alternatívou, potom sa príznaky všetkých jednorazových alternatívnych funkcií vymažú. Nakoniec sú nastavené nové vlajky. Bloková schéma tejto funkcie je znázornená na obrázku 9.


Obrázok 9. Bloková schéma funkcie spracovania skenovacieho kódu

testovací prípad myCellPhone

Existuje aplikácia testovacieho prípadu, ktorá implementuje maticu klávesnice, ktorá sa podobá klávesnici mobilný telefón. Koncové znaky v ňom sa prenášajú cez rozhranie USART. Pomocou matice klávesnice 4 x 4 môžete vytvoriť všetky čísla a symboly, ktoré je možné poskytnúť, pomocou štyroch ďalších tlačidiel na volanie alternatívnych funkcií. Tri tlačidlá sa používajú na výber alternatívnej funkcie každého hlavného tlačidla, zatiaľ čo štvrté tlačidlo funguje ako tlačidlo Caps Lock (prepínanie medzi veľkými a malými písmenami).

Na konverziu skenovaných kódov na kombinácie kódov zodpovedajúce kódom stlačených tlačidiel, berúc do úvahy tlačidlá alternatívnych funkcií, sa používa prevodná tabuľka. Skenovací kód možno použiť aj na skenovanie matice klávesnice 8 x 8. Tabuľka by teda mala mať 8 záznamov na riadok, pričom na riadok by sa mali používať iba 4 tlačidlá. S nárastom počtu stĺpcov matice klávesnice sa teda veľkosť programu nezmení.

Veľkosť kódu aplikačný program a časové parametre

Veľkosti kódov podprogramov rôzne funkcie spracovanie matice klávesnice je uvedené v tabuľke 1.

Tabuľka 1. Veľkosti kódov podprogramov rôznych funkcií spracovania matice klávesnice

Tabuľka 2 zobrazuje trvanie rôznych akcií vykonávaných mikrokontrolérom ATmega162 pracujúcim na frekvencii 8 MHz. Tu sú sekvencie akcií od prebudenia pri zistení stlačenia tlačidla až po prechod do režimu spánku po spracovaní stlačených tlačidiel.

Tabuľka 2. Trvanie vykonaných sekvencií akcií

Ak neberiete do úvahy režim spánku Power-down, potom môžete vidieť, že mikrokontrolér väčšinu času pracuje v režime nečinnosti. V aktívnom režime je mikrokontrolér iba 0,3 ms, čo je asi 0,5 % z celkového času. Relatívna doba zotrvania v rôznych prevádzkových režimoch je uvedená v tabuľke 3.

Tabuľka 3. Spotreba a relatívny čas strávený mikrokontrolérom v rôznych prevádzkových režimoch

Ak predpokladáme, že tlačidlá sú stlačené raz za 10 minút, tak priemerná spotreba bude len 2 μA.

Úvaha o použití iných mikrokontrolérov

Jediný rozdiel pri použití mikrokontrolérov ATmega162 a ATmega169 je v tom, že musia používať rôzne porty na pripojenie matice klávesnice. ATmega162 používa port C, zatiaľ čo ATmega169 musí používať port E. Je to preto, že majú rôzne porty s prerušením zmeny linky. ATmega162 má funkciu generovania prerušenia pri zmene stavu liniek portu C a ATmega169 - pri zmene stavu liniek portu E. Ak potrebujete použiť iné alternatívne funkcie týchto portov , potom je potrebné upraviť aplikáciu tak, aby používala iný port, ktorý má funkciu vytvárania prerušení zmeny stavu linky.

Všimnite si tiež, že ATmega169 používa register SMCR na aktiváciu režimu spánku.

Pri použití iných mikrokontrolérov budete potrebovať ďalšie externé komponenty a zmenu použitého prerušenia. Použitie takýchto mikrokontrolérov na spracovanie matice klávesnice 4x4 je popísané v príklade aplikácie AVR240. Zostávajúce funkcie opísaného príkladu aplikácie nie je potrebné meniť.

Voľné kolíky mikrokontroléra často nestačia na pripojenie potrebného počtu tlačidiel. Pri priamom pripojení pre n tlačidiel je potrebné prideliť rovnaký počet I/O liniek, čo nie je vždy možné. Pre racionálnejšie využitie portových vedení môžete použiť maticovú schému zapojenia na obr. V tomto prípade má matica pripojená k portu D veľkosť 4*4=16 tlačidiel (4 riadky r0…r3 a 4 stĺpce с0…с3). Linky PD0…PD3, čo sú linky r0…r3, sú vždy konfigurované pre vstup a sú pritiahnuté k napájacej zbernici odpormi R (typická hodnota 4,7…10 kOhm). Z nich sa načíta stav tlačidiel SB1-SB16. Na riadkoch PD4 ... PD7 (stĺpce c0 ... c3) sa postupne generuje signál logickej nuly. Na začiatku je nízka úroveň nastavená na stĺpci c0 a na všetkých ostatných stĺpcoch na stav Z. Teraz, len keď sú stlačené tlačidlá tohto stĺpca (SB1…SB4) na riadkoch riadkov r0…r3, môže nastať nízka logická úroveň. Ďalej sa nastaví logická 0 v stĺpci c1 a prehľadá sa skupina tlačidiel SB5 ... SB8 atď. Pre akúkoľvek inú maticovú klávesnicu sa používa presne ten istý algoritmus voľby tlačidiel, bez ohľadu na počet riadkov a stĺpcov. Vo všeobecnosti je počet tlačidiel n súčinom počtu riadkov a stĺpcov. Takže napríklad matica 2*2 (4 riadky) bude obsahovať 4 tlačidlá. Na druhej strane však na priame pripojenie rovnakého počtu tlačidiel bude potrebný rovnaký počet vstupno-výstupných liniek. Úspora výstupov sa teda začína objavovať, keď počet tlačidiel presiahne 4 ... 6, a stáva sa ešte významnejšou s nárastom ich počtu.

Obr.1 Schéma zapojenia matice tlačidiel

Prvky VD1 ... VD4 a R1 ... R4 sú na diagrame voliteľné. Diódy slúžia na ochranu proti skrat medzi riadkami a stĺpcami. Ak sa napríklad pri stlačení tlačidla SB1 (v čase skenovania stĺpca c0) náhle ukáže, že riadok riadku r0 je nastavený na výstup a má vysokú logickú úroveň, začne neprijateľne veľký prúd prúdiť cez okruh c0r0. Hoci logika programu neumožňuje tento režim prevádzky, z rôznych dôvodov sa to stále môže stať. Preto aspoň pri ladení programu nebudú diódy zbytočné. Ak montážna kapacita pridelená kolíkom PD3 ... PD0 nie je príliš veľká, potom odpor proti ťahu na napájacej zbernici môže byť nahradený internými „vyťahovacími“ odpormi. Ak to chcete urobiť, musíte nastaviť príslušné bity v registri PORTD, keď sú linky nakonfigurované na vstup.

Príklad rutiny skenovania maticovej klávesnice

Tlačidlo Def = R16 ;Zaregistrovať sa kódom stlačeného tlačidla.def temp = R17 ;Zaregistrovať sa pre prechodné operácie ldi temp,high(RAMEND) ;Inicializácia zásobníka out SPH,temp ldi temp,low(RAMEND) out SPL,temp . clr temp ;nastavenie liniek portu D na vstup DDRD,temp ldi temp, (1<< PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3) out PORTD,temp . rcall btn_pol . ; Подпрограмма опроса матричной клавиатуры; R16 – номер нажатой кнопки на выходе из подпрограммы, ; если ни одна кнопка не нажата, то R16=0; ; если нажаты две и более кнопок, то R16=0xFF ; R17 – регистр для определения номера строки; R18 – регистр для задания номера столбца; R19 – счётчик столбцов; R20 – регистр для промежуточных операций btn_pol: clr R16 ;обнуляем регистры с кодом нажатой clr R19 ;кнопки и номером столбца ldi R18,0x0F ;очищаем регистр данных PORTD порта D out PORTD,R18 ldi R18,0x00010000 bp1: out DDRD,R18 ;настраиваем на вывод линию соответствующего nop ;столбца через регистр DDRD порта D in R17,PIND ;считываем состояние строк из регистра PIND com R17 andi R17,0x0F ;выделяем значение 4-х строк ldi R20,0 ;если ни одна кнопка в столбце не нажата, breq bp5 ;перемещаемся на следующий столбец cpi R17,0x01 ;если нажата кнопка в строке c0, ldi R20,1 ;то вычисляем её номер breq bp2 cpi R17,0x02 ;если нажата кнопка в строке c1, ldi R20,2 ;то вычисляем её номер breq bp2 cpi R17,0x04 ;если нажата кнопка в строке c2, ldi R20,3 ;то вычисляем её номер breq bp2 cpi R17,0x08 ;если нажата кнопка в строке c3, ldi R20,4 ;то вычисляем её номер brne bp3 ;если нажато более одной кнопки, завершаем опрос bp2: tst R16 ;если в предыдущих столбцах были нажаты breq bp4 bp3: ldi R16,0xFF ;кнопки, то завершаем опрос с кодом 0xFF ret bp4: push R19 ;иначе вычисляем номер кнопки, как lsl R19 ;N = 4*column + row + 1 = 4*R19 + R20 + 1 lsl R19 add R20,R19 mov R16,R20 pop R19 bp5: inc R19 lsl R18 cpi R19,4 ;повторяем цикл опроса пока не будут brne bp1 ;опрошены все 4 столбца ret

Pri všetkých výhodách má schéma pripojenia matrice jednu nevýhodu. S jeho pomocou je ťažké implementovať čítanie kombinácií tlačidiel. V prípade, že sa na takejto klávesnici stlačí ľubovoľné tri tlačidlá, ktoré medzi sebou zvierajú pravý uhol (napríklad SB1, SB2, SB5), program na polling zaznamená falošné stlačenie tlačidla ležiaceho vo voľnom rohu klávesnice. obdĺžnik (v tomto prípade SB6). V určitom scenári môže byť takýmto „fantómovým“ tlačidlom akékoľvek tlačidlo na klávesnici.

Zoznam rádiových prvkov

Označenie Typ Denominácia Množstvo PoznámkaskóreMôj poznámkový blok
DD1 MK AVR 8-bit

ATmega8

1 Do poznámkového bloku
VD1-VD4 Dióda 4 Do poznámkového bloku
R, R, R, R Rezistor 4

Takmer žiadny produkt s mikrokontrolérom sa nezaobíde bez tlačidiel. Táto téma je už otrepaná a z veľkej časti známa. Napísaním tohto článku sa nesnažím znovu vynájsť koleso. Práve som sa rozhodol zhromaždiť všetky informácie o obvodoch. Myslím si, že materiál bude užitočný pre začiatočníkov.Aby som vás nezmiatol, na obrázkoch nižšie nie sú znázornené napájacie, resetovacie a taktovacie obvody mikrokontrolérov.

Metóda jedna - tradičná

obr1a obr.1b

Ak je tlačidiel málo a nechýbajú mikropiny, použijeme tradičný spôsob zapojenia.

Po uvoľnení tlačidla sa výstup mikrónu cez odpor pripojí na „plus“ napájacieho zdroja (obr. 1a). Po stlačení tlačidla sa mikro výstup pripojí k zemi. Pulzný odpor R1 obmedzuje prúd v obvode spínača. Ak by tam nebol, po stlačení tlačidla by sme jednoducho skratovali náš zdroj energie.

Väčšina moderných mikrokontrolérov má zabudované pull-up odpory, takže externé možno vynechať (obr. 1b). V programe mikrokontroléra budete musieť nakonfigurovať použitý kolík na vstup a povoliť interný pull-up odpor.

Čo sa stane, ak je kolík mikrokontroléra vo výstupnom režime? To bude závisieť od stavu tohto kolíka. Ak je výstup „logická nula“, nič zlé sa nestane, pretože - v prvom prípade (obr. 1a) je veľkosť prichádzajúceho prúdu obmedzená odporom R1 a v druhom prípade (obr. 1b) nebude prúdiť žiadny prúd vôbec. Po stlačení tlačidla sa tiež nič nestane, pretože potenciálny rozdiel medzi výstupom a „zemou“ bude v tomto prípade rovný nule.

Ak je na výstupe „logická jednotka“ a je stlačené tlačidlo, potom cez výstup mikrokontroléra potečie do zeme prúd niekoľkých desiatok miliampérov a výstup portu môže „vyhorieť“. Maximálny povolený prúd pre výstup mikrokontroléra AVR podľa dokumentácie je 40 mA. Preto niekedy nie je od veci vložiť medzi výstup MK a tlačidlo rezistor s nominálnou hodnotou niekoľko stoviek ohmov, napríklad 330 (obr. 1c). Takže napríklad tlačidlá na ladiacej doske STK500 sú pripojené. Toto sa robí, aby sa zabezpečilo, že používateľ počas svojich experimentov náhodne nespáli mikrokontrolér.

Pre svoje rozloženia si však vystačíte aj bez tohto odporu.

Druhý spôsob - pomocou diód

Používa sa, keď sú k dispozícii viac ako dve tlačidlá a chcete uložiť závery. V tomto prípade má každé tlačidlo svoj vlastný digitálny kód a počet tlačidiel, ktoré možno týmto spôsobom zavesiť na N kolíky mk \u003d 2 N - 1. To znamená, že 7 tlačidiel je možné zavesiť na tri kolíky, 15 na štyri , a tak ďalej ... ale viac ako 7 by som nezavesil. Zvyšuje sa počet ďalších externých komponentov, schéma a program mikropočítača sa komplikujú. Okrem toho pre veľký počet tlačidiel existujú ďalšie schémy prepínania. Pull-up rezistory nie sú na schéme znázornené, predpokladá sa, že sú použité interné.

Mimochodom, cez diódy je stále možné posielať signály z tlačidiel na výstup prerušenia externého ovládača (obr. 3). Keď stlačíte akékoľvek tlačidlo, výstup externého prerušenia cez diódu sa skratuje so zemou a spôsobí prerušenie (samozrejme za predpokladu, že je nakonfigurovaný a povolený). Regulátor teda nebude musieť neustále vyvolávať tlačidlá, tento postup bude spustený iba externou udalosťou prerušenia.

Táto schéma nie je relevantná pre všetky mikrokontroléry AVR, pretože v niektorých modeloch mikrokontrolérov môže dôjsť k externému prerušeniu pri akejkoľvek zmene na akomkoľvek kolíku. (napríklad v ATmega164P)

Tretí spôsob je pre maticovú klávesnicu

Táto možnosť pripojenia sa zvyčajne používa pre bloky niekoľkých tlačidiel, ktoré sú konštrukčne kombinované a elektricky spojené v maticovom obvode. Nikto však nezakazuje používať túto schému na zapnutie obyčajných tlačidiel, ale prináša skutočné úspory s počtom tlačidiel? 9.

Výstupy PC0, PC1, PC2, PC3 sú riadky matice, výstupy PB0, PB1, PB2 sú stĺpce matice. Tlačidlá je možné vyvolávať buď podľa riadku alebo podľa stĺpca. Povedzme, že ich dopytujeme stĺpec po stĺpci. Proces hlasovania bude vyzerať takto: Počiatočný stav všetkých pinov je vstup so zapnutým pull-up rezistorom. Nastavte pin PB0 na výstupný režim a nastavte ho na nulu. Teraz stlačením tlačidiel S1, S2, S3, S4 zatvoria výstupy PC0, PC1, PC2, PC3 na 0 výkon. Skontrolujeme tieto výstupy a určíme, či je momentálne stlačené nejaké tlačidlo. Nastavte pin PB0 do výstupného režimu a zapnite pull-up rezistor. Nastavte výstup PB1 na výstupný režim a nastavte ho na nulu. Opäť sa pýtame na závery PC0, PC1, PC2, PC3. Teraz stlačením tlačidiel S5, S6, S7, S8 zatvoria výstupy PC0, PC1, PC2, PC3. Rovnakým spôsobom vypočúvame posledný stĺpec tlačidiel.

Riadky matice môžu byť vedené cez diódy na výstup externého prerušenia. Potom by sa logika programu dala postaviť takto. Ak sa klávesnica niekoľko minút nepoužíva, mikrokontrolér prejde do režimu nízkej spotreby. V tomto prípade sú výstupy PB0, PB1, PB2 nakonfigurované ako výstupy s nulovou logickou úrovňou. Po stlačení jedného z tlačidiel sa výstup prerušenia diódy uzavrie na nulu. Tým sa spustí externé prerušenie, mikrokontrolér sa prebudí a spustí časovač, na ktorom sa naskenuje klávesnica. Paralelne sa spustí počítadlo času, ktoré sa vynuluje po stlačení ktoréhokoľvek z tlačidiel. Akonáhle pretečie, mikrokontrolér opäť prejde do režimu nízkej spotreby.

Je čas povedať vám, ako usporiadať prieskum takejto Claudie. Dovoľte mi pripomenúť, že kľúč sa skladá z radov visiacich na portoch a stĺpcov, ktoré sú skenované iným portom. Kód je napísaný pre ovládač ATMega8535, ale vďaka tomu, že je tam všetko naznačené vo forme makier, dá sa to rýchlo preniesť na akýkoľvek iný ovládač triedy Mega, ako aj pod väčšinou moderných Maličký. Hoci v prípade Maličký môže dôjsť k dáveniu kvôli neúplnému súboru príkazov, ktoré majú. Budete to musieť trochu upraviť pomocou súboru.

Skrátka bližšie ku kódu. Okamžite urobím rezerváciu, že som sa rozhodol rozdeliť jeden projekt na tucet malých súborov a potom ich podľa potreby spojiť. Po prvé ostro štruktúruje kód, čím uľahčuje orientáciu v ňom a po druhé sa kód stáva modulárnym a jeho časti sa dajú použiť ako hotové knižnice v iných programoch. Stačí trochu doladiť. Z rovnakého dôvodu robím všetky definície cez makrá, takže nemusím upravovať celý kód, ale stačí zmeniť pár riadkov v konfiguračnom súbore.

Teraz stručne o súboroch:
keyboard_define.inc— konfiguračný súbor klávesnice.
Tento súbor obsahuje všetky definície makier, ktoré používa klávesnica. Tu nastavíme, ktoré piny mikrokontroléra sú pripojené na ktorú linku. Jedna jemnosť - závery v stĺpcoch ( skenovací port) musí byť sériová sada liniek rovnakého portu. Teda napríklad nohy 0,1,2,3 alebo 4,5,6,7 , alebo 3,4,5,6 . Nezáleží na tom, ktorý port, hlavná vec je byť konzistentný.
S definíciou nôh si myslím, že nebudú žiadne problémy, ale o parametri KĽÚČOVÁ MASKA Chcem povedať niečo špeciálne.
Toto je maska, podľa ktorej bude pridelený skenovaný port. Mal by obsahovať 6 jednotiek a jednu 0. Nula je nastavená na úplne pravú pozíciu skenovacieho portu.

Príklad:
Môj skenovací port visí na bitoch 7,6,5,4, úplne vpravo bit skenovacieho portu je bit 4, preto je maska ​​0b11101111 - nula je na 4. pozícii. Ak skenovacie čiary visia na nohách 5,4,3,2, maska ​​už bude 0b11111011 - nula v druhej polohe. Prečo je to všetko, bude vysvetlené nižšie.

K dispozícii je tiež maska ​​aktívnych riadkov skenovacieho portu - SKANMSK. V ňom sú jednotky iba oproti čiaram stĺpcov. Moje stĺpce sú nastavené na najvyššiu tetrádu portu, takže maska ​​skenovania vyzerá 0b11110000.

V inicializačnej časti nezabudnite ťahom nastaviť nožičky snímacieho portu na výstup a nožičky čítacieho portu na vstup. A potom niekde prilepte kód obsluhy klávesnice vo forme bežného podprogramu. Je to jednoduché – zavoláme podprogram na čítanie z klávesnice a po návrate máme v registri R16 kód skenovacieho kľúča.

Takto vyzeral môj testovací kód:

Hlavné: SEI ; Povoľujeme prerušenia.

RECALL KeyScan ; Skenovanie klávesnice
CPI R16.0; Ak sa vráti 0, nedošlo k žiadnemu kliknutiu
BREQ hlavné; V tomto prípade skočte na začiatok
RCALL Kód Gen ; Ak sa skenovací kód vrátil, preložte ho do
; ASCII kód.

MOV R17, R16 ; Načítavanie do prijímacieho registra obsluhy LCD
RECALL DATA_WR ; Zobrazujeme.

RJMP Hlavná ; Všetko zacyklíme.

Pro LCD displej, zatiaľ nič nepoviem, keďže postupy ešte neboli spomenuté, ale v blízkej budúcnosti budú zverejnené a žuvané.

Teraz vám poviem, ako to funguje postup skenovania kľúčov

Def POČET = R18
KeyScan: LDI COUNT,4 ; Naskenujte 4 stĺpce
LDI R16,KLÁVESNICA ; Vložte masku na sken 0 stĺpca.

Najprv si pripravíme skenovaciu masku. Faktom je, že nemôžeme len tak vziať a nasmerovať dáta do portu. Veď čiary visia len na posledných štyroch bitoch a na prvom môže byť čokoľvek, takže hlavnou vecou pre nás za žiadnych okolností nie je zmeniť stav bitov spodnej tetrády portu.

KeyLoop: IN R17,COL_PORT ; Preberáme predchádzajúcu hodnotu z portu
ORI R17,SCANMSK ; Bity skenovanej časti nastavíme na 1.


najprv načítať údaje z registra prístavov aby ste mali po ruke počiatočnú konfiguráciu portu. Musíme tiež nastaviť všetky skenovacie bity portu na 1, to sa vykonáva pomocou operácie ALEBO skenovaním masky. V časti, kde stáli jednotky po operácii ALEBO maskou 11110000 (môj význam SCANMASK) všetky bity sa stanú jednotkami a tam, kde bola nula, zostanú nezmenené.

A R17,R16; Resetujte bit naskenovaného stĺpca
OUT COL_PORT,R17 ; Vygenerovaný bajt vydáme z portu.


Teraz uložíme na vygenerovaný bajt aktívna maska ​​stĺpca. V ňom je najprv nula na prvej pozícii a všetky ostatné. V dôsledku toho sa ostatné hodnoty portu nezmenia, ale v prvom stĺpci sa objaví 0. Potom sa maska ​​posunie a celá operácia sa znova zopakuje. Výsledkom je, že v ďalšom stĺpci už bude nula atď. V skenovacom porte teda organizujeme „bežnú“ nulu, zatiaľ čo ostatné, cudzie bity portu zostávajú nezmenené. A potom sa vygenerované číslo nahrá do registra portov a nohy prevezmú zodpovedajúce napäťové úrovne.

NOP; Oneskorenie spínača nohy.
NOP
NOP
NOP

SBIS ROW0_PIN,ROW0 ; Skontrolujte, na ktorý riadok ste klikli
RJMP bt0

SBIS ROW1_PIN,ROW1
RJMP bt1

SBIS ROW2_PIN,ROW2
RJMP bt2

SBIS ROW3_PIN,ROW3
RJMP bt3


séria NOP potrebné na to, aby noha pred kontrolou dosiahla požadovanú úroveň. Faktom je, že skutočný obvod má určitú hodnotu kapacity a indukčnosti, čo robí Nemožná okamžitá zmena úrovne je ešte mierne oneskorenie. A pri rýchlosti 8 MHz a vyššej procesor cvaká príkazy takou rýchlosťou, že napätie na nohe ešte nekleslo a už kontrolujeme stav výstupu. Vložil som teda pár prázdnych prevádzok. Pri 8 MHz všetko funguje dobre. Pri vyššej frekvencii bude pravdepodobne potrebné dať ďalších päť alebo šesť NOP alebo držať jednoduchý cyklus. Tu sa však treba pozrieť na to, čo bude ekonomickejšie z hľadiska bajtov.
Po slučkách sú štyri kontroly na riadok. A prechod na príslušné spracovanie udalostí.

ROL R16; Posuňte skenovaciu masku
DEC COUNT ; Zníženie počtu stĺpcov
BRNE KeyLoop ; Ak ešte nie je všetko vyriešené, urobíme ešte jednu iteráciu

CLR R16; Ak neboli žiadne kliknutia, vráťte 0
RET
.undef POČET

Tu je maska ​​posunutá doľava príkazom cyklického posunu ROL. Potom znížime počítadlo iterácií (na začiatku sa rovná štyrom, pretože máme štyri stĺpce). Ak neboli žiadne kliknutia, potom na konci všetkých štyroch iterácií vypadneme zo slučky, resetujeme register R16 a vraciame sa.


bt0: ANDI R16,SCANMSK ; Vygenerujeme skenovací kód
ORI R16.0x01; Vrátime ho v registri 16
RET

A tu je jedno z možných zakončení pri stlačení. Tu sa vygeneruje skenovací kód, ktorý sa vráti do registra R16. Rozhodol som sa neobťažovať, ale ako vždy, upnúť tucet bajtov a urobiť to čo najrýchlejšie a najkratšie. Takže, čo máme po príchode v tomto kúsku kódu. A máme jednu z možností pre skenovací port ( 1110,1101,1011,0111 ), a poznáme aj číslo riadku, ktorým sme sa sem dostali. Konkrétne k tomuto dielu je možné pristupovať iba z prvého riadku príkazom RJMP bt0.
Takže urobme skenovací kód z kombinácie skenovania a čísla riadku! Len čo sa povie, tak urobí! Najprv musíme z hodnoty portu extrahovať kombináciu skenovania - uložíme ju do registra R16, takže ho nie je potrebné vyberať z prístavu. Pretlačíme operáciu A hodnotu R16 cez SCANMASK a všetko, čo bolo pod jednotkami, prešlo bez zmien a tam, kde boli nuly, to zaniklo. Opa, a my sme zobrazili skenovací kus - vysoké okusovanie. Teraz tam vložíme číslo riadku - podľa operácie ALEBO. Raz a dostali sme konštrukciu formulára [skenovať][reťazec]
Tu to necháme v registri R16 a poďme von! Podobne aj so zvyškom riadkov. Pozrite sa na zdroj, nebudem ich tu duplikovať.

Skenovanie dekódovania kódu.
Skvelé, existuje skenovací kód, ale čo s ním robiť? Nikam ho nelepte. Vieme, že táto shnyaga druhu 01110001 toto je kód jedného a niektorých LCD obrazovka alebo štandardný terminál nám strašne zaškrípu a povie nám všetko, čo si myslí o našom zápise - vidíte ASCII dať. Dobre, bude to ASCII.

Ako byť? Spustite celú štruktúru CASE kde priradiť kód pre každé skenovanie ASCII Drví ma ropucha - toľko kontrol musíte urobiť! Koľko bajtov pôjde do celej tejto treyahomudiya? A naša pamäť nie je gumená, mizerných osem kilobajtov, ale dva bajty na príkaz, to je v najlepšom prípade. To všetko som mohol urobiť priamo v obslužnom programe klávesnice. NIE!!! NAVRCHOL!!! Pôjdeme vlastnou cestou.
OK, čo máme na sklade? Metóda tabuľky prechodu nefunguje kvôli hroznej poruche skenovacích kódov. Poškriabal som tekvicu, prehrabal sa po byte ... a potom mi svitlo. Samozrejme!!! Hrubou silou!!!

Skenovací kód hrubou silou.
Takže máme strašne nesúrodý skenovací kód a tiež štíhly stôl ASCII postavy. Ako skrížiť hada s ježkom? Áno, všetko je jednoduché! Umiestnime do pamäte tabuľku symbolov do zväzku [naskenovať kód]: a potom prejdeme každý požadovaný skenovací kód cez túto tabuľku a ak sa zhoduje, nahradíme požadovaný kód na výstupe ASCII z kopy. Klasický príklad programovania – stratené v čase, ale vyhrané v pamäti.

Takto to vyzerá:

CodeGen:LDI ZH,High(Code_Table*2) ; Nahraná adresa tabuľky kódov
LDI ZL,Low(Code_Table*2) ; vysoké a nízke bajty

Tu sme načítali adresu našej tabuľky do indexového registra. Vynásobte dvoma tak, aby adresa bola v bajtoch, pretože v prostredí kompilátora sa kódový priestor rieši slovami.

Brute: LPM R17,Z+ ; Zobral som prvý znak z tabuľky - skenovací kód

CPI R17.0xFF ; Ak koniec stola
BREQ CG_Exit ; Potom ideme von

CPI R16.0; Ak je nula,
BREQ CG_Exit ; potom odchádzame

CP-R16,R17; Porovnal som to so skenovacím kódom kľúča.
BREQ Equal ; Ak je rovnaký, prejdite na náhradný kód ascii

Načítame prvý skenovací kód z tabuľky a vložíme ho do registra R17, súčasne zvyšuje adresu v registri Z(výber ďalšej bunky tabuľky) a najprv ju porovnajte s FF je kód pre koniec tabuľky. Ak je stôl u konca, vyjdite odtiaľto. Ak sme neprešli celú tabuľku, začneme porovnávať vstupnú hodnotu (v registri R16) na začiatku s nulou (bez stlačenia), ak sa nula tiež opustí. A so skenovacím kódom zo stola. Ak sa skenovanie tabuľky zhoduje so vstupným skenovaním, prejdite na Rovnaký.

LPM R17,Z+; Zvýšte Z o 1
RJMP Brute ; Opakovanie cyklu

A ak sa nič nenájde, potom príkaz znova zavoláme LPM R17,Z+ len aby to bolo väčšie Z do jedného - musíme prejsť ASCII a zo stola zoberte ďalší skenovací kód. Len I.N.C. Z nebude fungovať, pretože Z máme dvojbajtový. ZL a ZH. V niektorých prípadoch to stačí INC ZL, ale to je prípad, keď sme si istí, že adresa nie je ďaleko od začiatku a nedôjde k pretečeniu nízkeho bajtu (inak namiesto adresy 00000001: 00000000 jednoducho dostaneme 00000000: 0000000, čo je zásadne nesprávne ) a príkaz LPM urobí všetko za nás, takže tu sme ušetrili niekoľko ďalších bajtov. Potom sa vrátime na začiatok cyklu a bude to znova LPM ktorý načíta ďalší skenovací kód.

Rovná sa: LPM R16,Z ; Načítava sa ASCII kód ​​z pamäte.
RET; Vrátime sa

Ak tam bola náhoda, tak vo výsledku LPM Z+ máme Z ukazuje na ďalšiu bunku ASCII kód. Nahráme ho do registra R16 a ideme von.

CG_Exit: CLR R16 ; reset 0 = návrat 0
RET; Vrátime sa

A v prípade nulového výsledku, keď je tabuľka ukončená a skenovací kód nebol nájdený, alebo bola nula v registri R16 na vstupe, vrátime sa s rovnakou nulou na výstupe. To je všetko.



; STATICKÉ ÚDAJE
;========================================
Code_Table: .db 0x71,0x31 ;1
.db 0xB1,0x32 ;2
.db 0xD1,0x33 ;3
.db 0x72,0x34 ;4
.db 0xB2,0x35 ;5
.db 0xD2,0x36 ;6
.db 0x73,0x37 ;7
.db 0xB3,0x38 ;8
.db 0xD3,0x39 ;9
.db 0x74,0x30 ;0
.db 0xFF,0 ;KONIEC

Je to len platňa statických údajov, na hranici pamäte. Ako vidíte, údaje sú zoskupené podľa dvoch bajtov - scancode / ASCII

Tu cez takéto zvrátenosti zabral celý program so spracovaním klávesnice, dekódovaním skenovacieho kódu, čítaním/zápisom na LCD indikátor a vynulovaním RAM (je potrebné, aby sme si boli istí, že pamäť je nulová). celkom 354 bajtov. Kto dokáže menej?

Na stránkach tohto webu už boli prezentované práce na tvorbe a používaní klávesnice, tá však bola citlivá na dotyk. Tí, ktorí chcú jednoduchšiu možnosť, si skôr vyberú štandardné klávesnice, v ktorých sú tlačidlá spojené maticou. Toto spojenie tlačidiel umožňuje znížiť počet pinov potrebných na pripojenie k mikrokontroléru.

Najbežnejšie klávesnice sú 3x4 a 4x4 s 12 a 16 tlačidlami. Mal som v rukách klávesnicu 4x4. Teraz zvážime spoluprácu s ňou.

Mal som takú klávesnicu s membránovými kontaktmi. Je to dobré, pretože má hrúbku len 1 mm a dá sa ľahko nalepiť na požadované povrchy.

Postrčením tlačidiel som pomocou multimetra nastavil spôsob pripojenia tlačidiel vnútri klávesnice.


V Bascom-AVR existuje špeciálna funkcia na skenovanie maticových klávesníc Getkbd() . Tento príkaz je prispôsobený pre klávesnice 4x4, takže využíva všetkých 8 pinov jedného portu mikrokontroléra. A v prípade používania klávesníc s menším počtom tlačidiel s tým treba počítať.

Konfigurácia príkazu spočíva v priradení portu, ku ktorému bude klávesnica pripojená, času prechodu odskoku kontaktu a oneskorenia po zistení stlačenia.

napríklad v nasledujúcom riadku:

Konfig Kbd = Portd , Odskok= 20 , Oneskorenie= 100

pripojenie klávesnice k PortD nakonfigurované, čas odrazu nastavený na 20 ms, čas oneskorenia po stlačení 100 ms

Tento príkaz sa postará o všetku prácu pri skenovaní riadkov klávesnice a vráti číslo stlačeného klávesu od 0 do 15 do premenných tlačidiel.

V nižšie uvedenom príklade je klávesnica skenovaná pri 10 Hz a je v hlavnej programovej slučke. Výsledok stlačenia sa zobrazí na LCD displeji.

$regfile = "m8def.dat"
$kryštál = 1000000

"konfigurácia displeja
Konfig Lcdpin = Pin, Rs = Portc. 0, E = Portc. 1, Db4 = Portc. 2, Db5 = Portc. 3, Db6 = Portc. 4, Db7 = Portc. 5
Konfig lcd= 20 * 4
Kurzor Vypnuté
Cls

"konfigurácia klávesnice
Konfig Kbd = Portd , Odskok= 20 , Oneskorenie= 100


"premenné
Dim Key_char Akobajtov"počet stlačených kláves
Dim Kľúč_str AkoReťazec* 1 “znak stlačeného klávesu na klávesnici
Dim výsledok AkoReťazec* 20 „výsledok stlačenia klávesnice

výsledok= ""

"Hlavná slučka programu
Do

Key_char= Getkbd() "kláves nie je stlačený a funkcia vráti do premennej hodnotu 16

Ak Key_char<> 16 Potom"ak sa premenná nerovná 16, potom bolo stlačené tlačidlo
Kľúč_str= Lookupstr(key_char , Keyboard_data ) "vytiahnite znak stlačeného klávesu
výsledok= výsledok + kľúč_str
Koniec Ak

Nájdite 1 , 1

lcd výsledok "zobrazte výsledok lisovania

Waitms 100

slučka

Koniec

Keyboard_data:
Údaje "1" , "4" , "7" , "*" , "2" , "5" , "8" , "0"
Údaje "3", "6", "9", "#" , "A", "B" , "C", "D"

A tu je testovací obvod, podľa ktorého je pripojený displej a klávesnica:

Nebolo by na škodu pridať do obvodu klávesnice odpory obmedzujúce prúd s nominálnou hodnotou 100-150 Ohmov. Pre každý prípad, ale na skúšku to bude stačiť (hlavná vec nie je stlačiť niekoľko tlačidiel naraz)

Pripojíme sa, blikáme, šťuchneme do tlačidiel a vidíme výsledok - na displeji sa zobrazia symboly stlačených klávesov:


Neskôr pridám demo video hneď ako nájdem niečo na natáčanie v slušnej kvalite.

Medzitým si môžete stiahnuť archív, ktorý obsahuje súbor pre simuláciu v Proteuse a firmvér.