Matris tipli klaviaturanın mikrokontrollerə qoşulması. AVR. Təlim kursu. Klaviaturanın skan edilməsi proseduru. Laboratoriyada işləmək üçün tapşırıq

Fərqli xüsusiyyətlər:

  • 64 düyməli 8 x 8 matris klaviaturası
  • Xarici komponentlərə ehtiyac yoxdur
  • Düyməni basaraq yuxu rejimindən çıxın
  • Digər proqramlarla asan inteqrasiya
  • Aşağı istehlak
  • Proqram təminatının ləğvi alqoritmi
  • Proqramın ölçüsünü azaltmaq üçün asanlıqla çıxarıla bilən alternativ düymə funksiyaları üçün dəstək
  • Proqram kodu ən azı 17 giriş/çıxış portu olan və xətt dəyişikliyi kəsilməsinə malik olan hər hansı AVR mikrokontrolleri tərəfindən istifadə edilə bilər (hazırda yalnız ATmega162 və ATmega169)
  • Kod ümumi fasilədən istifadə edərək digər mikrokontrollerlərdə istifadə üçün asanlıqla dəyişdirilə bilər ("AVR240: 4 x 4 Klaviatura - Klavişə basıldığında oyanma" tətbiq nümunəsinə baxın)

Giriş

IN bu misal proqram 8 x 8 klaviatura matris interfeysi drayver proqramını təsvir edir Tətbiq nümunəsi özü ilə işləyən cihazlarda istifadə üçün nəzərdə tutulub. AVR mikrokontrolleri vaxtının çox hissəsini yuxu rejimində keçirir, yalnız klaviatura düymələri basıldıqda aktivləşir. Bundan sonra klaviatura matrisi skan edilir, məlumat emal edilir və sistem aşağı güc rejiminə qayıdır.

Həmçinin, bu proqram nümunəsində təsvir edilən cihaz istifadəçi tərəfindən proqramlaşdırıla bilən alternativ funksiyaları dəstəkləyir qapaq kilidi, Ctrl-, Shift- və Alt-. Test proqramı hər düyməsi bir rəqəmə və üç simvola uyğun gələn 4 x 4 klaviatura matrisinə xidmət edir. Alternativ düymələr basılan düymənin funksiyasını seçməyə imkan verir.

Şəkil 1. Test tətbiqi

Bu cihaz pult kimi matris klaviaturasından istifadə edən bütün proqramlar üçün uyğundur uzaqdan nəzarət, Mobil telefonlar və siqnalizasiya və girişə nəzarət sistemləri. Yeniləyin proqram təminatı ATmega ailəsinin mikrokontrollerlərində özünü proqramlaşdırma və sistemdaxili proqramlaşdırma funksiyalarının olması səbəbindən çox asanlıqla hazırlanır. Bu xüsusiyyətlər bu mikrokontrollerləri universal uzaqdan idarəetmə sistemlərində istifadə edərkən xüsusilə faydalıdır.

Bu tətbiq nümunəsində təsvir olunan cihaz ATmega162 mikro nəzarət cihazına əsaslanır. Lakin, sonra kiçik dəyişikliklər proqram kodu ATmega169 mikro nəzarətçisində istifadə edilə bilər.

Əməliyyat prinsipi

8 x 8 klaviatura matrisinin düymələrinin əlaqəsi Şəkil 2-də göstərilmişdir. Düymə basıldıqda müvafiq sətir və sütunlar birləşdirilir. Yuxarı sol düyməni sıxmaq ən soldakı sütunu və ən yuxarı cərgəni bağlayır.


Şəkil 2. Klaviatura matrisinin əlaqəsi

Klaviatura matrisləri bir neçə yolla skan edilə bilər. Yalnız bir düyməni basmaq olarsa, seçin sürətli yol eyni zamanda bütün sətirləri seçən (aşağı təyin edən) və sütunların vəziyyətini oxuyan skan. Bundan sonra bütün sütunlar seçilir və sətir vəziyyətləri oxunur. Qaytarılan sütun və sətir dəyərləri basılan düyməni müəyyən edən koda birləşdirilir. Bu üsul bu tətbiq nümunəsində istifadə olunur.

Düymələri eyni vaxtda basmağa imkan verən bir klaviatura saxlamaq lazımdırsa, yuxarıda təsvir olunan üsuldan istifadə edilə bilməz. Bu halda, xətlər ayrıca skan edilməlidir. Sətirlər ardıcıl olaraq seçilməlidir (aşağı ayarlanmalıdır), bütün sütunlar silinməlidir. Bu halda, bütün basılan düymələr müəyyən edilir. Ancaq bu vəziyyətdə qarşılıqlı əlaqə yaranır. Şəkil 3 üç düyməni basmağın nəticəsini göstərir, burada X ilə işarələnmiş düymənin də basıldığı görünür. Bu deşifrə xətası ilə nəticələnir.


Şəkil 3. Düymələr eyni vaxtda basıldıqda yanlış dekodlaşdırma

Düymə basmalarını aşkar etmək və yuxudan oyanmaq üçün istifadə etdiyiniz AVR mikro nəzarət cihazında mövcud olan pin dəyişdirmə fasiləsindən istifadə edin. Yuxu rejiminə daxil olmamışdan əvvəl bütün sətir çıxışları aşağı təyin edilir, bu da düymələr basıldıqda sütun girişlərinin aşağı görünməsinə səbəb olur. Bu, fasilə ilə nəticələnəcək.

Daxiletmə vəziyyətinin dəyişdirilməsi kəsilməsindən istifadə edərkən, yalnız bir mətbuat xidmət göstərir. Bu halda, düyməni basarkən avtomatik basmağın təkrarlanması formalaşmır. Təkrar basmağın simulyasiyası ayrıca bir alt proqram tərəfindən həyata keçirilməlidir.

Alternativ Düymələr

Bir çox klaviatura interfeysləri köməkçi düymə funksiyalarından istifadə edir. Bu bir neçə yolla həyata keçirilə bilər. Ən ümumi üsullardan biri alternativ funksiyaların təyin olunduğu bir neçə düyməni ayırmaqdır. Bu və adi düymələr eyni vaxtda basıldıqda ikincili skan kodu yaranır. Əsas düyməyə basılmazdan dərhal əvvəl alternativ düymənin basıldığı dəyişikliklər də var. Bu halda, eyni vaxtda klikləri izləmək ehtiyacı aradan qaldırılır.

Alternativ düymələr yalnız əsas düymələr basıldıqda nəzərə alınır. Bu halda, alternativ düymələr "tək atış" adlanır.

İlk dəfə basıldıqda alternativ funksiyaları aktivləşdirən, yenidən basıldıqda isə onları söndürən "tetik" düymələrini tətbiq etmək də mümkündür. Bu halda, bütün sonradan basılan düymələr üçün alternativ funksiyalar istifadə olunur. Bu cür funksiyalar standartda Caps Lock düyməsinə malikdir kompüter klaviaturası. Bu proqram nümunəsi həm tək atış, həm də tətik düymələrindən istifadə edir.

Düymələrə eyni vaxtda basmaqdansa, ardıcıllıq prinsipindən istifadə səhv dekodlaşdırma ilə bağlı problemlərin qarşısını alır. Eyni anda bir neçə düymə basılırsa, proqram sadəcə ona məhəl qoymayacaq.

Əlaqə söhbəti

Şəkil 4 bir düyməyə basıldıqda kontaktların sıçrayışını göstərir. Gördüyünüz kimi, təkrar basmanın təqlidi var. Səhv dekodlaşdırmanın qarşısını almaq üçün skan kodu vəziyyət dəyişikliyində fasilə baş verdikdən bir müddət sonra oxunur. Həmçinin, anti-bounce adlanan bu alqoritm səs-küyə məruz qaldıqda yalançı pozitivlərdən qaçır. Çıxış aparat və ya rəqəmsal filtrlə də həyata keçirilə bilər, lakin bu proqramda istifadə olunan üsul ən ucuzdur.


Şəkil 4. Əlaqə söhbəti

İcra

Bu tətbiqetmədə ATmega162 mikro nəzarət cihazı istifadə olunur. ATmega169 mikro nəzarətçisinə keçid üçün tövsiyələr bu sənədin sonunda verilmişdir.

Klaviatura iki 8 bitlik AVR mikrokontroller portuna qoşulub. Bir port (port D) bütün xətləri çıxış kimi idarə etmək üçün konfiqurasiya edilib və klaviatura matrisinin sıralarına qoşulub. Digər port (port C) bütün xətləri giriş kimi idarə etmək üçün konfiqurasiya edilib və klaviatura matrisinin sütunlarına qoşulub. Bunu Şəkil 2-də daha ətraflı görə bilərsiniz. Klaviatura matrisini skan edərkən çıxış kimi istifadə edilən port çıxışları aşağı tutmalı və giriş kimi istifadə edilən portda quraşdırılmış çəkilmə rezistorları olmalıdır.

Təsvir edilən cihaz, basılan düymənin koduna uyğun seriya kodu yaratmaq üçün E portunun birinci sətirindən istifadə edir. Məlumat daxili UART istifadə edərək ötürülür, istifadəsi AVR306 tətbiq nümunəsində təsvir edilmişdir.

Normal olaraq basıldığında, dəyəri 0 ilə 63 (8 sətir * 8 sütun) aralığında olan bir skan kodu yaradılır. Alternativ funksiyaya zəng etmək üçün düyməni basmaq da müntəzəm skan kodu yaradır, lakin əlavə olaraq alternativ funksiyaların müvafiq bayraqları qurulur. Bu status bayraqları qlobal dəyişəndə ​​saxlanılır.

Alternativ funksiyaları çağırmaq üçün üç düymə trigger düymələri rejimində, dördü isə tək vuruşlu düymələr kimi işləmək üçün konfiqurasiya edilmişdir. Bu düymələrə klikləməklə, proqrama onları adi düymələr kimi idarə etməyə imkan verən müntəzəm skan kodu yaranır.

Skan kodunu bayraqlarla birlikdə tətbiqə ötürmək üçün başqa bir qlobal dəyişən istifadə olunur. Altı ən az əhəmiyyətli bit kodu ötürmək üçün istifadə olunur (0-dan 63-ə qədər), ən əhəmiyyətli bit (MSB) vəziyyətin dəyişməsini göstərir. Klaviatura drayveri düyməyə basıldıqda bu biti təyin edir. Tətbiq bu biti yoxlayır və skan kodunu oxuduqdan sonra onu sıfırlayır. Qlobal bayt və skanvord Şəkil 5-də göstərilmişdir.


Şəkil 5. Genişləndirilmiş skan kodu

Klaviatura drayveri proqramı kəsmə işləyicisi kimi həyata keçirilir. Əsas proqram mikroprosessoru yuxu rejiminə keçir. Düymə basıldıqda, klaviatura sürücüsü AVR mikro nəzarət cihazını oyadır, skan kodunu alır və qlobal baytları yeniləyir. Basılan düymələrin funksiyalarını yerinə yetirdikdən sonra əsas proqram mikrokontrolleri yenidən yuxu rejiminə qoyur.

Başlanğıc modulu və əsas proqram

Şəkil 6 başlatma modulunu və əsas proqramı göstərir. Alternativ funksiya bayraqlarının və qlobal dəyişənlərin sıfırlanması, həmçinin portların işə salınması yuxarıda təsvir edilmişdir. Heç bir emal tələb olunmursa, Boş yuxu rejimi seçilir.


Şəkil 6. İnisiasiya modulu və əsas proqram

Klaviatura dekoderinin əsas modulu Klaviatura dekoderi port dəyişdirmə kəsmə idarəedicisidir. Birincisi, Boş yuxu rejimi seçilir, icazə verilir AVR mikro nəzarət cihazı taymer daşdıqda aktivləşdirilə bilər, bu, mikrokontroller Gücü azaltan yuxu rejimində olduqda mümkün deyil. Taymer 5 ms-dən sonra fasilə yaratmaq üçün təyin edilmişdir ki, bu da çıxışlardakı siqnalların keçidlərini bitirmək üçün kifayətdir. Bu gecikmə zamanı əsas proqram nəzarəti bərpa edir və yuxu rejimini aktivləşdirə bilər. Gecikmə vaxtının sonunda düymələrin basılması proseduru çağırılır. Bu funksiya basılan düymənin kodunun tərifini tamamlayır. Bunun sonunda bütün xətlərin port xətlərində aşağı səviyyə qoyulur və düyməni basmaqla çıxmaq mümkün olan Güc-söndürmə yuxu rejimi aktivləşdirilir. Bu proqram modulunun blok diaqramı Şəkil 7-də göstərilmişdir.

Şəkil 7. klaviatura dekoderinin əsas proqram modulunun blok diaqramı

Klaviaturanın Skanlanması (Düymələrin Basılması) Şəkil 8 klaviaturanın skan edilməsi alt proqramının blok diaqramıdır. Birincisi, nəticə sütunlar tərəfindən skan edilir. Skan kodunun (sütunların) ən az əhəmiyyətli üç biti sütun xəttində aşağı səviyyə aşkarlanana qədər artırılır. Bundan sonra, port xətlərinin istiqaməti ters çevrilir və tarama təkrarlanır. Bu, xətlərin xətlərində aşağı səviyyəni axtarır. Bundan sonra, skan kodunu emal edən alt proqram çağırılır.


Şəkil 8. Klaviaturanın skan edilməsi prosedurunun blok diaqramı

Birincisi, skan kodu emal funksiyası yaradılan skan kodunu qlobal dəyişənə kopyalayır. Bundan sonra skan kodu alternativ funksiyaların düymələrinin kodları ilə müqayisə edilir və alternativ funksiyaların müvafiq bayraqları yaradılır. Bu bayraqlar qlobal dəyişənə kopyalanır. Əgər basılan düymə alternativ deyilsə, o zaman bütün birdəfəlik alternativ funksiyaların bayraqları silinir. Nəhayət, yeni bayraqlar qoyulur. Bu funksiyanın blok diaqramı Şəkil 9-da göstərilmişdir.


Şəkil 9. Skan kodunun işlənməsi funksiyasının blok diaqramı

myCellPhone test işi

Klaviaturaya bənzəyən klaviatura matrisini həyata keçirən sınaq işi tətbiqi var cib telefonu. İçindəki son simvollar USART interfeysi üzərindən ötürülür. 4 x 4 klaviatura matrisindən istifadə edərək, siz daha dörd alternativ funksiya çağırış düyməsindən istifadə etməklə təmin edilə bilən bütün rəqəmləri və simvolları yarada bilərsiniz. Hər bir əsas düymənin alternativ funksiyasını seçmək üçün üç düymədən istifadə olunur, dördüncü düymə isə Caps Lock düyməsi kimi çıxış edir (böyük və ya kiçik hərflər arasında keçid).

Skan kodlarını basılan düymələrin kodlarına uyğun kod kombinasiyalarına çevirmək üçün alternativ funksiyaların düymələri nəzərə alınmaqla çevrilmə cədvəlindən istifadə olunur. Skan kodu 8 x 8 klaviatura matrisini skan etmək üçün də istifadə edilə bilər.Beləliklə, cədvəldə hər sətirdə yalnız 4 düymədən istifadə edilərkən, hər sətirdə 8 giriş olmalıdır. Beləliklə, klaviatura matrisinin sütunlarının sayının artması ilə proqramın ölçüsü dəyişməyəcəkdir.

Kod Ölçüsü tətbiq proqramı və vaxt parametrləri

Alt proqram kodu ölçüləri müxtəlif funksiyalar klaviatura matrislərinin işlənməsi Cədvəl 1-də göstərilmişdir.

Cədvəl 1. Klaviatura matrisinin emalının müxtəlif funksiyalarının alt proqramlarının kodlarının ölçüləri

Cədvəl 2-də 8 MHz tezliyində işləyən ATmega162 mikro nəzarət cihazı tərəfindən həyata keçirilən müxtəlif hərəkətlərin müddəti göstərilir. Düymənin basılması aşkar edildikdə oyanmaqdan basılan düymələri emal etdikdən sonra yuxu rejiminə keçməyə qədər olan hərəkətlərin ardıcıllığı buradadır.

Cədvəl 2. İcra edilən hərəkətlərin ardıcıllığının müddəti

Güc söndürmə yuxu rejimini nəzərə almırsınızsa, o zaman mikro nəzarətçinin çox vaxt Boş yuxu rejimində işlədiyini görə bilərsiniz. Aktiv rejimdə mikrokontroller cəmi 0,3 ms təşkil edir ki, bu da ümumi vaxtın təxminən 0,5%-ni təşkil edir. Müxtəlif iş rejimlərində nisbi qalma müddəti Cədvəl 3-də verilmişdir.

Cədvəl 3. Mikrokontroller tərəfindən müxtəlif iş rejimlərində sərf olunan sərfiyyat və nisbi vaxt

Düymələrin hər 10 dəqiqədə bir dəfə basıldığını düşünsək, orta istehlak yalnız 2 μA olacaqdır.

Digər mikrokontrollerlərdən istifadə haqqında əsaslandırma

ATmega162 və ATmega169 mikro nəzarət cihazlarından istifadə edərkən yeganə fərq, klaviatura matrisini birləşdirmək üçün müxtəlif portlardan istifadə etmələridir. ATmega162 C portundan istifadə edir, ATmega169 isə E portundan istifadə etməlidir. Bunun səbəbi onların xəttin dəyişməsi kəsildiyi müxtəlif portlara malik olmasıdır. ATmega162, C portunun xətlərinin vəziyyətinin dəyişməsi ilə bağlı fasilə yaratmaq funksiyasına malikdir və ATmega169 - E portunun xətlərinin vəziyyətinin dəyişməsi üçün. Əgər bu portların digər alternativ funksiyalarından istifadə etmək lazımdırsa. , onda siz tətbiqi elə dəyişdirməlisiniz ki, xətt vəziyyətinin dəyişməsi kəsilmələri yaratmaq funksiyasına malik başqa portdan istifadə edəsiniz.

Həmçinin nəzərə alın ki, ATmega169 yuxu rejimini aktivləşdirmək üçün SMCR reyestrindən istifadə edir.

Digər mikro nəzarətçilərdən istifadə edərkən, əlavə xarici komponentlərə və istifadə olunan kəsilməyə ehtiyacınız olacaq. 4x4 klaviatura matrisini emal etmək üçün belə mikro nəzarətçilərin istifadəsi AVR240 tətbiqi nümunəsində təsvir edilmişdir. Təsvir edilən tətbiq nümunəsinin qalan funksiyalarının dəyişdirilməsinə ehtiyac yoxdur.

Çox vaxt mikrokontrolörün sərbəst pinləri lazımi sayda düymələri birləşdirmək üçün kifayət deyil. N düymələri üçün birbaşa əlaqə ilə eyni sayda I / O xəttini ayırmaq lazımdır, bu həmişə mümkün deyil. Liman xətlərinin daha rasional istifadəsi üçün Şəkil 1-də göstərilən matrisin əlaqə sxemindən istifadə edə bilərsiniz. Bu halda D portuna qoşulan matrisin ölçüsü 4*4=16 düymə (4 sətir r0…r3 və 4 sütun с0…с3) olur. r0…r3 sətirləri olan PD0…PD3 xətləri həmişə giriş üçün konfiqurasiya edilir və R rezistorları (tipik qiymət 4,7…10 kOm) vasitəsilə güc avtobusuna çəkilir. Onlardan SB1-SB16 düymələrinin vəziyyəti oxunur. PD4 ... PD7 (sütunlar c0 ... c3) xətlərində öz növbəsində məntiqi sıfır siqnalı yaradılır. İlkin olaraq, aşağı səviyyə c0 sütununda, bütün digər sütunlarda isə Z vəziyyəti təyin olunur. İndi yalnız bu sütunun düymələri (SB1…SB4) r0…r3 sətirlərinin sətirlərində basıldıqda aşağı məntiq səviyyəsi yarana bilər. Sonra, c1 sütununda məntiqi 0 təyin olunur və bir qrup düymə SB5 ... SB8 skan edilir və s. Sətir və sütunların sayından asılı olmayaraq, hər hansı digər matris klaviaturası üçün eyni düyməli sorğu alqoritmi istifadə olunur. Ümumiyyətlə, n düymələrinin sayı sətir və sütunların sayının hasilidir. Beləliklə, məsələn, 2*2 matrisdə (4 sətir) 4 düymə olacaq. Ancaq digər tərəfdən, eyni sayda düymələri birbaşa birləşdirmək üçün eyni sayda I / O xətti lazım olacaq. Beləliklə, çıxışların qənaəti düymələrin sayı 4 ... 6-dan çox olduqda görünməyə başlayır və onların sayının artması ilə daha da əhəmiyyətli olur.

Şəkil.1 Düymələrin matrisa qoşulma sxemi

VD1 ... VD4 və R1 ... R4 elementləri diaqramda isteğe bağlıdır. Diodlar qorunmağa xidmət edir qısaqapanma sətir və sütun xətləri arasında. Məsələn, SB1 düyməsini basdığınız zaman (c0 sütununu skan edərkən) r0 sətirinin xətti qəfildən çıxsa və yüksək məntiq səviyyəsinə malikdirsə, qəbuledilməz dərəcədə böyük bir cərəyan axmağa başlayacaqdır. c0r0 dövrəsi vasitəsilə. Proqram məntiqi bu iş rejiminə icazə verməsə də, müxtəlif səbəblərdən hələ də baş verə bilər. Buna görə də, ən azı bir proqramı düzəldərkən, diodlar artıq olmayacaqdır. PD3 ... PD0 sancaqlarına verilən montaj tutumu çox böyük deyilsə, güc avtobusuna çəkilmə müqaviməti daxili "çəkmə" rezistorları ilə əvəz edilə bilər. Bunun üçün sətirlər giriş üçün konfiqurasiya edildikdə PORTD registrində müvafiq bitləri təyin etməlisiniz.

Matris Klaviatura Skan Rejimi Nümunəsi

Def düyməsi = R16 ;Basılmış düymənin kodu ilə qeydiyyatdan keçin.def temp = R17 ;Aralıq əməliyyatlar üçün qeydiyyatdan keçin ldi temp,high(RAMEND) ;Stack inisialization out SPH,temp ldi temp,low(RAMEND) out SPL,temp . clr temp ;DDRD daxil etmək üçün port D xətlərini təyin edin, 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

Bütün üstünlükləri ilə matris əlaqə sxeminin bir çatışmazlığı var. Onun köməyi ilə düymə birləşmələrinin oxunmasını həyata keçirmək çətindir. Klaviaturada aralarında düz bucaq yaradan hər hansı üç düymə (məsələn, SB1, SB2, SB5) basıldıqda, səsvermə proqramı səsvermənin sərbəst küncündə yerləşən düymənin yanlış basılmasını qeyd edəcək. düzbucaqlı (bu halda, SB6). Müəyyən bir ssenaridə belə bir "xəyal" düymə klaviaturadakı hər hansı bir düymə ola bilər.

Radio elementlərinin siyahısı

Təyinat Növ Denominasiya Kəmiyyət QeydMağazaMənim bloknotum
DD1 MK AVR 8 bitlik

ATmega8

1 Notepad üçün
VD1-VD4 Diod 4 Notepad üçün
R, R, R, R Rezistor 4

Mikro nəzarətçi ilə demək olar ki, heç bir məhsul düymələr olmadan tamamlanmır. Bu mövzu artıq sındırılmışdır və əsasən məlumdur. Bu yazını yazmaqla mən təkəri yenidən kəşf etməyə çalışmıram. Mən sadəcə olaraq dövrə ilə bağlı bütün məlumatları birlikdə toplamaq qərarına gəldim. Düşünürəm ki, material yeni başlayanlar üçün faydalı olacaq.Sizi çaşdırmamaq üçün aşağıdakı rəqəmlər mikrokontrollerlərin enerji təchizatı, sıfırlama və takt sxemlərini göstərmir.

Birinci üsul - ənənəvi

fig1a fig1b

Düymələr azdırsa və mikro sancaqlar çatışmazlığı yoxdursa, ənənəvi əlaqə metodundan istifadə edirik.

Düyməni buraxdıqda, bir rezistor vasitəsilə mikronun çıxışı enerji təchizatının "plus"una qoşulur (şəkil 1a). Düymə basıldıqda, mikro çıxış yerə qoşulur. Açılan rezistor R1 keçid dövrəsində cərəyanı məhdudlaşdırır. Əgər orada olmasaydı, onda düyməyə basılanda biz sadəcə olaraq enerji mənbəyimizi qısaqapanardıq.

Müasir mikrokontrolörlərin əksəriyyətində daxili çəkilmə rezistorları var, buna görə də xarici olanları buraxmaq olar (şəkil 1b). Mikrokontroller proqramında, istifadə olunan pinini girişə konfiqurasiya etməli və daxili açılan rezistoru işə salmalısınız.

Mikrokontroller pin çıxış rejimində olarsa nə baş verir? Bu, pin vəziyyətindən asılı olacaq. Çıxış "məntiqi sıfır" olarsa, pis bir şey olmayacaq, çünki - birinci halda (şəkil 1a) daxil olan cərəyanın miqdarı R1 rezistoru ilə məhdudlaşır və ikinci halda (şəkil 1b) heç bir cərəyan axmayacaq. bütün. Düymə basıldığında, heç bir şey olmayacaq, çünki bu vəziyyətdə çıxış və "torpaq" arasındakı potensial fərq sıfıra bərabər olacaqdır.

Çıxışda "məntiqi vahid" varsa və düyməyə basılırsa, mikrokontrolörün çıxışı vasitəsilə yerə bir neçə on milliamperlik cərəyan axacaq və port çıxışı "yana" bilər. Sənədlərə görə AVR mikro nəzarətçisinin çıxışı üçün icazə verilən maksimum cərəyan 40 mA-dır. Buna görə də, bəzən MK çıxışı ilə düymə arasında bir neçə yüz ohm nominal dəyəri olan, məsələn 330 (şəkil 1c) olan bir rezistor qoymaq yersiz deyil. Beləliklə, məsələn, STK500 debug lövhəsindəki düymələr bağlıdır. Bu, istifadəçinin təcrübələri zamanı təsadüfən mikrokontrolleri yandırmamasını təmin etmək üçün edilir.

Planlarınız üçün, lakin bu rezistor olmadan edə bilərsiniz.

İkinci yol - diodlardan istifadə

İkidən çox düymə olduqda istifadə olunur və siz nəticələri saxlamaq istəyirsiniz. Bu halda, hər bir düymənin öz rəqəmsal kodu var və bu şəkildə N sancaqlar üzərində asmaq olar düymələrin sayı mk \u003d 2 N - 1. Yəni 7 düymə üç sancaqda, 15-i dörddə asmaq olar. , və s... amma 7-dən çox asmazdım. Əlavə xarici komponentlərin sayı artır, mikrokompüterin sxemi və proqramı mürəkkəbləşir. Bundan əlavə, çox sayda düymələr üçün digər keçid sxemləri var. Çəkmə rezistorları diaqramda göstərilmir, daxili olanların istifadə edildiyi güman edilir.

Yeri gəlmişkən, diodlar vasitəsilə hələ də düymələrdən xarici nəzarətçinin kəsilməsinin çıxışına siqnal göndərmək mümkündür (Şəkil 3). Hər hansı bir düyməni basdığınız zaman, dioddan keçən xarici kəsmə çıxışı yerə qısaldılacaq və kəsilməyə səbəb olacaq (əlbəttə ki, konfiqurasiya edilmiş və aktivləşdirilmişdir). Beləliklə, nəzarətçinin düymələri daim sorğulamasına ehtiyac olmayacaq, bu prosedur yalnız xarici kəsmə hadisəsi ilə tetiklenecek.

Bu sxem bütün AVR mikrokontrollerləri üçün uyğun deyil, çünki mikrokontrollerlərin bəzi modellərində hər hansı bir pində hər hansı dəyişiklik zamanı xarici kəsilmə baş verə bilər. (məsələn, ATmega164P-də)

Üçüncü yol matris klaviaturası üçündür

Bu əlaqə seçimi adətən struktur olaraq birləşdirilmiş və matris sxemində elektriklə əlaqəli olan bir neçə düymənin blokları üçün istifadə olunur. Ancaq heç kim adi düymələri yandırmaq üçün bu sxemdən istifadə etməyi qadağan etmir, lakin bu, düymələrin sayı ilə real qənaət verirmi? 9.

PC0, PC1, PC2, PC3 çıxışları matrisin sətirləri, PB0, PB1, PB2 çıxışları matrisin sütunlarıdır. Düymələr sətir və ya sütun üzrə sorğulana bilər. Tutaq ki, biz onları sütun sütun sorğulayırıq. Səsvermə prosesi belə görünəcək: Bütün sancaqların ilkin vəziyyəti açılan rezistorun işə salındığı girişdir. PB0 pinini çıxış rejiminə qoyun və sıfıra qoyun. İndi S1, S2, S3, S4 düymələrini basaraq PC0, PC1, PC2, PC3 çıxışlarını 0 gücə bağlayacaq. Bu çıxışları sorğulayırıq və hazırda hər hansı düymənin basılıb-basılmadığını müəyyən edirik. PB0 pinini çıxış rejiminə qoyun və açılan rezistoru yandırın. PB1 çıxışını çıxış rejiminə qoyun və sıfıra qoyun. Yenə PC0, PC1, PC2, PC3 nəticələrini sorğulayırıq. İndi S5, S6, S7, S8 düymələrinə basmaqla PC0, PC1, PC2, PC3 çıxışları bağlanacaq. Düymələrin son sütununu eyni şəkildə sorğulayırıq.

Matrisin sıraları diodlar vasitəsilə xarici kəsilmənin çıxışına aparıla bilər. Onda proqramın məntiqini belə qurmaq olar. Klaviatura bir neçə dəqiqə istifadə edilmirsə, mikrokontroller aşağı güc rejiminə keçir. Bu halda, PB0, PB1, PB2 çıxışları sıfır məntiq səviyyəsinə malik çıxışlar kimi konfiqurasiya edilir. Düymələrdən biri basıldığında, diodun kəsilməsinin çıxışı sıfıra bağlanır. Bu, xarici fasiləyə səbəb olur, mikrokontroller oyanır və klaviaturanın skan edildiyi taymeri işə salır. Paralel olaraq, hər hansı bir düyməyə basıldıqda sıfırlanan vaxt sayğacı işə salınır. Doşan kimi mikrokontroller yenidən aşağı güc rejiminə keçir.

Belə bir Klaudiya sorğusunu necə təşkil edəcəyinizi söyləməyin vaxtı gəldi. Nəzərinizə çatdırım ki, klava portlarda asılan sətirlərdən və başqa port tərəfindən skan edilən sütunlardan ibarətdir. Kod nəzarətçi üçün yazılmışdır ATMega8535, lakin orada hər şey makro şəklində göstərildiyinə görə onu tez bir zamanda istənilən digər sinif nəzarətçisinə köçürmək olar. Meqa, eləcə də müasir ən altında Kiçik. Baxmayaraq ki, halda Kiçik natamam əmrlər toplusuna görə bəzi tıxaclar ola bilər. Onu bir faylla bir az düzəltməli olacaqsınız.

Bir sözlə, koda daha yaxındır. Dərhal rezervasiya edəcəm ki, bir layihəni onlarla kiçik fayla parçalamaq modasını götürdüm və lazım olduqda onları birləşdirəcəm. Birincisi, kodu kəskin şəkildə strukturlaşdırır, onda naviqasiyanı asanlaşdırır, ikincisi, kod modul olur və onun hissələri digər proqramlarda hazır kitabxana kimi istifadə edilə bilər. Sadəcə bir az düzəldin. Eyni səbəbdən, bütün kodu redaktə etmək məcburiyyətində qalmamaq üçün bütün tərifləri makrolar vasitəsilə edirəm, ancaq konfiqurasiya faylında bir neçə sətir dəyişdirmək kifayətdir.

İndi fayllar haqqında qısaca:
keyboard_define.inc— klaviatura konfiqurasiya faylı.
Bu fayl klaviatura tərəfindən istifadə edilən bütün makro tərifləri saxlayır. Burada mikrokontrolörün hansı sancaqlarının hansı xəttə qoşulduğunu təyin edirik. Bir incəlik - sütunlardakı nəticələr ( skan portu) eyni portun ardıcıl xətlər dəsti olmalıdır. Yəni, məsələn, ayaqları 0,1,2,3 və ya 4,5,6,7 , və ya 3,4,5,6 . Hansı portun fərqi yoxdur, əsas odur ki, ardıcıl olsun.
Ayaqların tərifi ilə, məncə, heç bir problem olmayacaq, ancaq parametr haqqında KEYMASK Mən xüsusi bir şey demək istəyirəm.
Bu, skan edilmiş portun ayrılacağı maskadır. O, 6 və bir 0-dan ibarət olmalıdır. Sıfır skan portunun ən sağ mövqeyinə təyin edilib.

Misal:
Skanlama portum 7,6,5,4 bitlərində asılır, skan portunun ən sağ biti bit 4-dür, ona görə də maska ​​0b11101111 - sıfır 4-cü mövqedədir. Tarama xətləri 5,4,3,2 ayaqlarına asılırsa, onda maska ​​artıq 0b11111011 - ikinci vəziyyətdə sıfır olacaq. Bütün bunların niyə baş verdiyi aşağıda izah ediləcək.

Skan portunun aktiv xətlərinin maskası da var - SCANMSK. Orada vahidlər yalnız sütunların sətirlərinin əksinədir. Sütunlarım portun ən yüksək tetradına təyin edilib, ona görə də skan maskası belə görünür 0b11110000.

Başlanğıc bölməsində skan edən portun ayaqlarını çıxışa, oxuma portunun ayaqlarını dartma ilə girişə qoymağı unutmayın. Və sonra klaviatura işləyicisi kodunu adi alt proqram şəklində bir yerə yapışdırın. İstifadəsi asandır - biz klaviaturadan oxumaq üçün alt proqrama zəng edirik və geri qayıdanda R16 registrində skan açar kodumuz var.

Test kodum belə görünür:

Əsas: SEI; Biz fasilələri aktivləşdiririk.

RCALL KeyScan; Klaviaturanın skan edilməsi
CPI R16.0; 0 qaytarılırsa, heç bir klik olmamışdır
BREQ Main; Bu vəziyyətdə başlanğıca keçin
RCALL Kodu Gen; Skan kodu qayıtdısa, onu tərcümə edin
; ASCII kodu.

MOV R17, R16; LCD işləyicisinin qəbul reyestrinə yüklənir
RCALL DATA_WR; nümayiş etdiririk.

RJMP Əsas; Hər şeyi döndəririk.

Pro LCD ekran, hələ heç nə deməyəcəyəm, çünki prosedurlar hələ ağla gətirilməyib, lakin yaxın gələcəkdə yerləşdiriləcək və çeynənəcəklər.

İndi bunun necə işlədiyini sizə xəbər verəcəyəm əsas skan proseduru

Def COUNT = R18
KeyScan: LDI COUNT,4 ; 4 sütunu skan edin
LDI R16, KEYMASK; Sütunun 0 skanına maskanı yükləyin.

Əvvəlcə skan maskasını hazırlayırıq. Məsələ burasındadır ki, biz sadəcə olaraq bu cür məlumatları götürüb porta çatdıra bilmərik. Axı, xətlər yalnız son dörd bitdə asılır və birincidə hər hansı bir şey ola bilər, buna görə də bizim üçün heç bir halda əsas şey portun aşağı tetradının bitlərinin vəziyyətini dəyişdirməkdir.

KeyLoop: IN R17,COL_PORT ; Əvvəlki dəyəri limandan alırıq
ORI R17, SCANMSK ; Skan edilmiş hissənin bitlərini 1-ə təyin etdik.


Başlanğıcda port reyestrindən məlumatları yükləyin ilkin port konfiqurasiyasının əlinizdə olması. Biz həmçinin portun bütün skan bitlərini 1-ə təyin etməliyik, bu əməliyyat vasitəsilə həyata keçirilir YA maskanı skan etməklə. Əməliyyatdan sonra bölmələrin dayandığı hissədə YA maska ​​ilə 11110000 (mənim mənasım SCANMASK) bütün bitlər bir olacaq və sıfırın olduğu yer dəyişməz qalacaq.

VƏ R17, R16; Skan edilmiş sütun bitini sıfırlayın
OUT COL_PORT,R17 ; Yaradılan baytı portdan çıxarırıq.


İndi yaradılan bayta tətbiq edirik aktiv sütun maskası. Bu, ilk növbədə, ilk mövqedə sıfır və bütün digərləri. Nəticədə, digər port dəyərləri dəyişməyəcək, lakin birinci sütunda 0 görünəcək.Sonra maska ​​hərəkət edəcək və bütün əməliyyat yenidən təkrarlanacaq. Nəticədə, sıfır artıq növbəti sütunda olacaq və s. Beləliklə, skan edilmiş portda "çalışan" sıfır təşkil edirik, portun digər kənar bitləri isə dəyişməz qalır. Və sonra yaradılan nömrə port registrinə yüklənir və ayaqları müvafiq gərginlik səviyyələrini alır.

NOP; Ayaq keçidinin gecikməsi.
XEYR
XEYR
XEYR

SBIS ROW0_PIN,ROW0 ; Hansı xəttin klikləndiyini yoxlayın
RJMP bt0

SBIS ROW1_PIN,ROW1
RJMP bt1

SBIS ROW2_PIN,ROW2
RJMP bt2

SBIS ROW3_PIN,ROW3
RJMP bt3


Serial XEYRİstədiyiniz səviyyəni almaq üçün yoxlamadan əvvəl ayağın vaxtını vermək lazımdır. Fakt budur ki, həqiqi bir dövrənin bəzi kapasitans və endüktans dəyəri var, bu da edir Mümkün olmayan ani səviyyə dəyişikliyi hələ bir az gecikmə var. Və 8 MHz və daha yüksək sürətlə prosessor əmrləri elə bir sürətlə klikləyir ki, ayaqdakı gərginlik hələ azalmayıb və biz artıq çıxışın vəziyyətini yoxlayırıq. Beləliklə, bir neçə boş əməliyyat keçirdim. 8 MHz-də hər şey yaxşı işləyir. Daha yüksək tezlikdə, yəqin ki, başqa beş-altı qoymaq lazım olacaq XEYR və ya sadə bir dövrə yapışdırın. Ancaq burada bayt baxımından nəyin daha qənaətcil olacağına baxmaq lazımdır.
Döngələrdən sonra hər sətirdə dörd yoxlama var. Və müvafiq hadisənin idarə edilməsinə keçid.

ROL R16; Skan maskasını köçürün
DEC COUNT ; Sütun sayının azaldılması
BRNE KeyLoop; Hələ hər şey qaydaya salınmayıbsa, biz daha bir iterasiya edirik

CLR R16; Heç bir klik olmadıqda, 0 qaytarın
RET
.undef COUNT

Burada maska ​​tsiklik keçid əmri ilə sola sürüşdürülür ROL. Bundan sonra iterasiya sayğacını azaldırıq (əvvəlcə dördə bərabərdir, çünki dörd sütunumuz var). Heç bir klik olmasaydı, bütün dörd təkrarlamanın sonunda biz döngədən çıxırıq, reyestri sıfırlayırıq R16 və qayıdırıq.


bt0: ANDI R16, SCANMSK ; Skan kodu yaradırıq
ORI R16.0x01; Biz onu 16-cı reyestrdə qaytarırıq
RET

Və burada basıldığında mümkün sonluqlardan biridir. Burada reyestrdə qaytarılacaq skan kodu yaradılır R16. Mən narahat olmamaq qərarına gəldim, amma həmişə olduğu kimi, onlarla baytı sıxın və mümkün qədər sürətli və qısa edin. Beləliklə, bu kod parçasına gəldikdən sonra nələrimiz var. Və skan portu üçün seçimlərdən biri var ( 1110,1101,1011,0111 ) və biz buraya gəldiyimiz sətir nömrəsini də bilirik. Konkret olaraq, bu parçaya yalnız birinci sətirdən əmrlə daxil olmaq olar RJMP bt0.
Beləliklə, skan birləşməsindən və sətir nömrəsindən bir skan kodu yaradaq! Deyiləndən tez deyil! Birincisi, port dəyərindən skanlama birləşməsini çıxarmalıyıq - biz onu registrdə saxlayırıq R16, buna görə də onu limandan çıxarmağa ehtiyac yoxdur. Biz əməliyyat və dəyəri vasitəsilə təkan R16 vasitəsilə SCANMASK və birlərin altında olan hər şey dəyişmədən keçdi və sıfırlar olan yerdə yox oldu. Opa, və biz skan edən bir parça nümayiş etdirdik - yüksək nibble. İndi sətir nömrəsini oraya yapışdırırıq - əməliyyatla YA. Bir dəfə və biz forma konstruksiyasını aldıq [scan][string]
Burada onu reyestrdə buraxırıq R16 və çıxaq! Qalan sətirlərlə də eynilə. Mənbəyə baxın, mən onları burada təkrarlamayacağam.

Skan kodu dekodlanması.
Əla, skan kodu var, amma bununla nə etmək lazımdır? Onu heç bir yerə yapışdırmayın. Biz növün bu shnyaga olduğunu bilirik 01110001 bu birinin kodudur, bəzilərinin kodudur LCD ekran və ya standart bir terminal bizə dəhşətli bir səs-küy salacaq və qeydimiz haqqında düşündüyü hər şeyi bizə söyləyəcək - görürsən ASCII ver. Tamam, ASCII olacaq.

Necə olmaq? Bütün strukturu işə salın İŞ hər bir skan üçün kod təyin etmək üçün harada ASCII Məni bir qurbağa əzib - bu qədər yoxlamaq lazımdır! Bu, bütün bu treyahomudiyaya neçə bayt gedəcək? Yaddaşımız kauçuk deyil, bədbəxt səkkiz kilobaytdır, lakin hər bir əmr üçün iki baytdır, bu ən yaxşısıdır. Bütün bunları klaviatura idarəedicisində edə bilərdim. YOX!!! ZÜRKƏ!!! Biz öz yolumuzla gedəcəyik.
Yaxşı, anbarımızda nə var? Skan kodlarının dəhşətli pozulması səbəbindən keçid cədvəli metodu işləmir. Balqabağı qaşıdım, mənzilin ətrafında dolaşdım... və sonra üstümə düşdü. Əlbəttə!!! Gücün tətbiqi!!!

Kobud güc skan kodu.
Beləliklə, bizdə olduqca uyğun olmayan bir skan kodu, eləcə də nazik bir cədvəl var ASCII personajlar. Bir ilanı kirpi ilə necə keçmək olar? Bəli, hər şey sadədir! Simvol cədvəlini bir dəstə halında yaddaşa yerləşdirək [skan kodu]:, və sonra biz bu cədvəl vasitəsilə istənilən skan kodunu işlədəcəyik və əgər uyğun gələrsə, çıxışda istədiyinizi əvəz edəcəyik. ASCII bir dəstədən. Proqramlaşdırmanın klassik nümunəsi - zamanla itirdi, ancaq yaddaşda qazandı.

Bu belə görünür:

CodeGen:LDI ZH,Yüksək(Kod_Cədvəl*2); Kod cədvəlinin ünvanı yükləndi
LDI ZL,Aşağı(Kod_Cədvəl*2) ; yüksək və aşağı bayt

Burada cədvəlimizin ünvanını indeks registrinə yüklədik. Ünvan baytlarda olsun deyə ikiyə vurun, çünki kompilyator mühitində kod sahəsi sözlərlə ünvanlanır.

Qəddar: LPM R17,Z+; Cədvəldən ilk simvolu götürdüm - skan kodu

CPI R17.0xFF; Əgər cədvəlin sonu
BREQ CG_Exit ; Sonra çıxırıq

CPI R16.0; Sıfır olarsa,
BREQ CG_Exit ; sonra ayrılırıq

CP-R16,R17; Mən onu açarın skan kodu ilə müqayisə etdim.
BREQ Bərabər; Əgər bərabərdirsə, onda ascii kodunu əvəz etməyə keçin

Cədvəldən ilk skan kodunu yükləyirik və reyestrə qoyuruq R17, eyni zamanda reyestrdə ünvanın artırılması Z(növbəti cədvəl xanasını seçərək) və ilk növbədə onunla müqayisə edin FF cədvəlin sonu üçün koddur. Cədvəl bitibsə, buradan çıxın. Bütün cədvəldən keçməmişiksə, giriş dəyərini müqayisə etməyə başlayırıq (registrdə R16) sıfırla başlanğıcda (basılmır), sıfırdan da çıxılırsa. Və cədvəldən bir skan kodu ilə. Cədvəl skanı giriş skanına uyğun gəlirsə, bura keçin bərabər.

LPM R17,Z+; Z-i 1 artırın
RJMP Brute; Döngünün təkrarlanması

Heç bir şey tapılmazsa, əmri yenidən çağırırıq LPM R17, Z+ sadəcə daha böyük etmək üçün Z birinə - biz addım atmalıyıq ASCII kodu daxil edin və cədvəldən növbəti skan kodunu götürün. Sadəcə I.N.C. Z işləməyəcək, çünki Z bizdə var iki bayt. ZL və ZH. Bəzi hallarda kifayətdir INC ZL, lakin bu, ünvanın əvvəldən uzaq olmadığına və bayt daşmasının baş verməyəcəyinə əmin olduğumuz zaman belə olur (əks halda 00000001: 00000000 ünvanının əvəzinə sadəcə olaraq 00000000: 0000000 alacağıq, bu, kökündən yanlışdır. ) və əmr LPM bizim üçün hər şeyi edəcək, buna görə də burada daha bir neçə bayt saxladıq. Sonra dövrün əvvəlinə qayıdacağıq və yenə də olacaq LPM növbəti skan kodunu yükləyəcək.

Bərabər: LPM R16,Z ; Yaddaşdan ASCII kodu yüklənir.
RET; Biz qayıdırıq

Əgər təsadüf olubsa, nəticədə LPM Z+ bizdə var Z növbəti hücrəyə işarə edir ASCII kod. Reyestrə yükləyirik R16 və çölə çıxırıq.

CG_Çıxış: CLR R16 ; sıfırla 0 = 0 qaytarın
RET; Biz qayıdırıq

Sıfır nəticə olduqda, ya cədvəl bitdikdə və skan kodu tapılmadıqda və ya girişdə R16 registrində sıfır olduqda, çıxışda eyni sıfırla qayıdırıq. Bu belədir.



; STATİK MƏLUMAT
;========================================
Kod_Cədvəl: .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 ;END

Bu, sadəcə yaddaşın kənarında olan statik məlumat lövhəsidir. Gördüyünüz kimi, məlumatlar iki baytla qruplaşdırılıb - scancode / ASCII

Burada, bu cür təhriflər vasitəsilə, bütün proqram, klaviatura ilə işləmə, skan kodunun dekodlanması, LCD göstəricisinə oxumaq / yazmaq və RAM-ı sıfırlamaq (yaddaşın sıfır olduğuna əmin olmaq üçün lazımdır) cəmi 354 bayt. Kim daha az edə bilər?

Bu saytın səhifələrində artıq klaviaturanın yaradılması və istifadəsi üzrə işlər təqdim olunub, lakin o, toxunuşa həssas idi. Daha sadə seçim istəyənlər, düymələrin matrislə birləşdirildiyi standart klaviaturaları daha çox seçirlər. Düymələrin bu əlaqəsi mikrokontrollerə qoşulmaq üçün lazım olan pinlərin sayını azaltmağa imkan verir.

Ən çox yayılmış klaviaturalar müvafiq olaraq 12 və 16 düyməli 3x4 və 4x4 ölçülü klaviaturalardır. Əlimdə 4x4 ölçülü klaviatura var idi. İndi onunla işləməyi nəzərdən keçirəcəyik.

Membran kontaktları olan belə bir klaviaturam var idi. Bu yaxşıdır, çünki yalnız 1 mm qalınlığındadır və istənilən səthlərə asanlıqla yapışdırıla bilər.

Düymələri vuraraq, bir multimetrdən istifadə edərək, klaviatura içərisindəki düymələrin necə bağlandığını təyin etdim.


Bascom-AVR-də matris klaviaturalarını skan etmək üçün xüsusi bir funksiya var Getkbd() . Bu əmr 4x4 klaviaturalar üçün uyğunlaşdırılmışdır, ona görə də bir mikrokontroller portunun bütün 8 pinindən istifadə edir. Daha az düymələri olan klaviaturalardan istifadə edildikdə, bu nəzərə alınmalıdır.

Komandanın konfiqurasiyası klaviaturanın qoşulacağı portun təyin edilməsindən, kontaktın sıçrama vaxtı və basıldıqdan sonra gecikmənin təyin edilməsindən ibarətdir.

məsələn, aşağıdakı sətirdə:

konfiqurasiya Kbd = Port, Geri çəkilmək= 20 , Gecikmə= 100

PortD ilə klaviatura bağlantısı konfiqurasiya edilib, sıçrayış vaxtı 20 ms-ə təyin edilib, 100 ms-ə basdıqdan sonra gecikmə vaxtı

Bu komanda klaviatura sətirlərinin skan edilməsi ilə bağlı bütün işlərin qayğısına qalır və basılan düymənin sayını 0-dan 15-ə qədər dəyişən düymələrə qaytarır.

Aşağıdakı nümunədə klaviatura 10 Hz tezliyində skan edilir və əsas proqram dövrəsindədir. Basmanın nəticəsi LCD displeydə göstərilir.

$regfile = "m8def.dat"
$kristal = 1000000

"ekran konfiqurasiyası
konfiqurasiya Lcdpin = Pin, Rs = Portc. 0, E = Portc. 1, Db4 = Portc. 2, Db5 = Portc. 3, Db6 = Portc. 4, Db7 = Portc. 5
konfiqurasiya lcd= 20 * 4
Kursor Söndür
Cls

"klaviatura konfiqurasiyası
konfiqurasiya Kbd = Port, Geri çəkilmək= 20 , Gecikmə= 100


"dəyişənlər
Zəif Key_char kimibayt"basılan düymənin sayı
Zəif Key_küç kimiSimli* 1 "klaviaturada basılan düymənin simvolu
Zəif nəticə kimiSimli* 20 "klaviaturanı basmağın nəticəsi

nəticə= ""

"Proqramın əsas döngəsi
Et

Key_char= Getkbd() "düyməsinə basılmır və funksiya dəyişənə 16 dəyərini qaytarır

Əgər Key_char<> 16 Sonra"əgər dəyişən 16-ya bərabər deyilsə, o zaman düyməyə basılıb
Key_küç= Lookupstr(key_char , Keyboard_data ) "basılan düymənin simvolunu çıxarın
nəticə= nəticə + açar_str
Son Əgər

Yerləşdirin 1 , 1

lcd nəticə "basın nəticəsini göstərin

Gözləyirəm 100

döngə

Son

klaviatura_data:
Data "1" , "4" , "7" , "*" , "2" , "5" , "8" , "0"
Data "3", "6", "9", "#", "A", "B", "C", "D"

Ekranın və klaviaturanın qoşulduğu sınaq sxemi budur:

Klaviatura xəttinə nominal dəyəri 100-150 Ohm olan cərəyanı məhdudlaşdıran rezistorları dövrəyə əlavə etmək zərər verməz. Hər halda, amma test üçün edəcək (əsas odur ki, bir anda bir neçə düyməni basmayın)

Birləşdiririk, yanıb-sönürük, düymələri soxuruq və nəticəni görürük - ekranda basılan düymələrin simvolları göstərilir:


Daha sonra layiqli keyfiyyətdə çəkmək üçün bir şey tapan kimi demo video əlavə edəcəyəm.

Bu vaxt siz Proteus-da simulyasiya üçün faylı və proqram təminatını ehtiva edən arxivi yükləyə bilərsiniz.