- 7-segmenttinen ja 4-numeroinen 7-segmenttinen näyttöyksikkö:
- 4-numeroisen seitsemän segmentin moduulin liittäminen PIC-mikrokontrolleriin:
- Ohjelmointi käyttäen PIC16F877A:
- Laitteiston asennus ja testaus:
Tämä on 8. opetusohjelma PIC-mikrokontrollerien oppimisesta MPLAB: n ja XC8: n avulla. Olemme keksineet MPLABX: n asentamisesta LCD-näytön käyttämiseen PIC MCU: lla. Jos olet uusi täällä, katso sitten edelliset oppaat, joissa voit oppia ajastimia, vilkkuvaa LEDiä, liitäntäkenttää jne. Löydät kaikki PIC-oppaamme täältä. Viimeisessä opetusohjelmassa näimme, kuinka voimme luoda mukautettuja merkkejä 16 * 2 LCD-näytöllä, varustakaa nyt itsemme toisen tyyppisellä näyttömoduulilla, jota kutsutaan 7-segmenttiseksi näytöksi, ja liitämme sen PIC-mikrokontrolleriin.
Vaikka 16x2 LCD on paljon mukavampi kuin 7-segmenttinen näyttö, mutta on olemassa harvat skenaariot, joissa 7-segmenttinen näyttö olisi kätevämpi kuin LCD-näyttö. LCD kärsii haittapuolesta siitä, että sillä on pieni merkkikoko, ja se ylittää projektisi, jos aiot vain näyttää joitain numeerisia arvoja. 7-segmenteillä on myös etu huonoa valaistusta vastaan, ja niitä voidaan tarkastella viistokulmista kuin normaalia LCD-näyttöä. Aloitetaan siis tietää se.
7-segmenttinen ja 4-numeroinen 7-segmenttinen näyttöyksikkö:
7 Segmenttinäytössä on seitsemän segmenttiä, ja jokaisessa segmentissä on yksi LED, joka näyttää numerot valaisemalla vastaavat segmentit. Kuten jos haluat 7-segmentin näyttävän luvun "5", sinun on hehkutettava segmentti a, f, g, c ja d tekemällä niiden vastaavat nastat korkeaksi. 7-segmenttinäyttöjä on kahta tyyppiä: Common Cathode ja Common Anode, tässä käytämme Common Cathode seitsemän segmentin näyttöä. Lisätietoja 7 segmentin näytöstä täältä.
Nyt osaamme näyttää haluamasi numeerisen merkin yhdellä 7-segmenttisellä näytöllä. Mutta on melko ilmeistä, että tarvitsemme useamman kuin yhden 7-segmenttisen näytön välittämään kaikki tiedot, jotka ovat enemmän kuin yksi numero. Joten tässä opetusohjelmassa käytämme nelinumeroista 7-segmenttistä näyttöyksikköä alla olevan kuvan mukaisesti.
Kuten voimme nähdä, on neljä seitsemää segmenttinäyttöä kytketty toisiinsa. Tiedämme, että jokaisella 7-segmenttisellä moduulilla on 10 nastaa ja 4 seitsemälle segmenttinäytölle olisi 40 nastaa yhteensä, ja jokaisen olisi kiireistä juottaa ne pistetaululle, joten suosittelen ketään ostamaan moduulin tai tee oma piirilevy nelinumeroisen 7-segmenttisen näytön käyttöä varten. Saman kytkentäkaavio on esitetty alla:
Ymmärtääksemme kuinka nelinumeroinen seitsemäsegmenttinen moduuli toimii, meidän on tutkittava yllä olevia kaavioita, kuten on esitetty, kaikkien neljän näytön A-nastat on kytketty keräämään yhtenä A: na ja sama B: lle, C: lle… DP: hen asti. Joten pohjimmiltaan, jos laukaisin A on päällä, kaikkien neljän A: n pitäisi mennä korkealle oikealle?
Mutta sitä ei tapahdu. Meillä on vielä neljä nastaa D0: sta D3: een (D0, D1, D2 ja D3), joita voidaan käyttää säätämään, minkä näytön neljästä pitäisi mennä korkealle. Esimerkiksi: Jos tarvitsen lähtöni olevan läsnä vain toisella näytöllä, vain D1 tulisi tehdä korkeaksi pitäen muut nastat (D0, D2 ja D3) matalina. Yksinkertaisesti voimme valita, minkä näytön on oltava aktiivinen käyttämällä nastoja D0 - D3 ja mikä merkki näytetään nastojen A - DP avulla.
4-numeroisen seitsemän segmentin moduulin liittäminen PIC-mikrokontrolleriin:
Tässä olemme käyttäneet PIC-mikrokontrolleria PIC16F877A ja piirin kaavio on esitetty alla.
Meillä on moduulista 12 ulostulonasta, joista 8 käytetään merkkien näyttämiseen ja neljää käytetään yhden näytön valitsemiseen neljästä. Siksi kaikki 8 merkin nastaa on osoitettu PORTD: lle ja näytön valintanapit on osoitettu PORTC: n neljälle ensimmäiselle nastalle.
Huomaa: Moduulin maadoitustappi tulee myös liittää MCU: n maahan, jota ei ole esitetty tässä.
Ohjelmointi käyttäen PIC16F877A:
Nyt kun tiedämme kuinka tämä moduuli todella toimii, opi kuinka PIC16F877A ohjelmoidaan niin, että se näyttää nelinumeroisen luvun. Lisätään muuttuja 0: sta 1000: een ja tulostetaan se 7-segmenttiseen näyttöön. Käynnistä MPLABX-ohjelma ja luo uusi projekti, aloitetaan konfigurointibiteillä.
#pragma config FOSC = HS // Oskillaattorin valintabitit (HS-oskillaattori) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT pois käytöstä) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT käytössä) # pragma-konfiguraatio BOREN = PÄÄLLE // Ruskea-nollaus Nollaa bitti (BOR käytössä) #pragma-konfiguraatio LVP = POIS // Pienjännitekerroin (yksisyöttö) Piirin sisäinen sarjaohjelmointi Aktivointibitti (RB3 on digitaalinen I / O, HV päällä MCLR: ää on käytettävä ohjelmointiin) #pragma config CPD = OFF // Data EEPROM -muistikoodisuojabitti (Data EEPROM-koodisuojaus pois päältä) #pragma config WRT = OFF // Flash-ohjelmamuistin kirjoitus Salli bitit (kirjoitussuoja pois; kaikki ohjelmamuistit voidaan kirjoittaa EECON-ohjauksella) #pragma config CP = OFF // Flash-ohjelman muistin koodisuojabitti (koodisuojaus pois päältä)
Kuten tavallista, asetamme nämä bitit asetettujen kokoonpanobittien ikkunasta. Jos et ole varma mitä ne tarkoittavat, käy LED-merkkivalon vilkkumisoppaassa täällä.
Määritetään seuraavaksi lähtönastat näytön jokaisen numeron välillä vaihtamiseksi.
// *** Määritä kaikkien neljän näytön signaalinastat *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Definition end ** ////
Tappeja RC0, RC1, RC2 ja RC3 käytetään valitsemaan 7-segmenttisen näyttömoduulin neljä numeroa. Nämä nastat määritellään vastaavasti s1, s2, s3 ja s4.
Seuraavaksi siirrytään void main (): een, jonka sisällä meillä on seuraava muuttujailmoitus:
int i = 0; // 4-numeroinen arvo, joka näytetään int flag = 0; // viiveen luomiseksi allekirjoittamaton int a, b, c, d, e, f, g, h; // vain muuttujat allekirjoittamaton int seg = {0X3F, // Hex-arvo näyttää luvun 0 0X06, // Hex-arvo näyttää luvun 1 0X5B, // Hex-arvo näyttää luvun 2 0X4F, // Hex-arvo näyttää numero 3 0X66, // Hex-arvo näyttää luvun 4 0X6D, // Hex-arvo näyttää luvun 5 0X7C, // Hex-arvo näyttää luvun 6 0X07, // Hex-arvo näyttää luvun 6 0X7F, / / Hex value to display the number 8 0X6F // Hex value to display the number 9}; // Taulukon loppu näytettäessä numeroita 0-9
Tässä muuttujia i ja lippua käytetään näytettävien arvojen tallentamiseen ja vastaavasti viiveen luomiseen. Unsigned kokonaisluku muuttujat a-h käytetään rikkoa nelinumeroinen numeroita yhden numeron ja tallentaa ne (joka selitetään myöhemmin tässä).
Yksi keskeinen asia, joka tässä on huomioitava, on "seg" -taulukkoilmoitus. Tässä ohjelmassa käytämme uutta tietotyyppiä nimeltä Array. Matriisi on vain kokoelma samanlaisia tietotyyppisiä arvoja. Tässä olemme käyttäneet tätä taulukkoa tallentamaan kaikki vastaavat heksadesimaaliarvot luvun 0 - 9 näyttämiseen.
Taulukon osoite alkaa aina nollasta. Joten tällä taulukolla on numeron (0-9) heksadesimaaliarvo, joka on tallennettu osoitteeseen, joka on sama kuin alla olevan kuvan numero
Muuttuja: |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
Hex-koodi: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
Eq. Numeerinen numero: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Joten yksinkertaisesti, jos haluat näyttää numeron 0 7-segmentissä, voit soittaa segmentille , samoin jos haluat näyttää numeron 6, sinun on vain käytettävä segmenttiä.
Tarkastelemme alla olevaa taulukkoa ymmärtääksemme, kuinka HEX-arvo todella saatiin. Vastaava HEX-arvon kullekin desimaalin numero on tallennettu joukko niin, että se voidaan kutsua näyttää yhden tietyn numeron.
Siirrytään nyt koodin seuraavaan osaan, joka on I / O-kokoonpano:
// ***** I / O-määritykset **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** I / O-kokoonpanon loppu ** ///
I / O-kokoonpano on yksinkertainen, koska kaikki seitsemän segmentin nastat ovat lähtönippuja, ja liitännät näkyvät yllä olevassa piirikaaviossa, joten yksinkertaisesti ilmoita ne lähtöinä ja alusta ne nollaan.
Hyppäämme nyt loputtomaan silmukkaamme (kun (1)). Tässä meidän on jaettava "i": n arvo neljään numeroon ja näytettävä ne 7-segmentissä. Aloitetaan ensin jakamalla arvo i: lle
// *** "i" jakaminen neljään numeroon *** // a = i% 10; // 4. numero tallennetaan tähän b = i / 10; c = b% 10; // kolmas numero tallennetaan tähän d = b / 10; e = d% 10; // 2. numero tallennetaan tähän f = d / 10; g = f% 10; // 1. numero tallennetaan tähän h = f / 10; // *** halkaisun loppu *** //
Käyttämällä yksinkertaista moduulia ja jako-operaatiota, nelinumeroinen luku (i) erotetaan yksittäisiksi numeroiksi. Otetaan tapauksessamme esimerkki, jossa "i": n arvo on 4578. Tämän prosessin lopussa muuttuja g = 4, e = 5, c = 7 ja a = 8. Joten nyt on helppo näyttää jokainen numero yksinkertaisesti käyttämällä tätä muuttujaa.
PORTD = seg; s1 = 1; // Kytke näyttö 1 päälle ja tulosta 4. numero __viive_ms (5); s1 = 0; // Sammuta näyttö 1 5 ms viiveen jälkeen PORTD = seg; s2 = 1; // Kytke näyttö 2 päälle ja tulosta kolmas numero __viive_ms (5); s2 = 0; // Sammuta näyttö 2 5 ms viiveen jälkeen PORTD = seg; s3 = 1; // Kytke näyttö 3 päälle ja tulosta 2. numero __viive_ms (5); s3 = 0; // Sammuta näyttö 3 5 ms viiveen jälkeen PORTD = seg; s4 = 1; // Kytke näyttö 4 päälle ja tulosta ensimmäinen numero __viive_ms (5); s4 = 0; // Sammuta näyttö 4 5 ms viiveen jälkeen
Tämä on todellinen paikka, jossa MCU puhuu 7-segmentin kanssa. Kuten tiedämme, voimme näyttää vain yhden numeron kerrallaan, mutta meillä on neljä numeroa näytettävissä ja vain, jos kaikki neljä numeroa ovat päällä, nelinumeroinen koko numero näkyy käyttäjälle.
Joten, miten menemme tämän kanssa?
Onneksi meille MCU on paljon nopeampi kuin ihmissilmä, joten mitä teemme: näytämme yhden numeron kerrallaan, mutta teemme sen hyvin nopeasti, kuten yllä on esitetty.
Valitsemme yhden numeron näytön, jonka odotetaan viiden sekunnin ajan, jotta MCU ja 7-segmentti voivat käsitellä sitä, sammuttaa sitten kyseisen numeron ja siirtyä seuraavaan numeroon ja tehdä saman, kunnes saavutamme viimeisen numeron. Tätä 5 ms: n viivettä ei voida havaita ihmissilmällä, ja kaikki neljä numeroa näyttivät olevan päällä samanaikaisesti.
Siinä se, lopulta lisäämme vain näytetyn numeron arvoa viiveellä, kuten alla on esitetty
if (lippu> = 100) // odota, kunnes lippu saavuttaa arvon 100 {i ++; lippu = 0; // vain jos lippu on sata "i" kasvaa} lippu ++; // jokaisen salaman lisäyslippu
Viivettä käytetään niin, että numeroiden vaihtamiseen kuluva aika on riittävän pitkä, jotta voimme huomata muutoksen.
Koko koodi annetaan alla ja prosessi on myös selitetty Video lopussa.
Laitteiston asennus ja testaus:
Kuten aina, simuloidaan ohjelmaa Proteuksen avulla, ennen kuin siirrymme laitteistomme kanssa. Jos simulointi onnistuu, sinun pitäisi nähdä jotain tällaista
Tällä projektilla ei ole monimutkaista laitteistoasetusta, käytämme jälleen samaa PIC-mikrokontrollerikorttia, jonka olemme luoneet LED-merkkivalojen vilkkumisoppaassa. Liitä vain 7-segmenttinen moduuli PIC-mikrokontrollerikorttiin kytkentäkaavion mukaisesti. Kun olet tehnyt liitännät, tyhjennä koodi käyttämällä PicKit 3 -ohjelmoijaasi, ja se on sinun nauttia tuloksestasi.