- 7segmentový a 4místný 7segmentový zobrazovací modul:
- Připojení čtyřmístného sedmisegmentového modulu k mikrokontroléru PIC:
- Programování pomocí PIC16F877A:
- Nastavení a testování hardwaru:
Toto je náš 8. tutoriál učení mikrokontrolérů PIC pomocí MPLAB a XC8. Přišli jsme celou cestu od instalace MPLABX k používání LCD s PIC MCU. Pokud jste zde noví, podívejte se na předchozí výukové programy, kde se můžete naučit časovače, blikající LED, rozhraní LCD atd. Zde najdete všechny naše výukové programy PIC. V našem posledním tutoriálu jsme viděli, jak můžeme generovat vlastní znaky s naším 16 * 2 LCD displejem, nyní si vybavíme sebe s jiným typem zobrazovacího modulu, který se nazývá 7segmentový displej a propojíme jej s PIC Microcontroller.
16x2 LCD je sice mnohem pohodlnější než 7segmentový displej, ale existuje několik scénářů, kdy by se 7segmentový displej hodil lépe než LCD displej. Displej LCD trpí nedostatkem malé velikosti znaků a bude nadměrný pro váš projekt, pokud právě plánujete zobrazit některé číselné hodnoty. Sedmikanálové segmenty mají také výhodu proti špatným světelným podmínkám a lze je prohlížet z nižších úhlů než na normální obrazovku LCD. Začněme to tedy vědět.
7segmentový a 4místný 7segmentový zobrazovací modul:
7 Segmentový displej má v sobě sedm segmentů a každý segment má uvnitř jednu LED pro zobrazení čísel rozsvícením odpovídajících segmentů. Stejně jako pokud chcete, aby sedmisegmentový segment zobrazoval číslo „5“, musíte segmenty a, f, g, c a d zažehnout tak, že jejich odpovídající kolíky budou vysoké. Existují dva typy 7segmentových displejů: Common Cathode a Common Anode, zde používáme sedmisegmentový displej Common Cathode. Další informace o sedmisegmentovém displeji najdete zde.
Nyní víme, jak zobrazit požadovaný číselný znak na jednom 7segmentovém displeji. Je však docela zřejmé, že bychom potřebovali více než jeden 7segmentový displej, abychom mohli přenášet jakékoli informace, které jsou více než jedna číslice. V tomto výukovém programu tedy budeme používat 4místný 7segmentový zobrazovací modul, jak je znázorněno níže.
Jak vidíme, jsou zde čtyři čtyři segmentové displeje. Víme, že každý 7segmentový modul bude mít 10 pinů a pro 4 sedmisegmentové displeje bude celkem 40 pinů a bylo by hektické, aby je kdokoli pájel na tečkovanou desku, takže bych každému velmi doporučil koupit si modul nebo si vytvořte vlastní desku plošných spojů pro použití 4místného 7segmentového displeje. Schéma připojení stejné je uvedeno níže:
Abychom pochopili, jak čtyřmístný sedmisegmentový modul funguje, musíme se podívat na výše uvedená schémata, jak je znázorněno, že piny A všech čtyř displejů jsou připojeny, aby se shromáždily jako jeden A a stejný pro B, C…. až DP. Takže pokud je A aktivováno, měly by všechny čtyři A jít vysoko, že?
Ale to se nestalo. Máme další čtyři piny od D0 do D3 (D0, D1, D2 a D3), které lze použít k ovládání toho, který displej ze čtyř by měl jít vysoko. Například: Pokud potřebuji, aby byl můj výstup přítomen pouze na druhém displeji, měl by být vysoký pouze D1, zatímco ostatní piny (D0, D2 a D3) by měly být nízké. Jednoduše můžeme vybrat, které zobrazení musí být aktivní pomocí kolíků od D0 do D3 a jaký znak se má zobrazit pomocí kolíků od A do DP.
Připojení čtyřmístného sedmisegmentového modulu k mikrokontroléru PIC:
Zde jsme použili mikrokontrolér PIC PIC16F877A a schéma obvodu je uvedeno níže.
Máme 12 výstupních pinů z modulu, z nichž 8 se používá k zobrazení znaků a čtyři se používají k výběru jednoho displeje ze čtyř. Proto je všech 8 znakových kolíků přiřazeno PORTD a kolíky pro výběr zobrazení jsou přiřazeny prvním čtyřem kolíkům PORTC.
Poznámka: Zemnicí kolík modulu by měl být také připojen k zemi MCU, která zde není zobrazena.
Programování pomocí PIC16F877A:
Nyní, když víme, jak tento modul ve skutečnosti funguje, se naučme programovat PIC16F877A tak, aby zobrazoval čtyřmístné číslo. Pojďme zvýšit proměnnou od 0 do 1000 a vytisknout ji na 7segmentovém displeji. Spusťte program MPLABX a vytvořte nový projekt, pojďme začít s konfiguračními bity.
#pragma config FOSC = HS // Oscilátory pro výběr bitů (HS oscilátor) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT deaktivováno) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) pragma config BOREN = ON // Brown-out Reset Enable bit (BOR povoleno) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 je digitální I / O, HV zapnuto K programování je nutné použít MCLR) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code Protection off) #pragma config WRT = OFF // Flash Program Memory Write Povolení bitů (ochrana proti zápisu vypnuta; veškerá paměť programu) může být zapsáno do ovládacího prvku EECON) #pragma config CP = OFF // Bit kódu ochrany kódu paměti programu (ochrana kódu vypnuta)
Jako obvykle používáme okno pro nastavení konfiguračních bitů k nastavení těchto bitů. Pokud si nejste jisti, co to znamená, navštivte návod pro blikání LED zde.
Dále definujeme výstupní piny pro přepínání mezi každou číslicí displeje.
// *** Definujte signální piny všech čtyř displejů *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Konec definice ** ////
Zde se používají piny RC0, RC1, RC2 a RC3 pro výběr mezi čtyřmi číslicemi našeho 7segmentového zobrazovacího modulu. Tyto piny jsou definovány jako s1, s2, s3 a s4.
Dále skočíme do void main (), uvnitř kterého máme následující deklaraci proměnné:
int i = 0; // čtyřmístná hodnota, která se má zobrazit int flag = 0; // pro vytvoření zpoždění bez znaménka int a, b, c, d, e, f, g, h; // jen proměnné unsigned int seg = {0X3F, // Hex hodnota pro zobrazení čísla 0 0X06, // Hex hodnota pro zobrazení čísla 1 0X5B, // Hex hodnota pro zobrazení čísla 2 0X4F, // Hex hodnota pro zobrazení číslo 3 0X66, // Hex hodnota pro zobrazení čísla 4 0X6D, // Hex hodnota pro zobrazení čísla 5 0X7C, // Hex hodnota pro zobrazení čísla 6 0X07, // Hex hodnota pro zobrazení čísla 7 0X7F, / / Hex hodnota pro zobrazení čísla 8 0X6F // Hex hodnota pro zobrazení čísla 9}; // Konec pole pro zobrazení čísel od 0 do 9
Zde se proměnné i a příznak používají k ukládání zobrazovaných hodnot a vytváření zpoždění. Tyto nepodepsané celočíselné proměnné A až H se používá rozbít čtyři číslice čísla do jednociferné a jejich ukládání (což bude vysvětleno později zde).
Jednou z klíčových věcí, kterou je třeba si zde všimnout, je deklarace pole „seg“ . V tomto programu používáme nový datový typ s názvem Array. Pole není nic jiného než kolekce podobných hodnot datového typu. Zde jsme toto pole použili k uložení všech ekvivalentních hexadecimálních hodnot pro zobrazení čísla od 0 do 9.
Adresa pole vždy začíná od nuly. Takže toto pole bude mít hexadecimální hodnotu číselného čísla (0-9) uloženou v adrese, která je stejná jako u čísla uvedeného níže
Proměnná: |
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 jednoduše, pokud chcete zobrazit číslo 0 na vašem 7segmentu, můžete zavolat seg, stejně tak, pokud chcete zobrazit číslo 6, stačí použít seg.
Abychom pochopili, jak byla skutečně získána hodnota HEX, podívejme se do níže uvedené tabulky. Hexadecimální hodnota pro každé desetinné číslo je uloženo v poli tak, že to může být nazýváno zobrazit jeden konkrétní číslo.
Nyní přejdeme k další části kódu, kterou je konfigurace I / O:
// ***** I / O konfigurace **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** Konec konfigurace I / O ** ///
Konfigurace I / O je jednoduchá, protože všechny piny na našem 7segmentu jsou výstupní piny a připojení jsou zobrazena ve schématu výše, takže je jednoduše deklarujte jako výstupy a inicializujte je na nulu.
Nyní pojďme skočit do naší nekonečné smyčky (while (1)). Zde musíme rozdělit hodnotu „i“ na čtyři číslice a zobrazit je na sedmisegmentu. Nejprve začněme rozdělením hodnoty na „i“
// *** Rozdělení „i“ na čtyři číslice *** // a = i% 10; // je zde uložena 4. číslice b = i / 10; c = b% 10; // je zde uložena 3. číslice d = b / 10; e = d% 10; // je zde uložena 2. číslice f = d / 10; g = f% 10; // Zde je uložena první číslice h = f / 10; // *** Konec rozdělení *** //
Použitím jednoduché operace modulu a dělení je čtyřmístné číslo (i) rozděleno na jednotlivá čísla. V našem případě si vezměme příklad, kde hodnota „i“ je 4578. Na konci tohoto procesu pak bude proměnná g = 4, e = 5, c = 7 a a = 8. Nyní tedy bude snadné zobrazit každou číslici pouhým použitím této proměnné.
PORTD = seg; s1 = 1; // Zapněte displej 1 a vytiskněte 4. číslici __delay_ms (5); s1 = 0; // Vypnutí displeje 1 po 5 ms zpoždění PORTD = seg; s2 = 1; // Zapněte displej 2 a vytiskněte 3. číslici __delay_ms (5); s2 = 0; // Vypnutí displeje 2 po 5ms zpoždění PORTD = seg; s3 = 1; // Zapněte displej 3 a vytiskněte druhou číslici __delay_ms (5); s3 = 0; // Vypnutí displeje 3 po 5ms zpoždění PORTD = seg; s4 = 1; // Zapněte displej 4 a vytiskněte první číslici __delay_ms (5); s4 = 0; // Vypněte displej 4 po 5ms zpoždění
Toto je skutečné místo, kde MCU mluví se 7 segmentem. Jak víme, můžeme zobrazit pouze jednu číslici najednou, ale máme k dispozici čtyři číslice, které se mají zobrazit, a to pouze v případě, že všechny čtyři číslice jsou Zapnuto, uživateli bude viditelné celé čtyřmístné číslo.
Jak s tím máme jít?
Naštěstí pro nás je naše MCU mnohem rychlejší než lidské oko, takže to, co vlastně děláme: zobrazujeme jednu číslici po druhé, ale děláme to velmi rychle, jak je uvedeno výše.
Vybereme jednociferný displej a počkáme na 5 ms, aby jej MCU a 7segment mohli zpracovat a poté tuto číslici vypnout a přejít na další číslici a dělat totéž, dokud nedosáhneme poslední číslice. Toto zpoždění 5 ms nemůže lidské oko pozorovat a všechny čtyři číslice se zdály být zapnuté současně.
To je ono, nakonec pouze zvýšíme hodnotu zobrazené číslice pomocí zpoždění, jak je uvedeno níže
if (flag> = 100) // počkat, až příznak dosáhne 100 {i ++; flag = 0; // pouze v případě, že je příznak stovka "i" bude zvýšeno} příznak ++; // přírůstek pro každý záblesk
Zpoždění se používá k tomu, aby doba potřebná k přechodu z jednoho čísla na jiné byla dostatečně dlouhá na to, abychom si změnu všimli.
Kompletní kód je uveden níže a tento proces je také vysvětleno v Video na konci.
Nastavení a testování hardwaru:
Jako vždy, pojďme simulovat program pomocí Proteus, než skutečně půjdeme s naším hardwarem. Pokud je simulace úspěšná, měli byste vidět něco takového
Tento projekt nemá žádné složité hardwarové nastavení, opět používáme stejnou desku PIC Microcontroller, kterou jsme vytvořili v LED blikající výuce. Jednoduše připojte 7segmentový modul k desce mikrokontroléru PIC podle schématu zapojení. Jakmile budete hotovi s připojením, jednoduše vyklopte kód pomocí svého programátoru PicKit 3 a užijte si svůj výstup.