- 7-segmentový a 4-miestny 7-segmentový zobrazovací modul:
- Pripojenie štvormiestneho sedem segmentového modulu k mikrokontroléru PIC:
- Programovanie pomocou PIC16F877A:
- Nastavenie a testovanie hardvéru:
Toto je náš 8. tutoriál Výučba mikrokontrolérov PIC pomocou MPLAB a XC8. Prešli sme celou cestou od inštalácie MPLABX k používaniu LCD s PIC MCU. Ak ste tu nový, pozrite si predchádzajúce návody, kde sa môžete naučiť časovače, blikajúce LED, prepojovacie LCD atď. Všetky naše výukové programy PIC nájdete tu. V našom poslednom tutoriáli sme videli, ako môžeme generovať vlastné znaky pomocou nášho 16 * 2 LCD displeja, poďme si teraz vybaviť svoje vlastné ja iným typom zobrazovacieho modulu s názvom 7-segmentový displej a prepojiť ho s PIC mikrokontrolérom.
16x2 LCD je síce oveľa pohodlnejší ako 7-segmentový displej, ale existuje len málo scenárov, kedy by 7-segmentový displej prišiel vhodnejšie ako LCD displej. Displej LCD trpí nedostatkom malej veľkosti znakov, a preto bude pre váš projekt nadmerný, ak plánujete zobraziť iba číselné hodnoty. Sedemsegmentové majú tiež výhodu oproti zlým svetelným podmienkam a dajú sa sledovať z nižších uhlov pohľadu ako na bežnú obrazovku LCD. Začnime to teda vedieť.
7-segmentový a 4-miestny 7-segmentový zobrazovací modul:
7 Segmentový displej má v sebe sedem segmentov a každý segment má v sebe jednu LED, ktorá zobrazuje čísla rozsvietením príslušných segmentov. Ak chcete, aby sa v 7-segmentovom segmente zobrazilo číslo „5“, musíte segmenty a, f, g, c a d rozžiariť tak, že zodpovedajúce kolíky nastavíte vysoko. Existujú dva typy 7-segmentových displejov: Common Cathode a Common Anode, tu používame sedemsegmentový displej Common Cathode. Viac informácií o 7 segmentovom displeji nájdete tu.
Teraz vieme, ako zobraziť požadovaný číselný znak na jednom 7-segmentovom displeji. Je ale celkom zrejmé, že na prenos akýchkoľvek informácií, ktoré majú viac ako jednu číslicu, by sme potrebovali viac ako jeden 7-segmentový displej. V tomto výučbe teda budeme používať 4-miestny 7-segmentový zobrazovací modul, ako je uvedené nižšie.
Ako vidíme, sú tu spojené štyri sedemsegmentové displeje. Vieme, že každý 7-segmentový modul bude mať 10 pinov a pre 4 sedemsegmentové displeje by ich bolo celkovo 40 a bolo by hektické, aby ich ktokoľvek spájkoval na bodovej doske, takže každému vrelo odporúčam kúpiť si modul alebo si vyrobte vlastnú DPS na použitie 4-miestneho 7-segmentového displeja. Schéma rovnakého pripojenia je uvedená nižšie:
Aby sme pochopili, ako štvormiestny sedemsegmentový modul funguje, musíme sa pozrieť na vyššie uvedené schémy, ako je znázornené, že kolíky A všetkých štyroch displejov sú spojené, aby sa zhromaždili ako jeden A a rovnaký pre B, C…. až DP. Takže v podstate, ak je spúšťač A zapnutý, potom by všetky štyri A mali ísť vysoko, nie?
Ale to sa nedeje. Máme ďalšie štyri piny od D0 do D3 (D0, D1, D2 a D3), pomocou ktorých môžeme ovládať, ktorý zo štyroch by mal ísť vysoko. Napríklad: Ak potrebujem, aby bol môj výstup prítomný iba na druhom displeji, potom by mala byť vysoká iba D1, zatiaľ čo ostatné piny (D0, D2 a D3) by mali byť nízke. Jednoducho si môžeme zvoliť, ktorý displej musí byť aktívny pomocou pinov od D0 do D3 a aký znak sa má zobraziť pomocou pinov od A do DP.
Pripojenie štvormiestneho sedem segmentového modulu k mikrokontroléru PIC:
Tu sme použili mikrokontrolér PIC PIC16F877A a schéma obvodu je uvedená nižšie.
Máme 12 výstupných pinov z modulu, z ktorých 8 sa používa na zobrazenie znakov a štyri sa používajú na výber jedného displeja zo štyroch. Preto je všetkých 8 znakových kolíkov priradených k PORTD a kolíky na výber displeja sú priradené k prvým štyrom kolíkom PORTC.
Poznámka: Zemniaci kolík modulu by mal byť tiež pripojený k zemi MCU, ktorá tu nie je zobrazená.
Programovanie pomocou PIC16F877A:
Teraz, keď vieme, ako tento modul v skutočnosti funguje, sa naučíme, ako naprogramovať PIC16F877A tak, aby zobrazoval 4-miestne číslo. Zvyšme premennú od 0 do 1 000 a vytlačme ju na 7-segmentovom displeji. Spustite program MPLABX a vytvorte nový projekt, začnime s konfiguračnými bitmi.
#pragma config FOSC = HS // Bity výberu oscilátora (HS oscilátor) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT deaktivovaný) #pragma config PWRTE = ON // Power Timer Enable bit (PWRT enabled) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 je digitálny I / O, HV zapnutý Na programovanie je potrebné použiť MCLR) #pragma config CPD = OFF // bit ochrany kódu pamäte EEPROM dát (ochrana kódu EEPROM dát vypnutá) #pragma config WRT = OFF // zapisovanie do pamäte Flash programu Povolenie bitov (ochrana proti zápisu vypnutá; všetka pamäť programu možno zapísať do ovládacieho prvku EECON) #pragma config CP = OFF // Bit ochrany kódu pamäte programu Flash (ochrana kódu vypnutá)
Ako obvykle používame okno nastavených konfiguračných bitov na nastavenie týchto bitov. Ak si nie ste istí, čo to znamená, navštívte návod na blikanie LED tu.
Ďalej definujeme výstupné piny pre prepínanie medzi každou číslicou displeja.
// *** Definujte signálne piny všetkých štyroch displejov *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Koniec definície ** ////
Tu sa používajú piny RC0, RC1, RC2 a RC3 na výber medzi štyrmi číslicami nášho 7-segmentového zobrazovacieho modulu. Tieto kolíky sú definované ako s1, s2, s3 a s4.
Ďalej skočíme do void main (), vo vnútri ktorého máme nasledujúcu deklaráciu premennej:
int i = 0; // štvormiestna hodnota, ktorá sa má zobraziť int flag = 0; // na vytvorenie oneskorenia nepodpísané int a, b, c, d, e, f, g, h; // iba premenné unsigned int seg = {0X3F, // Hex hodnota pre zobrazenie čísla 0 0X06, // Hex hodnota pre zobrazenie čísla 1 0X5B, // Hex hodnota pre zobrazenie čísla 2 0X4F, // Hex hodnota pre zobrazenie číslo 3 0X66, // Hex hodnota pre zobrazenie čísla 4 0X6D, // Hex hodnota pre zobrazenie čísla 5 0X7C, // Hex hodnota pre zobrazenie čísla 6 0X07, // Hex hodnota pre zobrazenie čísla 7 0X7F, / / Hex hodnota pre zobrazenie čísla 8 0X6F // Hex hodnota pre zobrazenie čísla 9}; // Koniec poľa na zobrazenie čísel od 0 do 9
Tu sa premenné i a príznak používajú na ukladanie zobrazovaných hodnôt a vytváranie oneskorení. Tieto nepodpísané celočíselné premenné A až H sa používa rozbiť štyri číslice čísla do jednociferné a ich ukladanie (čo bude vysvetlené neskôr tu).
Jedna kľúčová vec, ktorú si tu treba uvedomiť, je deklarácia poľa „seg“ . V tomto programe používame nový dátový typ s názvom Array. Pole nie je nič iné ako zbierka podobných hodnôt dátového typu. Tu sme použili toto pole na uloženie všetkých ekvivalentných hexadecimálnych hodnôt pre zobrazenie čísla od 0 do 9.
Adresa poľa vždy začína od nuly. Takže toto pole bude mať hexadecimálnu hodnotu číselného čísla (0-9) uloženú v adrese, ktorá je rovnaká ako u čísla uvedeného nižšie
Premenná: |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
Hex kód: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
Rov. Numerické číslo: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Takže jednoducho, ak chcete na svojom 7segmente zobraziť číslo 0, môžete zavolať seg, rovnako ak chcete zobraziť číslo 6, musíte použiť seg.
Aby sme pochopili, ako bola skutočne získaná hodnota HEX, pozrime sa do nasledujúcej tabuľky. Hex hodnota pre každé desatinné číslo je uložené v poli tak, že to môže byť nazývané zobraziť jeden konkrétne číslo.
Prejdime teraz k ďalšej časti kódu, ktorou je konfigurácia I / O:
// ***** I / O konfigurácia **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** Koniec konfigurácie I / O ** ///
Konfigurácia I / O je jednoduchá, pretože všetky piny na našom 7 segmente sú výstupné piny a pripojenia sú zobrazené v schéme vyššie, takže ich jednoducho deklarujte ako výstupy a inicializujte ich na nulu.
Teraz skočme do našej nekonečnej slučky (while (1)). Tu musíme rozdeliť hodnotu „i“ na štyri číslice a zobraziť ich na 7 segmente. Najprv začnime rozdelením hodnoty na „i“
// *** Rozdelenie „i“ na štyri číslice *** // a = i% 10; // Sem sa uloží štvrtá číslica b = i / 10; c = b% 10; // Sem sa uloží tretia číslica d = b / 10; e = d% 10; // tu sa ukladá 2. číslica f = d / 10; g = f% 10; // Sem sa ukladá 1. číslica h = f / 10; // *** Koniec štiepenia *** //
Použitím jednoduchej operácie modulu a rozdelenia sa štvormiestne číslo (i) rozdelí na jednotlivé čísla. V našom prípade si vezmime príklad, kde hodnota „i“ je 4578. Potom na konci tohto procesu bude premenná g = 4, e = 5, c = 7 a a = 8. Teraz bude ľahké zobraziť každú číslicu jednoduchým použitím tejto premennej.
PORTD = seg; s1 = 1; // ZAPNITE displej 1 a vytlačte 4. číslicu __delay_ms (5); s1 = 0; // Vypnutie displeja 1 po 5ms oneskorení PORTD = seg; s2 = 1; // Zapnite displej 2 a vytlačte 3. číslicu __delay_ms (5); s2 = 0; // Vypnutie displeja 2 po 5ms oneskorení PORTD = seg; s3 = 1; // Zapnite displej 3 a vytlačte 2. číslicu __delay_ms (5); s3 = 0; // Vypnutie displeja 3 po 5ms oneskorení PORTD = seg; s4 = 1; // Zapnite displej 4 a vytlačte 1. číslicu __delay_ms (5); s4 = 0; // Vypnite displej 4 po 5ms oneskorení
Toto je skutočné miesto, kde MCU komunikuje so 7-segmentom. Ako vieme, môžeme zobraziť vždy iba jednu číslicu, ale máme zobrazené štyri číslice, a to iba vtedy, ak sú všetky štyri číslice zapnuté. Pre používateľa bude viditeľné celé štvormiestne číslo.
Ako na to?
Našťastie je náš MCU oveľa rýchlejší ako ľudské oko, takže to, čo skutočne robíme: zobrazujeme jednu číslicu po druhej, ale robíme to veľmi rýchlo, ako je uvedené vyššie.
Vyberieme jednociferný displej, ktorý počkáme 5 ms, aby ho mohli spracovať MCU a 7-segmentové segmenty, a potom túto číslicu vypneme, presunieme sa na ďalšiu číslicu a urobíme to isté, kým nedosiahneme poslednú číslicu. Toto oneskorenie 5 ms nemôže byť pozorované ľudským okom a všetky štyri číslice sa javili ako zapnuté súčasne.
To je ono, nakoniec iba zvýšime hodnotu zobrazenej číslice pomocou oneskorenia, ako je uvedené nižšie
if (flag> = 100) // čakať, kým príznak nedosiahne 100 {i ++; flag = 0; // iba v prípade, že je príznak sto, bude „inkrementované“} príznak ++; // príznak prírastku pre každý blesk
Oneskorenie sa používa na to, aby čas potrebný na zmenu z jedného čísla na druhé bol dostatočne dlhý na to, aby sme si zmenu všimli.
Kompletný kód je uvedený nižšie a tento proces je tiež vysvetlené v Video na konci.
Nastavenie a testovanie hardvéru:
Predtým, ako skutočne začneme s hardvérom, simulujme program pomocou programu Proteus. Ak je simulácia úspešná, mali by ste vidieť niečo také
Tento projekt nemá zložité hardvérové nastavenie, opäť používame tú istú dosku PIC Microcontroller, ktorú sme vytvorili v návode na blikanie LED. Jednoducho pripojte 7-segmentový modul k doske vášho mikrokontroléra PIC podľa schémy zapojenia. Keď skončíte s pripojením, jednoducho vypíšte kód pomocou svojho programátora PicKit 3, a to je radosť z vášho výstupu.