Yeddi seqmentli göstərici. Arduino və dörd rəqəmli yeddi seqmentli göstərici 4 rəqəmli göstərici və Arduino

7 seqmentli ekranın Arduino-ya qoşulması, Arduino lövhənizi daha yaxşı tanımaq üçün əla giriş səviyyəli layihədir. Amma bunu etmək olduqca asandır. Buna görə də, işi bir qədər çətinləşdirəcəyik və dörd rəqəmli yeddi seqmentli bir göstərici bağlayacağıq.



Bu halda, ümumi katodlu dörd rəqəmli LED göstərici modulundan istifadə edəcəyik.


Göstərici modulunun hər bir seqmenti çoxaldılmışdır, yəni o, boşalmasının digər seqmentləri ilə bir anod əlaqə nöqtəsini bölüşür. Və moduldakı dörd bitin hər birinin ümumi katodla öz əlaqə nöqtəsi var. Bu, hər bir rəqəmi müstəqil olaraq yandırmağa və ya söndürməyə imkan verir. Bundan əlavə, bu multipleksləşdirmə üsulu mikro nəzarətçiyə otuz iki əvəzinə yalnız on bir və ya on iki pin istifadə etməyə imkan verir.



Göstəricinin LED seqmentləri məntiq pinində 5 V-dan gücləndikdə cərəyanı məhdudlaşdıran rezistorların qoşulmasını tələb edir. Rezistorun dəyəri adətən 330 ilə 470 ohm arasında alınır. Əlavə cərəyan təmin etmək üçün tranzistorlardan istifadə etmək də tövsiyə olunur, çünki mikrokontrolörün hər bir pin maksimum 40 mA təmin edə bilər. Bütün boşalma seqmentlərini (8 nömrəli) yandırsanız, cari istehlak bu həddi keçəcəkdir. Aşağıdakı rəqəm cərəyanı məhdudlaşdıran rezistor tranzistorlarından istifadə edərək dörd rəqəmli yeddi seqmentli göstərici üçün əlaqə diaqramını göstərir.



Aşağıdakılar göstəricinin Arduino pinlərinə qoşulması üçün diaqramlardır. Burada BC547 bipolyar NPN tranzistorlarından istifadə olunur. A0 lövhəsinin girişinə qoşulmuş 10 KOhm potensiometr, göstəricidə göstərilən dəyəri 0-dan 1023-ə dəyişdirməyə imkan verir.




Arduino lövhəsində bu halda D2-D8 rəqəmsal çıxışları “a” - “g” seqmentlərini idarə etmək üçün istifadə olunur və D9-D12 rəqəmsal çıxışları D0-dan D3-ə qədər bitləri idarə etmək üçün istifadə olunur. Qeyd etmək lazımdır ki, bu nümunədə nöqtə istifadə edilmir, lakin aşağıdakı eskizdə ondan istifadə etmək mümkündür. Arduino lövhəsinin D13 pinləri nöqtə seqmentinə nəzarət etmək üçün ayrılmışdır.



Aşağıda Arduino lövhəsindən istifadə edərək dörd rəqəmli seqment göstəricisini idarə etməyə imkan verən kod verilmişdir. Onda ədədi massiv ikilik formada 0-dan 9-a qədər olan ədədlərin kodlarını təyin edir. Bu eskiz həm ümumi katodlu göstəriciləri (standart olaraq), həm də ümumi anodlu göstəriciləri dəstəkləyir (bunun üçün eskizin sonunda bir sətri şərh etmək lazımdır).


// A-dan G (və nöqtələr) seqmentlərini təmsil edən bitlər, 0-9 ədədləri üçün int rəqəmini təşkil edir = ( //ABCDEFG /dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B010, // 110, // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 ); // nöqtə və hər seqment üçün sancaqlar // DP,G,F,E,D,C,B,A const int segmentPins = ( 13,8,7,6,5,4,3,2 ); const int nbrRəqəmlər= 4; // LED göstəricisinin rəqəmlərinin sayı // rəqəmlər 0 1 2 3 const int digitPins = ( 9,10,11,12 ); etibarsız quraşdırma() ( for(int i=0; i< 8; i++) { pinMode(segmentPins[i], OUTPUT); // устанавливаем выводы для сегментов и точки на выход } for(int i=0; i < nbrDigits; i++) { pinMode(digitPins[i], OUTPUT); } } void loop() { int value = analogRead(0); showNumber(value); } void showNumber(int number) { if(number == 0) { showDigit(0, nbrDigits-1) ; // отображаем 0 в правом разряде } else { // отображаем значение, соответствующее каждой цифре // крайняя левая цифра 0, правая на единицу меньше, чем число позиций for(int digit = nbrDigits-1; digit >= 0; digit--) ( if(nömrə > 0) ( showDigit(number % 10, digit) ; number = number / 10; ) ) ) ) // Göstərilən rəqəmi 7 seqmentli indikatorun bu rəqəmində göstərin void showDigit(int) nömrə, int rəqəm) ( digitalWrite(digitPins, HIGH); for(int seqment = 1; seqment< 8; segment++) { boolean isBitSet = bitRead(numeral, segment); // isBitSet будет истинным, если данный бит будет 1 // isBitSet = ! isBitSet; // опционально // раскомментируйте опциональную строчку выше для индикатора с общим анодом digitalWrite(segmentPins, isBitSet); } delay(5); digitalWrite(digitPins, LOW); }

İşçilərin xahişi ilə 7 seqmentli LED göstərici adlı gözəl bir şey haqqında danışmaq qərarına gəldim. Əvvəla, bu nədir? Məsələ budur. Bu bir rəqəmdir, iki rəqəm də var, üç və dörd rəqəm. Daha altı rəqəm gördüm. Hər rəqəmdən sonra onluq nöqtə var. Dörd rəqəm varsa, çox vaxt ikinci rəqəmdən sonra vaxtı göstərərkən saniyələri göstərmək üçün iki nöqtə tapa bilərsiniz. Bezi ilə məşğul olduqdan sonra dövrəni öyrənməyə davam edək. Dinamik ekran nədir və nə üçün lazımdır? Göstərici 7 seqmentli olduğundan nömrəni göstərmək üçün yalnız 7 seqmentdən istifadə olunur. Onlar həmişə Latın hərfləri ilə təyin olunur A, B, C, D, E, F, G və DPŞəkilə baxaq. Hər seqmentin altında bir LED var. Bütün LEDlər bir ucda birləşdirilir. Ya anodlar, ya da katodlar və əks uclar çıxarılır. Bir rəqəmi göstərmək üçün 8 sancaqdan istifadə etməyiniz lazım olduğunu başa düşmək asandır. Bir ümumi və seqmentlər üçün yeddi. Bu, bir kateqoriyaya aiddirsə, düşünmək üçün heç bir şey yoxdur, biz hər şeyi bir limana asırıq. Dörd rəqəm olarsa nə olacaq? Səkkizin dördə vurulması otuz ikiyə bərabərdir. Oh... Bəli, belə bir 32 meqa göstərici üzərində məsaməli olacaq. Bu şəkildə işləməyəcək. İki həll yolu var. Bizimki dinamik və ya statik ekrandır. Daha çox başa düşmək üçün göstəricinin işə salınması üçün diaqrama baxaq.

Bu sxem dinamik göstəricini nəzərdə tutur. Bəli, mən dinamik və statikəm. Fərq nədir?. Statik göstərici hər bir rəqəmə öz nömrəsini verdiyimiz və onun daim aktiv olduğu, dinamik göstərici isə nömrəni birinci rəqəmdə göstərdiyimiz, sonra onu söndürüb ikinci rəqəmdə göstərdiyimiz, sonra söndürüb ekranda göstərdiyimiz zamandır. üçüncü rəqəm və s. axıdılması bitənə qədər. Sonuncu kateqoriyadan sonra yenidən birinciyə və bir dairədə davam edirik. Bunu yavaş-yavaş etsəniz, rəqəmsal işarəni görə biləcəksiniz, ancaq sürəti, məsələn, 50 Hz-ə qədər artırsanız, gözləriniz artıq titrəmə görməyəcək. Dinamik ekran belə işləyir. İndi diaqrama baxaq. Solda ATmega8 MK, onun arxasında D portunda 74ALS373 çipi var. Niyə lazımdır? Fakt budur ki, göstərici sadəcə bir növ matrisdə yığılmış 8 LED-dir. Yəni göstərici 8 LED-dən ibarət bir xətt kimi təmsil oluna bilər. Və bildiyiniz kimi, LED-lər MK ilə bağlı çox yeyirlər. Əlbəttə ki, birbaşa əlaqə qadağan edilmir, lakin MK və göstərici arasında bir növ təkrarlayıcı yerləşdirmək daha yaxşıdır. Bu məqsədlər üçün 8 bitlik mandalı buferdən istifadə etmək qərarına gəldim. Niyə o? Göstəricini ümumi bir anodla istifadə etdiyimi, yəni rəqəmin tapşırığı üçün aktiv səviyyənin 0 olduğunu nəzərə alsaq, ULN2003A mikrosxemindən (Darlinqton dövrəsinə görə 7 tranzistor qurğusu) etibarlı şəkildə istifadə edə bilərdim. buferlə narahat oluram, amma... Amma fakt budur ki, ULN2003A-nın bortunda yalnız NPN tranzistorları var və mən indikatordan yalnız ümumi anodla istifadə edə bilərəm, bəs mən onu ümumi katodla istifadə etməliyəm nə etməliyəm? Buferin kömək edəcəyi yer budur, çünki orada yazdıqlarım çıxışda olacaq. 0 istəsəniz, 1 istəyirsiniz. İdarəetmə ayaqları tərcüməçi rejimində birləşdirilir. Yəni bufer girişlə eyni şeyi çıxarır. Aya yalançı qalvanik izolyasiya. Tampondan sonra cərəyanı məhdudlaşdıran rezistorlar gəlir. Unutmayın ki, bunlar LED-lərdir və rezistorlar olmadan yanacaqlar. Rezistorun dəyəri qəbul ediləndən bir qədər az seçilməlidir. Fakt budur ki, dinamik displey müəyyən tezlikli simvolları göstərir və PWM-ə bənzəyir, yəni tezlik nə qədər yüksəkdirsə, kontrast da bir o qədər yüksəkdir. Və ən rahat kontrastla, nömrələr bir az sönük parlayacaq. Buna görə də, rezistorları bir qədər aşağı nominal dəyərlə götürmək lazımdır. Mən 360 Ohm-dan yalnız ehtiyatımda olduğu üçün istifadə etdim. Rezistorlardan sonra növbəti göstəricimizdir. Digər tərəfdən, anodların olduğu yerdə mən C portunun ilk dörd rəqəmini birləşdirdim. Beləliklə, dövrəni bir növ anladıq. İndi proqramın alqoritmini müzakirə edək. Göstərici rəqəmlərini bir-bir yandırmaq üçün ayrı bir funksiya yazacağıq və onu proqramın əsas hissəsində sonsuzca çağıracağıq. Daha dəqiq desək, funksiya 0-dan 9999-a qədər rəqəm qəbul edəcək, onu rəqəmlərə ayıracaq və sonra hər rəqəmi öz yerinə çıxaracaq. Əgər nömrə 4 rəqəmdən azdırsa, soldakı boşluqlar sıfırlarla doldurulacaq. Biz özümüzü sağ kənarla hizalayırıq. Kateqoriyalar arasında soldan sağa qaçacağıq. Hər hansı bir hərəkəti görünən etmək üçün, biz saniyədə bir dəfə çıxış sayını artırmaq üçün sayğacdan kəsmələrdən istifadə edəcəyik. Beləliklə, döyüş üçün vəzifə qoyulur. #F_CPU 7372800UL müəyyən edin // Kvars tezliyi #daxildir #daxildir #daxildir uçucu imzasız int testi = 9980; // Göstəricidə göstəriləcək dəyişən ISR(TIMER1_COMPA_vect) // Taymer 1 uyğunluğu üçün kəsmə idarəedicisi (test++; // Çıxış sayını artırın if(test > 9999) test = 0; // Əgər dörd rəqəmdən çox olarsa, onu sıfırlayın TCNT1H=0x00; //Reyestrini sıfırlayın TCNT1L=0x00; // hesablar ) void dig_out(int num); // Göstəricidə göstəriləcək funksiyanın elanı int main(boş) ( DDRC = 0x0F; // Portları konfiqurasiya edin DDRD = 0xFF; // göstərici ilə işləmək üçün rəqəmlər üçün C Portu, rəqəmlər üçün D Portu TCCR1A=0x00; // Taymeri təyin etmək TCCR1B=0x04; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x70; OCR1AL=0x80; TIMSK=0x10; sei(); // Kesintiləri aktivləşdirin while(1) ( dig_out(test); //Cari nömrəni göstərmək üçün daim funksiyaya zəng edin ) ) void dig_out (int num) // Göstəricidə 4 rəqəmi göstərmək üçün funksiya ( imzasız simvol i = 0; // Sayğac dəyişəni imzasız char raz = 1; // Rəqəm sayı imzasız char dig_num = (0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10); // Ümumi anodlu göstərici üçün rəqəm kodları imzasız char dig = (0, 0, 0, 0); // Rəqəm dəyəri üçün massiv əgər (nöm ( dig =0; dig =0; dig =0; ) if(num // Sol bitləri sıfırlarla doldurmaq üçün ( dig =0; dig =0; ) if(num // Sol bitləri sıfırlarla doldurmaq üçün ( qazma =0; ) while(sayı > 999) // Minlərin sayını alın ( dig++; say -= 1000; ) while(num > 99) // Yüzlərin sayını alın ( dig++; say -= 100; ) while(num > 9) // Onluq rəqəmini əldə edin ( dig++; say -= 10; ) dig = say; // Vahidlərin sayını əldə edin isə (raz // Bütün 4 biti doldurana qədər fırladın (PORTC = raz; // Bir dərəcə seçin PORTD = dig_num]; // Nömrəni çıxarın raz = raz // Növbəti rəqəmə keçin i++; //Növbəti rəqəmin indeksini artırın _gecikmə_ms(1); // Gecikmə 1 ms } } Bütün kod budur. Onu təsvir etməyəcəyəm, çünki hər sətir üçün şərh var. Aşağıda siz AtmelStudio6.2 layihəsi ilə arxivi yükləyə bilərsiniz. Əgər hələ də sualınız varsa, foruma xoş gəlmisiniz. Yaxşı, ən cəsarətli üçün aşağıda bütün bu balalaykanın bir videosu var))).

Yeni məqalələr

● Layihə 7: 7 seqmentli göstəricilərin 4 rəqəmli matrisi. Dinamik ekranın yaradılması

Bu təcrübədə Arduino-nun 4 bitlik yeddi seqmentli matrislə işləməsinə baxacağıq. Gəlin bir neçə yeddi seqmentli göstəricilər üzrə məlumatları göstərərkən eyni Arduino sancaqlarından istifadə etməyə imkan verən dinamik displey haqqında təsəvvür əldə edək.

Tələb olunan komponentlər:

Yeddi seqmentli indikatorların 4 rəqəmli matrisi dörd yeddi seqmentli göstəricidən ibarətdir və eyni zamanda matrisdə 4 rəqəmi göstərmək üçün nəzərdə tutulmuşdur, ondalıq nöqtəni göstərmək də mümkündür; 7 seqmentli göstəricilər üzrə 4 bitlik matrisin dövrəsi Şəkil 1-də göstərilmişdir. 7.1.

düyü. 7.1. 7 seqmentli göstəricilər üzrə 4 bitlik matrisin sxemi

Nömrəni çıxarmaq üçün A-G və DP pinlərində lazımi LED-ləri yandırmalı və 6, 8, 9 və ya 12-ci pinlərə LOW tətbiq edərək istədiyiniz matrisi seçməlisiniz.
Matris kontaktlarını Arduino lövhəsinə birləşdirək və matrisin müxtəlif bitlərinə nömrələr çıxaraq. Qoşulmaq üçün bizə 12 Arduino pin lazımdır. 4 bitlik matrisin Arduino lövhəsinə qoşulması üçün əlaqə diaqramı Şek. 7.2. Kontaktları birləşdirərkən 510 Ohm məhdudlaşdırıcı rezistorlar istifadə olunur.

düyü. 7.2. 4 bitlik matris üçün Arduino ilə əlaqə diaqramı

Matrisin ixtiyari registrinə (0-9) ədədlərin ardıcıl çıxışının eskizini yazaq. Aralıqdan təsadüfi qiymət seçmək üçün random() funksiyasından istifadə edəcəyik. Nömrələr massivi 0-9 rəqəmlərini göstərmək üçün məlumatlara uyğun dəyərləri saxlayır (baytın ən əhəmiyyətli biti göstəricinin A seqmentinin etiketinə, aşağı dərəcəli bit isə G seqmentinə uyğundur), sancaqlar massivi A-G və DP seqmentləri üçün əlaqə dəyərlərini ehtiva edir, pindigits massivində matris rəqəminin seçilməsi üçün əlaqə dəyərləri var. Eskizin məzmunu Siyahı 7.1-də göstərilmişdir.

// cari rəqəmin dəyərini saxlamaq üçün dəyişən int sayı=0; // yeddi seqmentli göstərici int rəqəmli=0; quraşdırmanı ləğv edin()( üçün (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } boş döngə()( sayı=(nömrə+1 )%10 ; Nömrəni göstər(nömrə); // (int i=0 ;i) üçün DS<4 ;i++) digitalWrite(pindigits[i],HIGH); digit=random(0 ,4 ); digitalWrite(pindigits,LOW); delay(3000 ); } boş şouNömrəsi( int num)( üçün (int i=0 ;i<7 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // seqmenti işıqlandırın // seqmenti söndürün digitalWrite(pins[i],LOW); ) )
Qoşulma qaydası:

1. Şəkildəki diaqrama uyğun olaraq yeddi seqmentli göstəricini birləşdirin. 7.3.
2. Listing 7.2-dən eskizi Arduino lövhəsinə yükləyin.

// a-g bitlərinə qoşulmaq üçün Arduino sancaqlarının siyahısı // yeddi seqmentli göstərici int pinləri=(9 ,13 ,4 ,6 ,7 ,10 ,3 ,5 ); // 0-9 rəqəmlərini göstərmək üçün dəyərlər bayt ədədləri = ( B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11); // cari dəyəri saxlamaq və emal etmək üçün dəyişən int sayı=0; int sayı1=0; int sayı2=0; // yeddi seqmentli göstərici int pindigits=(2 ,8 ,11 ,12 ); // cari rəqəmi saxlamaq üçün dəyişən int rəqəmli=0; // 100 ms ölçmək üçün imzasız uzun millis1=0 ; // rejim 1 - saniyəölçən işləyir rejim=0; const int BUTTON=14 ; // Düyməni birləşdirmək üçün pin 14(A0). int tekButton = LOW; // Düymənin cari vəziyyətini saxlamaq üçün dəyişən int prevButton = LOW; // Əvvəlki vəziyyəti saxlamaq üçün dəyişən// düymələrə boolean ledOn = false ; // LED-in cari vəziyyəti (yan/söndürülməsi) quraşdırmanı ləğv edin(){ // Düymə pinini giriş kimi konfiqurasiya edin pinMode(BUTTON, INPUT); // Sancaqları çıxış kimi konfiqurasiya edinüçün (int i=0;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } boş döngə()( tekButton = debounce(prevButton); əgər (əvvəlki düymə == AŞAĞI && tekButton == YÜKSƏK) // basılırsa... ( rejim=1 -rejim; // rejimi dəyişdirinəgər (rejim==1 ) sayı=0 ; ) əgər (millis()-millis1>=100 && rejimi==1 ) (millis1=millis1+100 ; ədəd=sayı+1 ; əgər (sayı==10000 ) ədəd=0 ; ) ədəd1=rəqəm; üçün (int i=0;i<4 ;i++) { number2=number1%10 ; number1=number1/10 ; showNumber(number2,i); for (int j=0 ;j<4 ;j++) digitalWrite(pindigits[j],HIGH); digitalWrite(pindigits[i],LOW); delay(1 ); } } // yeddi seqmentli indikatorda rəqəmləri göstərmək üçün funksiya boş şouNömrəsi( int num, int dig)( üçün (int i=0 ;i<8 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // seqmenti işıqlandırın digitalWrite(pins[i],HIGH); başqa // seqmenti söndürün digitalWrite(pins[i],LOW); ) əgər (qaz==1 ) // ikinci rəqəm üçün onluq nöqtə digitalWrite (pinlər, YÜKSƏK); ) // Sıçrayışın hamarlanması funksiyası. kimi qəbul edir // düymənin əvvəlki vəziyyətini arqumentləşdirin və faktiki olanı qaytarın. boolean debunce ( boolean sonuncu)( boolean cərəyan = rəqəmsal oxu (BUTTON); // Düymənin vəziyyətini oxuyun,əgər (son! = cari) // əgər dəyişibsə...( d elay ( 5 ) ; // dem 5 m s cari = digitalRead(BUTTON); // düymənin vəziyyətini oxuyun cərəyanı qaytarmaq; // düymənin vəziyyətini qaytarın } }

3. Düyməni basmaqla biz saniyəölçəni işə salırıq və ya dayandırırıq.

Elə parametrlər var ki, onlar üçün sadəcə göstərici deyil, obyektiv məlumat vermək daha rahat olardı. Məsələn, çöldəki havanın temperaturu və ya zəngli saatdakı vaxt. Bəli, bütün bunlar parlayan lampalar və ya LED-lərlə edilə bilər. Bir dərəcə - bir yanan LED və ya ampul və s. Ancaq bu atəşböcəkləri saymaqla - yaxşı, yox! Ancaq necə deyərlər, ən sadə həllər ən etibarlıdır. Buna görə də, uzun müddət düşünmədən, tərtibatçılar sadə LED şeritlərini götürdülər və onları düzgün qaydada təşkil etdilər.

XX əsrin əvvəllərində vakuum borularının meydana gəlməsi ilə ilk qaz boşalma göstəriciləri ortaya çıxdı.

Belə göstəricilərin köməyi ilə rəqəmsal məlumatları ərəb rəqəmləri ilə göstərmək mümkün olub. Əvvəllər bu cür lampalarda alətlər və digər elektron cihazlar üçün müxtəlif göstəricilər edilirdi. Hazırda qaz-boşaltma elementləri demək olar ki, heç bir yerdə istifadə edilmir. Ancaq retro həmişə dəbdədir, buna görə də bir çox radio həvəskarları özləri və yaxınları üçün qaz boşaltma göstəricilərində gözəl saatlar toplayırlar.


Qaz boşaltma lampalarının dezavantajı çoxlu elektrik enerjisi istehlak etməsidir. Davamlılıq haqqında mübahisə etmək olar. Universitetimizdə hələ də laboratoriya otaqlarında qaz-boşaltma göstəricilərindən istifadə edən tezlikölçənlərdən istifadə olunur.

Yeddi seqmentli göstəricilər

LED-lərin meydana gəlməsi ilə vəziyyət yaxşılığa doğru kəskin şəkildə dəyişdi. LED-lərin özləri az cərəyan sərf edirlər. Onları düzgün mövqedə yerləşdirsəniz, tamamilə istənilən məlumatı göstərə bilərsiniz. Bütün ərəb rəqəmlərini vurğulamaq üçün yalnız yeddi işıqlı LED şeridi kifayətdir - müəyyən bir şəkildə qurulmuş seqmentlər:

Demək olar ki, bütün belə yeddi seqmentli göstəricilərə səkkizinci seqment də əlavə olunur - nöqtə, beləliklə istənilən parametrin tam və kəsr dəyərini göstərmək mümkün olsun.

Nəzəri olaraq biz səkkiz seqmentli göstərici alırıq, lakin köhnə üsulla onu yeddi seqmentli göstərici də adlandırırlar.

Nəticə nədir? Yeddi seqmentli göstəricinin hər bir zolağı bir LED və ya LED qrupu ilə işıqlandırılır. Nəticədə, müəyyən seqmentləri vurğulayaraq, 0-dan 9-a qədər rəqəmləri, həmçinin hərfləri və simvolları göstərə bilərik.

Diaqramdakı növlər və təyinat

Birrəqəmli, ikirəqəmli, üçrəqəmli və dördrəqəmli yeddi seqmentli göstəricilər var. Mən dörd kateqoriyadan artıq görməmişəm.

Diaqramlarda yeddi seqmentli göstərici belə görünür:

Əslində, əsas terminallara əlavə olaraq, hər yeddi seqmentli göstərici də ümumi anod (OA) və ya ümumi katod (OC) ilə ümumi terminala malikdir.

Ümumi anodlu yeddi seqmentli bir göstəricinin daxili dövrəsi bu kimi görünəcəkdir:


və bu kimi ümumi katodla:


Ümumi bir anod (OA) olan yeddi seqmentli bir göstəricimiz varsa, dövrədə bu pinə "artı" güc verməliyik və ümumi katod (OC) varsa, "mənfi" və ya torpaq.

Yeddi seqmentli göstəricini necə yoxlamaq olar

Aşağıdakı göstəricilərimiz var:


Müasir yeddi seqmentli göstəricini yoxlamaq üçün bizə yalnız diod test funksiyası olan bir multimetr lazımdır. Birincisi, biz ümumi bir nəticə axtarırıq - bu, ya OA, ya da OK ola bilər. Burada yalnız təsadüfi. Yaxşı, sonra yuxarıdakı diaqramlara uyğun olaraq göstəricinin qalan seqmentlərinin işini yoxlayırıq.

Aşağıdakı fotoda gördüyünüz kimi, sınaqdan keçirilən seqment yanır. Eyni şəkildə digər seqmentləri yoxlayırıq. Bütün seqmentlər yanırsa, belə bir göstərici bütövdür və inkişaflarınızda istifadə edilə bilər.


Bəzən bir seqmenti yoxlamaq üçün multimetrdəki gərginlik kifayət deyil. Buna görə bir enerji təchizatı götürürük və onu 5 Volta qoyuruq. Seqmentdən keçən cərəyanı məhdudlaşdırmaq üçün 1-2 Kilo-Ohm müqavimətini yoxlayırıq.


Eyni şəkildə Çin qəbuledicisindən göstəricini yoxlayırıq


Sxemlərdə yeddi seqmentli göstəricilər hər bir pində rezistorlara qoşulur

Müasir dünyamızda yeddi seqmentli göstəricilər tamamilə istənilən məlumatı göstərə bilən maye kristal göstəricilərlə əvəz olunur.

lakin onlardan istifadə etmək üçün bu cür cihazların dövrə dizaynında müəyyən bacarıqlara ehtiyacınız var. Buna görə də yeddi seqmentli göstəricilər aşağı qiymətə və istifadənin asanlığına görə bu gün də istifadə olunur.

Yeddi seqmentli LED göstəricini Arduino lövhəsinə qoşaq və Led4Digits.h kitabxanasından istifadə edərək onu idarə etməyi öyrənək.

Əvvəlki dərsdə mikrokontrollerlər ətraflı təsvir edilmişdir. Belə bir göstəricini Arduino lövhəsinə bağlayaq.

Göstəricinin Arduino lövhəsinə qoşulması diaqramı belə görünür.

Mən onu dövrə lövhəsinə yığdım.

Göstəriciləri idarə etmək üçün Led4Digits.h kitabxanasını yazdım:

Və ödəyin.

Kitabxana yeddi seqmentli göstəriciləri idarə etməyə imkan verir:

  • dörd rəqəmə qədər ölçü;
  • nəzarət impuls polaritelərinin hər hansı variantları ilə (hamısı);
  • paralel prosesdə işləyir;
  • göstəricidə göstərməyə imkan verir:
    • hər bir kateqoriyanın seqmentləri;
    • hər rəqəmin rəqəmi;
    • tam 0 ... 9999;
  • tam ədədi çıxarmaq üçün rəqəmlərin sayını təyin etmək olar;
  • Əhəmiyyətsiz rəqəmləri sıxışdırmaq üçün bir rejim var.

Led4Digits.h kitabxanasını bu linkdən yükləyə bilərsiniz:

Və ödəyin. Cəmi 40 rub. bütün sayt resurslarına daxil olmaq üçün ayda!

Necə quraşdırmaq haqqında yazılıb.

Mənbə mətnləri verməyəcəyəm. Siz onları kitabxana fayllarında axtara bilərsiniz. Həmişə olduğu kimi, orada çoxlu şərhlər var. Kitabxanadan necə istifadə edəcəyimi misallarla ətraflı təsvir edəcəyəm.

Arduino Led4Digits üçün LED idarəetmə kitabxanası.

Budur sinif təsviri. Mən yalnız ictimai üsulları və xüsusiyyətləri təqdim etdim.

sinif Led4Rəqəmləri (
ictimai:
bayt rəqəmi; // bit seqment idarəetmə kodları
void regen(); // regenerasiya, üsul müntəzəm olaraq çağırılmalıdır
void tetradToSegCod(bayt qazma, bayt tetrad); // tetradın seqment kodlarına çevrilməsi
boolean çap (imzasız int dəyəri, bayt rəqəmliNum, bayt boş); // tam çıxış



} ;

Konstruktor.

Led4Rəqəmləri (bayt növüLed, bayt rəqəmliPin0, bayt rəqəmliPin1, bayt rəqəmliPin2, bayt rəqəmliPin3,
bayt segPinA, bayt segPinB, bayt segPinC, bayt segPinD,
bayt segPinE, bayt segPinF, bayt segPinG, bayt segPinH);

typeLed Bit və seqment seçimi siqnalları üçün nəzarət impuls polaritelerini təyin edir. İstənilən əlaqə sxemlərini dəstəkləyir ().

typeLed Kateqoriya seçimi Seqment seçimi Dövrə növü
0 -_- -_- Boşaltma seçim düymələri ilə ümumi anod
1 _-_ -_- Ümumi anod
2 -_- _-_ Ümumi katod
3 _-_ _-_ Boşaltma seçim düymələri ilə ümumi katod

digitPin0...digitPin3– rəqəmlərin seçilməsi üçün çıxışlar. digitPin = 255 olarsa, rəqəm deaktivdir. Bu, göstəriciləri daha az rəqəmlə birləşdirməyə imkan verir. digitPin0 – aşağı (sağ) rəqəm.

segPinA...segPinH– seqment idarəetmə çıxışları.

Misal üçün,

deməkdir: göstərici növü 1; boşalma çıxışları 5,4,3,2; 6,7,8,9,10,11,12,13 seqmentlərinin nəticələri.

void regen() metodu

Metod paralel prosesdə müntəzəm olaraq çağırılmalıdır. O, göstəricilər üzərində təsviri bərpa edir. Regenerasiya dövrünün müddəti bitlərin sayına vurulan metod çağırış müddətinə bərabərdir.

Misal üçün,

// kəsmə idarəedicisi 2 ms
void timerInterrupt() (
disp.regen(); // göstərici bərpası
}

Bayt rəqəm massivi

Seqmentlərin vəziyyətini ehtiva edir. rəqəm ən az əhəmiyyətli bitdir, rəqəmin ən az əhəmiyyətli biti ən az əhəmiyyətli bitin “A” seqmentidir. 1 bit vəziyyəti seqmentin yandığını bildirir.

Misal üçün,

rəqəm = B0000101;

o deməkdir ki, ikinci rəqəmdə “A” və “C” seqmentləri yanır.

Hər bir rəqəmin bütün seqmentlərini ardıcıl olaraq işıqlandıran proqram nümunəsi.

// çalışan seqmentlər
#daxildir
#daxildir

//
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

ləğv quraşdırma() (
taymer kəsilməsi 2 ms
MsTimer2::start(); // müdaxiləni aktivləşdirin
}

boş döngə () (
üçün (int i = 0; i< 32; i++) {
əgər (i == 0) disp.digit= 1;
başqa əgər (i == 8) disp.digit= 1;
başqa əgər (i == 16) disp.digit= 1;
başqa əgər (i == 24) disp.digit= 1;
başqa(
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
}
gecikmə (250);
}
}

//kəsmə idarəedicisi 2 ms
void timerInterrupt() (
disp.regen(); // göstərici bərpası
}

Rəqəmlər massivində 1 sürüşdürülür və göstəricilər bunu göstərir.

Metod etibarsız tetradToSegCod(bayt qazma, bayt tetrad)

Metod, onaltılıq kodun rəqəmlərini və hərflərini fərdi rəqəmlərdə göstərməyə imkan verir. Arqumentləri var:

  • qazmaq – rəqəm nömrəsi 0 ... 3;
  • tetrad - onluq simvol kodu. Kod 0 "0" rəqəmini, kod 1 - "1" rəqəmini, kod 14 - "E" hərfini göstərəcəkdir.

Misal üçün,

tetrad(2, 7);

üçüncü rəqəmdə “7” rəqəmini göstərəcək.

Hər bir rəqəmdəki simvolları növbə ilə dəyişən proqram nümunəsi.

// nömrələri bir-bir
#daxildir
#daxildir

// göstərici növü 1; boşalma çıxışları 5,4,3,2; seqment çıxışları 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

ləğv quraşdırma() (
MsTimer2::set(2, timerInterrupt); // taymer kəsilməsi 2 ms
MsTimer2::start(); // müdaxiləni aktivləşdirin
}

boş döngə () (
üçün (int i = 0; i< 64; i++) {
disp.tetradToSegCod(i>>4, i);
gecikmə (250);
}
}

// kəsmə idarəedicisi 2 ms
void timerInterrupt() (
disp.regen(); // göstərici bərpası
}

Boolean çap üsulu (imzasız int dəyəri, bayt rəqəmliNum, bayt boş)

Metod göstəricilər üzərində tam ədəd göstərir. O, hər bir rəqəm üçün ikili ədədi BCD-yə çevirir. Arqumentləri var:

  • dəyər – göstəricidə göstərilən nömrə.
  • digitNum – nömrə üçün rəqəmlərin sayı. Bu göstərici rəqəmlərin sayı ilə qarışdırılmamalıdır. Siz rəqəmi 2 rəqəmdə, digər iki rəqəmdə isə simvol göstərmək istəyə bilərsiniz.
  • boş - əhəmiyyətsiz rəqəmlərin sıxışdırılması əlaməti. boş=0 o deməkdir ki, nömrə bütün sıfırlarla göstərilməlidir. "7" rəqəmi "0007" kimi görünəcək. Boş 0-dan fərqlidirsə, əhəmiyyətsiz sıfırlar sıxışdırılacaq.

Rəqəmlərin dəyəri seçilmiş rəqəmlər (digitNum) üçün icazə verilən rəqəmi keçərsə, funksiya indikatorda “---” göstərəcək və yalnış qaytaracaq.

Nömrə çıxarma proqramının nümunəsi.

// çıxış nömrəsi
#daxildir
#daxildir

// göstərici növü 1; boşalma çıxışları 5,4,3,2; seqment çıxışları 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

ləğv quraşdırma() (
MsTimer2::set(2, timerInterrupt); // taymer kəsilməsi 2 ms
MsTimer2::start(); // müdaxiləni aktivləşdirin
}

boş döngə () (
üçün (int i = 0; i< 12000; i++) {
disp.print(i, 4, 1);
gecikmə(50);
}
}

// kəsmə idarəedicisi 2 ms
void timerInterrupt() (
disp.regen(); // göstərici bərpası
}

Son iki üsul "H" seqmentinin vəziyyətini dəyişmir - onluq nöqtə. Nöqtənin vəziyyətini dəyişdirmək üçün əmrlərdən istifadə edə bilərsiniz:

rəqəm |= 0x80; // onluq nöqtəni yandırın
rəqəm &= 0x7f; // ondalık nöqtəni söndürün

Mənfi ədədlərin göstəricilərinə çıxış (int).

Mənfi ədədlər aşağıdakı kimi çıxarıla bilər:

  • Nömrənin işarəsini yoxlayın.
  • Rəqəm mənfi olarsa, ən əhəmiyyətli rəqəmdə mənfi işarəni çap edin və print() funksiyasında ədədin işarəsini müsbətə dəyişdirin.
  • Əgər rəqəm müsbətdirsə, işarə bitini söndürün və print() funksiyasından istifadə edərək nömrəni çap edin.

Budur, bu üsulu nümayiş etdirən bir proqram. -999-dan 999-a qədər rəqəmlər çıxarır.

// mənfi ədədlər çıxarın
#daxildir
#daxildir

// göstərici növü 1; boşalma çıxışları 5,4,3,2; seqment çıxışları 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

ləğv quraşdırma() (
MsTimer2::set(2, timerInterrupt); // taymer kəsilməsi 2 ms
MsTimer2::start(); // müdaxiləni aktivləşdirin
}

boş döngə () (

üçün (int i = -999; i< 1000; i++) {

Əgər mən< 0) {
// rəqəm mənfidir
disp.digit= B01000000; // işarəsi -
disp.print(i * -1, 3, 1);
}
başqa(
disp.digit= B00000000; // işarəni təmizləyin
disp.print(i, 3, 1);
}

gecikmə(50);
}
}

// kəsmə idarəedicisi 2 ms
void timerInterrupt() (
disp.regen(); // göstərici bərpası
}

Kəsir ədədlərin göstəricilərinə çıxış, float formatı.

Standart C dili funksiyalarından istifadə edərək, üzən nöqtəli nömrələri (float) çıxarmağın bir çox yolu var. Bu, ilk növbədə, sprint() funksiyasıdır. Çox yavaş işləyir, simvol kodlarının ikili onluq kodlara əlavə çevrilməsini tələb edir, sətirdən bir nöqtə çıxarmaq lazımdır. Digər funksiyalarla eyni problemlər.

Mən göstəricilərdə float dəyişənlərinin dəyərlərini göstərmək üçün fərqli bir üsuldan istifadə edirəm. Metod sadə, etibarlı, sürətlidir. Aşağıdakı əməliyyatlara qədər azaldır:

  • Üzən nöqtə nömrəsi lazımi onluq yerlərin sayına uyğun gələn gücə 10 ilə vurulur. Göstəricilərdə 1 onluq yer göstərmək lazımdırsa, 10-a, 2-dirsə, onda 100-ə, 3 onluq yerini 1000-ə vurun.
  • Sonra, üzən nöqtə nömrəsi açıq şəkildə tam ədədə (int) çevrilir və print() funksiyasından istifadə edərək göstəricilərdə göstərilir.
  • Lazım olan rəqəmə bir nöqtə qoyulur.

Məsələn, aşağıdakı sətirlər yeddi seqmentli LED-lərə iki onluq yerdən ibarət float dəyişənini çıxaracaq.

float x = 2.12345;

disp.digit |= 0x80; //

Ədədi 100-ə vururuq və üçüncü rəqəmə nöqtə qoyaraq nəticəni 100-ə bölürük.

Budur, göstəricilərdə 0,00-dan 99,99-a qədər üzən nöqtə nömrələrini göstərən bir proqram.

// üzən nöqtə çıxışı
#daxildir
#daxildir

// göstərici növü 1; boşalma çıxışları 5,4,3,2; seqment çıxışları 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

ləğv quraşdırma() (
MsTimer2::set(2, timerInterrupt); // taymer kəsilməsi 2 ms
MsTimer2::start(); // müdaxiləni aktivləşdirin
}

boş döngə () (
float x = 0;

üçün (int i = 0; i< 10000; i++) {
x += 0,01;

disp.print((int)(x * 100.), 4, 1);
disp.digit |= 0x80; // üçüncü səviyyəli nöqtəni yandırın

gecikmə(50);
}
}

//kəsmə idarəedicisi 2 ms
void timerInterrupt() (
disp.regen(); // göstərici bərpası
}

Gördüyünüz kimi, Led4Digits.h kitabxanası Arduino lövhəsinə qoşulmuş yeddi seqmentli işıq yayan diod (LED) göstəriciləri ilə işi xeyli asanlaşdırır. Mən belə bir kitabxananın analoqunu tapmadım.

Növbəli registr vasitəsilə LED displeylərlə işləmək üçün kitabxanalar mövcuddur. Biri mənə yazdı ki, onlar birbaşa Arduino lövhəsinə qoşulmuş LED displeylə işləyən kitabxana tapıblar. Ancaq istifadə edərkən göstərici rəqəmləri qeyri-bərabər parlayır və göz qırpır.

Analoqlarından fərqli olaraq Led4Digits.h kitabxanası:

  • Paralel proses kimi işləyir. Əsas dövrədə proqram məlumatları avtomatik olaraq ekranda göstərilən müəyyən dəyişənlərə yükləyir. İnformasiya çıxışı və göstəricinin bərpası əsas proqrama görünməyən taymer fasiləsində baş verir.
  • Ekran nömrələri yanıb-sönmədən bərabər şəkildə parlayır. Bu xüsusiyyət regenerasiyanın taymer kəsilməsi ilə ciddi şəkildə müəyyən edilmiş bir dövrədə baş verməsi ilə təmin edilir.
  • Kitabxana kompakt koda malikdir, tez icra olunur və nəzarətçini minimum yükləyir.

Növbəti dərsdə Arduino lövhəsinə LED göstərici və düymə matrisini eyni vaxtda birləşdirəcəyik. Belə bir dizayn üçün kitabxana yazaq.

Kateqoriya: . Siz onu işarələyə bilərsiniz.