- 7-segmentni i 4-znamenkasti 7-segmentni modul zaslona:
- Povezivanje četveroznamenkastog sedmosegmentnog modula s PIC mikrokontrolerom:
- Programiranje pomoću PIC16F877A:
- Postavljanje i testiranje hardvera:
Ovo je naš osmi vodič za učenje PIC mikrokontrolera pomoću MPLAB-a i XC8. Prešli smo čitav put od instaliranja MPLABX-a do upotrebe LCD-a s PIC MCU-om. Ako ste novi ovdje, pogledajte prethodne vodiče u kojima možete naučiti odbrojavanje vremena, trepćuću LED diodu, povezivanje LCD-a itd. Ovdje možete pronaći sve naše PIC vodiče. U našem zadnjem uputstvu vidjeli smo kako možemo generirati prilagođene znakove s našim LCD zaslonom 16 * 2, sada ćemo se opremiti drugom vrstom modula zaslona koji se naziva 7-segmentni zaslon i povezati ga s PIC mikrokontrolerom.
Iako je LCD 16x2 puno ugodniji od 7-segmentnog zaslona, ali malo je scenarija kada bi 7-segmentni zaslon dobro došao od LCD zaslona. LCD pati od nedostatka male veličine znakova i bit će pretjeran za vaš projekt ako samo planirate prikazati neke numeričke vrijednosti. 7-segmenti također imaju prednost u odnosu na loše stanje osvjetljenja i mogu se gledati iz većih kutova od uobičajenog LCD zaslona. Pa, počnimo to znati.
7-segmentni i 4-znamenkasti 7-segmentni modul zaslona:
Prikaz 7 segmenata ima sedam segmenata, a svaki segment ima jednu LED diodu za prikaz brojeva osvjetljavanjem odgovarajućih segmenata. Kao ako želite da 7-segment prikazuje broj "5", tada trebate žariti segmente a, f, g, c i d tako da odgovarajuće pinove postavite visoko. Postoje dvije vrste 7-segmentnih zaslona: Common Cathode i Common Anode, ovdje koristimo sedemsegmentni prikaz Common Cathode. Ovdje saznajte više o 7-segmentnom prikazu.

Sada znamo prikazati željeni numerički znak na jednom 7-segmentnom zaslonu. No, prilično je očito da bi nam bilo potrebno više od jednog 7-segmentnog zaslona da bismo prenijeli bilo koju informaciju koja ima više od jedne znamenke. Dakle, u ovom uputstvu koristit ćemo četveroznamenkasti 7-segmentni modul prikaza kao što je prikazano u nastavku.

Kao što vidimo, postoje četiri prikaza segmenta prikazana zajedno. Znamo da će svaki 7-segmentarni modul imati 10 pinova, a za 4 sedmosegmentna zaslona bilo bi ukupno 40 pinova i bilo bi užurbano da ih bilo tko lemi na točkaste ploče, pa toplo preporučujem svima da kupe modul ili izradite vlastiti PCB za upotrebu četveroznamenkastog 7-segmentnog zaslona. Shema veze za isti prikazana je u nastavku:

Da bismo razumjeli kako funkcionira četveroznamenkasti sedmosegmentni modul, moramo pogledati gornje sheme, kao što je prikazano, A pinovi sva četiri zaslona povezani su kako bi se okupili kao jedan A i isti za B, C…. do DP. Dakle, u osnovi ako aktivira A, onda bi sva četiri A trebala ići visoko, zar ne?
Ali, to se ne događa. Imamo dodatna četiri pina od D0 do D3 (D0, D1, D2 i D3) koji se mogu koristiti za kontrolu koji prikaz od četiri mora biti visok. Na primjer: Ako trebam da moj izlaz bude prisutan samo na drugom zaslonu, tada bi samo D1 trebao biti visok, a ostale pinove (D0, D2 i D3) držati niskim. Jednostavno možemo odabrati koji će zaslon biti aktivan pomoću igla od D0 do D3 i koji će se znak prikazivati pomoću igara od A do DP.
Povezivanje četveroznamenkastog sedmosegmentnog modula s PIC mikrokontrolerom:
Ovdje smo koristili PIC mikrokontroler PIC16F877A, a shema sklopa prikazana je u nastavku.

Iz modula imamo 12 izlaznih pinova, od kojih se 8 koristi za prikaz znakova, a četiri za odabir jednog zaslona od četiri. Stoga je svih 8 znakovnih pinova dodijeljeno PORTD-u, a pinovi za odabir zaslona dodijeljeni su prvim četiri pinova PORTC-a.
Napomena: Priključak za uzemljenje modula također bi trebao biti povezan sa masom MCU-a što ovdje nije prikazano.
Programiranje pomoću PIC16F877A:
Sada, kad znamo kako ovaj modul zapravo radi, naučimo kako programirati PIC16F877A kako bi prikazao četveroznamenkasti broj. Povećamo varijablu od 0 do 1000 i ispisujemo je na 7-segmentnom zaslonu. Pokrenite program MPLABX i izradite novi projekt, započnimo s konfiguracijskim bitovima.
#pragma config FOSC = HS // Bitovi za odabir oscilatora (HS oscilator) #pragma config WDTE = OFF // Bit za aktiviranje nadzornika (WDT onemogućen) #pragma config PWRTE = ON // Bit za omogućavanje timera za uključivanje (PWRT omogućen) # pragma config BOREN = ON // Bit za resetiranje smeđeg reseta (omogućen BOR) #pragma config LVP = OFF // Bit za omogućavanje serijskog programiranja u krugu niskog napona (s jednim napajanjem) (RB3 je digitalni I / O, uključen HV MCLR se mora koristiti za programiranje) #pragma config CPD = OFF // Bit zaštite podataka EEPROM memorijskog koda (zaštita podataka EEPROM koda isključena) #pragma config WRT = OFF // Flash programiranje bita Omogući bitove (zaštita od upisa isključena; sva programska memorija može se upisati na EECON kontrolu) #pragma config CP = OFF // Flash Program Memory Code Bit bit (Zaštita koda isključena)
Kao i obično, za postavljanje tih bitova koristimo prozor postavljenih konfiguracijskih bitova. Ako niste sigurni što znače, posjetite tutorial za LED koji trepće ovdje.
Dalje definirajmo izlazne igle za prebacivanje između svake znamenke zaslona.
// *** Definirajte signalne pinove sva četiri zaslona *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Kraj definicije ** ////
Ovdje se iglice RC0, RC1, RC2 i RC3 koriste za odabir između četiri znamenke našeg 7-segmentnog modula zaslona. Te se iglice definiraju kao s1, s2, s3 i s4.
Zatim uskočimo u void main (), unutar kojeg imamo sljedeću deklaraciju varijable:
int i = 0; // četveroznamenkasta vrijednost koja će se prikazati int flag = 0; // za stvaranje kašnjenja unsigned int a, b, c, d, e, f, g, h; // samo varijable unsigned int seg = {0X3F, // Hex vrijednost za prikaz broja 0 0X06, // Hex vrijednost za prikaz broja 1 0X5B, // Hex vrijednost za prikaz broja 2 0X4F, // Hex vrijednost za prikaz broj 3 0X66, // Hex vrijednost za prikaz broja 4 0X6D, // Hex vrijednost za prikaz broja 5 0X7C, // Hex vrijednost za prikaz broja 6 0X07, // Hex vrijednost za prikaz broja 7 0X7F, / / Hex vrijednost za prikaz broja 8 0X6F // Hex vrijednost za prikaz broja 9}; // Kraj niza za prikaz brojeva od 0 do 9
Ovdje se varijable i i flag koriste za spremanje vrijednosti koje će se prikazati i stvaranje kašnjenja. U nepotpisani cjelobrojne varijable A do H koriste razbiti četveroznamenkasti broj u jednoznamenkaste i pohraniti ih (što će biti objašnjeno kasnije ovdje).
Ovdje treba napomenuti jednu ključnu stvar, deklaraciju niza "seg" . U ovom programu koristimo novi tip podataka nazvan Array. Niz nije ništa drugo nego zbirka sličnih vrijednosti tipa podataka. Ovdje smo koristili ovaj niz za pohranu svih ekvivalentnih hex vrijednosti za prikaz broja od 0 do 9.
Adresa niza uvijek počinje od nule. Dakle, ovaj će niz imati hex vrijednost numeričkog broja (0-9) pohranjenog na adresi koja je ista kao i brojka kao što je prikazano u nastavku
|
Varijabla: |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
|
Heksadecimalni kod: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
|
Jednadžba Numerički broj: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Tako jednostavno, ako želite prikazati broj 0 na svom 7-segmentu, možete nazvati seg, isto tako ako želite prikazati broj 6, jednostavno morate koristiti seg.
Da bismo razumjeli kako je zapravo dobivena HEX vrijednost, pogledajmo u donju tablicu. Ekvivalent HEX vrijednost za svaki decimalni broj pohranjen u polju, tako da ga možemo nazvati i prikazati jedan određeni broj.

Sada prijeđimo na sljedeći dio koda koji je I / O konfiguracija:
// ***** I / O konfiguracija **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; LUKA = 0X00; // *** Kraj I / O konfiguracije ** ///
I / O konfiguracija je jednostavna jer su svi pinovi na našem 7-segmentu izlazni pinovi, a veze su prikazane na gornjoj shemi, pa ih jednostavno prijavite kao izlaze i inicijalizirajte ih na nulu.
Sad skočimo u našu beskonačnu petlju (while (1)). Ovdje moramo podijeliti vrijednost "i" na četiri znamenke i prikazati ih na 7-segmentu. Prvo započnimo dijeljenjem vrijednosti na "i"
// *** Podjela "i" na četiri znamenke *** // a = i% 10; // ovdje je spremljena 4. znamenka b = i / 10; c = b% 10; // ovdje se sprema 3. znamenka d = b / 10; e = d% 10; // ovdje se sprema 2. znamenka f = d / 10; g = f% 10; // ovdje je spremljena 1. znamenka h = f / 10; // *** Kraj cijepanja *** //
Korištenjem jednostavnog modula i operacije dijeljenja četveroznamenkasti broj (i) razdvaja se u pojedinačne brojeve. U našem slučaju uzmimo primjer gdje je vrijednost "i" 4578. Zatim na kraju ovog postupka varijabla g = 4, e = 5, c = 7 i a = 8. Tako će sada biti lako prikazati svaku znamenku jednostavnim korištenjem te varijable.
PORTD = segment; s1 = 1; // UKLJUČITE zaslon 1 i ispišite 4. znamenku __delay_ms (5); s1 = 0; // ISKLJUČITE zaslon 1 nakon kašnjenja od 5 ms PORTD = seg; s2 = 1; // UKLJUČITE zaslon 2 i ispišite 3. znamenku __delay_ms (5); s2 = 0; // ISKLJUČITE zaslon 2 nakon kašnjenja od 5 ms PORTD = seg; s3 = 1; // UKLJUČITE zaslon 3 i ispišite 2. znamenku __delay_ms (5); s3 = 0; // ISKLJUČITE zaslon 3 nakon kašnjenja od 5 ms PORTD = seg; s4 = 1; // UKLJUČITE zaslon 4 i ispišite 1. znamenku __delay_ms (5); s4 = 0; // ISKLJUČITE zaslon 4 nakon odgode od 5 ms
Ovo je stvarno mjesto gdje MCU razgovara sa 7-segmentom. Kao što znamo, istovremeno možemo prikazati samo jednu znamenku, ali imamo četiri znamenke koje treba prikazati i to samo ako su sve četiri znamenke U cijelom korisniku će biti vidljiv četveroznamenkasti broj.
Pa, kako ćemo s ovim?
Srećom po nas što je naš MCU mnogo brži od ljudskog oka, pa ono što zapravo radimo: prikazujemo po jednu znamenku, ali to radimo vrlo brzo kao što je gore prikazano.
Odabiremo jednoznamenkasti prikaz koji čeka 5 ms kako bi ga MCU i 7-segment mogli obraditi, a zatim isključiti tu znamenku i prijeći na sljedeću znamenku i raditi isto dok ne dosegnemo zadnju znamenku. Ovo kašnjenje od 5 ms ne može primijetiti ljudsko oko, a čini se da su sve četiri znamenke istovremeno uključene.
To je to, napokon samo povećavamo vrijednost prikazane znamenke pomoću odgode kao što je prikazano u nastavku
if (flag> = 100) // pričekajte da zastavica dosegne 100 {i ++; flag = 0; // samo ako je zastavica stotinu "i" bit će povećana} flag ++; // zastavica prirasta za svaku bljeskalicu
Odgoda se koristi tako da je vrijeme potrebno za promjenu s jednog broja na drugi dovoljno dugo da primijetimo promjenu.
Kompletan kod je naveden u nastavku, a proces je također objašnjeno u video na kraju.
Postavljanje i testiranje hardvera:
Kao i uvijek, simulirajmo program pomoću Proteusa prije nego što stvarno krenemo s našim hardverom. Ako je simulacija uspješna, trebali biste vidjeti nešto poput ovoga

Ovaj projekt nema komplicirano postavljanje hardvera, opet koristimo istu PIC mikrokontrolersku ploču koju smo stvorili u vodiču za treptanje LED-a. Jednostavno spojite 7-segmentni modul s vašom pločicom PIC mikrokontrolera prema dijagramu povezivanja. Kad završite s vezama, jednostavno izbacite kôd pomoću programa PicKit 3 i to je da uživa u vašem izlazu.



