- 7 segmentu un 4 ciparu 7 segmentu displeja modulis:
- 4 ciparu septiņu segmentu moduļa savienošana ar PIC mikrokontrolleru:
- Programmēšana, izmantojot PIC16F877A:
- Aparatūras iestatīšana un testēšana:
Šī ir mūsu 8. apmācība par PIC mikrokontrolleru apgūšanu, izmantojot MPLAB un XC8. Mēs esam nonākuši visu ceļu, sākot no MPLABX instalēšanas, līdz LCD ar PIC MCU lietošanai. Ja šeit esat jauns, apskatiet iepriekšējās apmācības, kurās varat uzzināt taimerus, mirgojošu LED, saskarnes LCD utt. Visas mūsu PIC apmācības varat atrast šeit. Savā pēdējā apmācībā mēs redzējām, kā mēs varam ģenerēt pielāgotas rakstzīmes ar savu 16 * 2 LCD displeju, tagad ļaujiet mums aprīkot sevi ar cita veida displeja moduli, ko sauc par 7 segmentu displeju, un saskarni ar PIC mikrokontrolleru.
Lai gan 16x2 LCD ir daudz ērtāk nekā 7 segmentu displejs, taču ir maz scenāriju, kur 7 segmentu displejs būtu noderīgāks nekā LCD displejs. LCD cieš no tā, ka rakstzīmju izmērs ir mazs, un tas būs pārāk liels jūsu projektam, ja jūs tikai plānojat parādīt dažas skaitliskās vērtības. 7 segmentiem ir priekšrocība arī pret sliktu apgaismojumu, un tos var apskatīt no leņķa leņķiem nekā parasts LCD ekrāns. Tātad, sāksim to zināt.
7 segmentu un 4 ciparu 7 segmentu displeja modulis:
7 segmentu displejā ir septiņi segmenti, un katra segmenta iekšpusē ir viena gaismas diode, lai parādītu skaitļus, apgaismojot atbilstošos segmentus. Tāpat kā tad, ja vēlaties, lai 7 segmenti uzrāda skaitli "5", tad jums jāspīd kvēlojošais segments a, f, g, c un d, padarot to atbilstošās tapas augstas. Ir divu veidu 7 segmentu displeji: kopējais katods un kopējais anods, šeit mēs izmantojam kopīgā katoda septiņu segmentu displeju. Uzziniet vairāk par 7 segmentu attēlojumu šeit.
Tagad mēs zinām, kā vēlamo ciparu rakstzīmi attēlot vienā 7 segmentu displejā. Bet ir diezgan skaidrs, ka mums būtu nepieciešams vairāk nekā viens 7 segmentu displejs, lai sniegtu informāciju, kas ir vairāk nekā viens cipars. Tātad šajā apmācībā mēs izmantosim četrciparu 7 segmentu displeja moduli, kā parādīts zemāk.
Kā redzam, ir savienoti četri septiņi segmentu displeji. Mēs zinām, ka katram 7 segmentu modulim būs 10 tapas un četriem septiņiem segmentu displejiem kopā būtu 40 tapas, un ikvienam būtu drudžaini tos lodēt uz punktveida dēļa, tāpēc es ļoti iesaku ikvienam iegādāties moduli vai izveidojiet pats savu PCB četrciparu 7 segmentu displeja izmantošanai. Savienojuma shēma tam pašam ir parādīta zemāk:
Lai saprastu, kā darbojas četrciparu septiņu segmentu modulis, mums ir jāizpēta iepriekš minētās shēmas, kā parādīts, visu četru displeja A tapas ir savienotas, lai savāktu kā vienu A un to pašu B, C…. līdz DP. Tātad, ja aktivizētājs A ir ieslēgts, tad visiem četriem A vajadzētu iet augstu?
Bet tas nenotiek. Mums ir papildu četras tapas no D0 līdz D3 (D0, D1, D2 un D3), kuras var izmantot, lai kontrolētu, kuram displejam no četriem vajadzētu būt augstiem. Piemēram: Ja man vajag, lai mana izeja būtu redzama tikai otrajā displejā, tad tikai D1 būtu jāpadara augsts, turot citus tapas (D0, D2 un D3) tik zemus. Vienkārši mēs varam izvēlēties, kuram displejam ir jābūt aktīvam, izmantojot tapas no D0 līdz D3, un kādu rakstzīmi attēlot, izmantojot tapas no A līdz DP.
4 ciparu septiņu segmentu moduļa savienošana ar PIC mikrokontrolleru:
Šeit mēs izmantojām PIC mikrokontrolleru PIC16F877A, un shēmas shēma ir parādīta zemāk.
Mums ir 12 izvades tapas no moduļa, no kurām 8 tiek izmantotas, lai parādītu rakstzīmes, un četras tiek izmantotas, lai izvēlētos vienu displeju no četriem. Tādējādi visas 8 rakstzīmju tapas tiek piešķirtas PORTD, un displeja izvēles tapas tiek piešķirtas pirmajām četrām PORTC tapām.
Piezīme: Moduļa zemējuma tapai jābūt savienotai arī ar MCU zemējumu, kas šeit nav parādīts.
Programmēšana, izmantojot PIC16F877A:
Tagad, kad mēs zinām, kā šis modulis faktiski darbojas, ļaujiet mums uzzināt, kā programmēt PIC16F877A, lai tas parādītu četrciparu skaitli. Palielināsim mainīgo no 0 līdz 1000 un izdrukāsim to 7 segmentu displejā. Palaidiet MPLABX programmu un izveidojiet jaunu projektu, sāksim ar konfigurācijas bitiem.
#pragma config FOSC = HS // Oscilatora izvēles biti (HS oscilators) #pragma config WDTE = OFF // Watchdog taimera iespējošanas bits (WDT atspējots) #pragma config PWRTE = ON // Ieslēgšanas taimera iespējošanas bits (PWRT iespējots) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR iespējots) #pragma config LVP = OFF // Zemsprieguma (vienas piegādes) ķēdes sērijveida programmēšanas iespējošanas bits (RB3 ir digitāls I / O, HV ieslēgts Programmēšanai jāizmanto MCLR) #pragma config CPD = OFF // Datu EEPROM atmiņas koda aizsardzības bits (datu EEPROM koda aizsardzība izslēgta) #pragma config WRT = OFF // Flash programmas atmiņas rakstīšana Iespējot bitus (Rakstīšanas aizsardzība izslēgta; visa programmas atmiņa var rakstīt, izmantojot EECON vadību) #pragma config CP = OFF // Flash programmas atmiņas koda aizsardzības bits (koda aizsardzība izslēgta)
Kā parasti, mēs izmantojam iestatīto konfigurācijas bitu logu, lai iestatītu šos bitus. Ja neesat pārliecināts, ko tie nozīmē, apmeklējiet šeit mirgojošo LED apmācību.
Pēc tam definēsim izvades tapas, lai pārslēgtos starp katru displeja ciparu.
// *** Definējiet visu četru displeju signāla tapas *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** Definīcijas beigas ** ////
Šeit tapas RC0, RC1, RC2 un RC3 tiek izmantotas, lai izvēlētos starp mūsu 7 segmentu displeja moduļa četriem cipariem. Šīs tapas ir attiecīgi definētas kā s1, s2, s3 un s4.
Tālāk ļaujiet mums pāriet uz void main (), kurā mums ir šāda mainīgā deklarācija:
int i = 0; // četrciparu vērtība, kas jāparāda int flag = 0; // par aizkaves izveidi neparakstītu int a, b, c, d, e, f, g, h; // tikai mainīgie neparakstīti int seg = {0X3F, // Hex vērtība, lai parādītu skaitli 0 0X06, // Hex vērtība, lai parādītu skaitli 1 0X5B, // Hex vērtība, lai parādītu skaitli 2 0X4F, // Hex vērtība, kas jāparāda skaitlis 3 0X66, // Hex value, lai parādītu skaitli 4 0X6D, // Hex value, lai parādītu skaitli 5 0X7C, // Hex value, lai parādītu skaitli 6 0X07, // Hex value, lai parādītu skaitli 7 0X7F, / / Hex value, lai parādītu skaitli 8 0X6F // Hex value, lai parādītu skaitli 9}; // Masīva beigas skaitļu parādīšanai no 0 līdz 9
Šeit mainīgos i un flag izmanto, lai saglabātu parādāmās vērtības un attiecīgi izveidotu aizkavi. Par absolūtā veselā mainīgie a līdz h tiek izmantoti, lai izjauktu četrus skaitļus pa vienu ciparu, un saglabāt tos (kas tiks paskaidrots vēlāk šeit).
Viena galvenā lieta, kas šeit jāņem vērā, ir masīva "seg" deklarācija. Šajā programmā mēs izmantojam jaunu datu tipu ar nosaukumu Array. Masīvs nav nekas cits kā līdzīgu datu tipa vērtību kolekcija. Šeit mēs izmantojām šo masīvu, lai saglabātu visas ekvivalentās sešstūra vērtības, lai parādītu skaitli no 0 līdz 9.
Masīva adrese vienmēr sākas no nulles. Tātad šim masīvam ciparu skaitļa (0–9) hex vērtība ir saglabāta adresē, kas ir tāda pati kā skaitlim, kā parādīts zemāk
Mainīgais: |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
seg |
Hex kods: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
Eq. Ciparu numurs: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Vienkārši, ja vēlaties parādīt skaitli 0 savā 7 segmentā, varat izsaukt seg, tāpat, ja vēlaties parādīt skaitli 6, jums vienkārši jāizmanto seg.
Lai saprastu, kā HEX vērtība faktiski tika iegūta, apskatīsim zemāk esošo tabulu. Ekvivalentu HEX vērtība katram decimālskaitlis tiek glabāti masīvā, lai to varētu saukt, lai parādītu vienu konkrētu skaitli.
Tagad pārejam uz nākamo koda daļu, kas ir I / O konfigurācija:
// ***** I / O konfigurācija **** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; *** I / O konfigurācijas beigas ** ///
Ieejas / izejas konfigurācija ir vienkārša, jo visas mūsu 7 segmentu tapas ir izejas tapas, un savienojumi ir parādīti augšējā ķēdes diagrammā, tāpēc vienkārši deklarējiet tos kā izvadus un inicializējiet tos uz nulli.
Tagad ielecim savā bezgalīgajā cilpā (kamēr (1)). Šeit mums ir jāsadala "i" vērtība četros ciparos un jāparāda tie 7 segmentos. Vispirms sāksim, sadalot vērtību uz “i”
// *** "i" sadalīšana četros ciparos *** // a = i% 10; // šeit tiek saglabāts 4. cipars b = i / 10; c = b% 10; // šeit tiek saglabāts 3. cipars d = b / 10; e = d% 10; // šeit tiek saglabāts 2. cipars f = d / 10; g = f% 10; // šeit tiek saglabāts 1. cipars h = f / 10; *** Sadalīšanas beigas *** //
Izmantojot vienkāršu moduļa un dalīšanas darbību, četrciparu skaitlis (i) tiek sadalīts atsevišķos skaitļos. Mūsu gadījumā ņemsim piemēru, kur "i" vērtība ir 4578. Tad šī procesa beigās mainīgais g = 4, e = 5, c = 7 un a = 8. Tāpēc tagad būs viegli parādīt katru ciparu, vienkārši izmantojot šo mainīgo.
PORTD = seg; s1 = 1; // Ieslēdziet 1. displeju un izdrukājiet 4. ciparu __delay_ms (5); s1 = 0; // Izslēdziet 1. displeju pēc 5 ms kavēšanās PORTD = seg; s2 = 1; // Ieslēdziet 2. displeju un izdrukājiet 3. ciparu __delay_ms (5); s2 = 0; // Izslēdziet 2. displeju pēc 5 ms kavēšanās PORTD = seg; s3 = 1; // Ieslēdziet 3. displeju un izdrukājiet 2. ciparu __delay_ms (5); s3 = 0; // Izslēdziet displeju 3 pēc 5 ms kavēšanās PORTD = seg; s4 = 1; // Ieslēdziet 4. displeju un izdrukājiet 1. ciparu __delay_ms (5); s4 = 0; // Izslēdziet displeju 4 pēc 5 ms kavēšanās
Šī ir faktiskā vieta, kur MCU runā ar 7 segmentiem. Kā mēs zinām, mēs vienlaikus varam parādīt tikai vienu ciparu, taču mums ir jāparāda četri cipari, un tikai tad, ja visi četri cipari ir ieslēgti, lietotājam būs redzams viss četru ciparu numurs.
Tātad, kā mēs to darīsim?
Mums paveicies, ka mūsu MCU ir daudz ātrāk nekā cilvēka acs, tāpēc tas, ko mēs patiesībā darām: mēs vienlaikus rādām vienu ciparu, bet mēs to darām ļoti ātri, kā parādīts iepriekš.
Mēs izvēlamies viena cipara displeju, gaidot 5 ms, lai MCU un 7 segmenti varētu to apstrādāt, pēc tam izslēgt šo ciparu un pāriet uz nākamo ciparu un darīt to pašu, līdz mēs sasniedzam pēdējo ciparu. Cilvēka acs nevar novērot šo 5 ms kavēšanos, un visi četri cipari vienlaikus bija ieslēgti.
Tieši tā, visbeidzot, mēs vienkārši palielinām parādītā cipara vērtību, izmantojot aizkavi, kā parādīts zemāk
ja (karogs> = 100) // pagaidiet, līdz karogs sasniegs 100 {i ++; karogs = 0; // tikai tad, ja karogs ir simts "i" tiks palielināts} karogs ++; // pieauguma karodziņš katrai zibspuldzei
Kavēšanās tiek izmantota tā, lai laiks, kas vajadzīgs, lai nomainītu no viena numura uz citu, ir pietiekami ilgs, lai mēs pamanītu izmaiņas.
Pilnīga kods ir norādīts zemāk, un process ir izskaidrots arī video beigās.
Aparatūras iestatīšana un testēšana:
Kā vienmēr, simulēsim programmu, izmantojot Proteus, pirms mēs patiešām ejam ar savu aparatūru. Ja simulācija ir veiksmīga, jums vajadzētu redzēt kaut ko līdzīgu šim
Šim projektam nav sarežģītas aparatūras iestatīšanas, mēs atkal izmantojam to pašu PIC mikrokontrolleru plāksni, kuru esam izveidojuši LED mirgojošā apmācībā. Vienkārši savienojiet 7 segmentu moduli ar savu PIC mikrokontrolleru plati atbilstoši savienojuma shēmai. Kad esat pabeidzis savienojumus, vienkārši nometiet kodu, izmantojot savu PicKit 3 programmētāju, un tas ir, izbaudiet izvadi.