Mikrokontroller pic assemblerində dinamik göstəricinin idarə edilməsi. Yeddi seqmentli göstərici. Proqram təminatının həyata keçirilməsi yolları

Dərsin davamında dinamik göstəricini nəzərdən keçirəcəyik. Əgər siz statik göstəricini diqqətlə öyrənmisinizsə, onda siz bilirsiniz ki, seqment göstəricisi LED dəstidir. Göstəricini birləşdirmək üçün mikrokontrolörün 7 pininə ehtiyacınız var. Ancaq birdən bir neçə göstəricidən istifadə etməli olduq, məsələn 2, 3, 4...

Onda bizə artıq 14, 21, 28 ayaq lazım olacaq və o qədər az ayaq var ki... Burada dinamik göstərici köməyimizə gəlir. Dinamik göstəricinin əsas vəzifəsi istifadə olunan mikrokontroller pinlərinin sayını azaltmaqdır. 14 ayaq deyil, 9 cəlb edilən sxemə diqqət yetirin. Nəzarət ayaqları hamısı paralel olaraq bağlıdır.

Ümumi mənada bu dizayn aşağıdakı kimi işləyir: birincisi, ilk nömrənin konfiqurasiyası ümumi avtobusa çıxarılır və PB1-i işə salın. Birinci göstərici istədiyiniz nömrə ilə yanır. Sonra onu söndürürük, ikinci nömrənin konfiqurasiyasını məlumat avtobusuna çıxarırıq, ikinci göstəricini yandırırıq, söndürürük.

Daha ətraflı. İlk anda hər şey sönür PORTB=0x00; PORTD=0xFF; ümumi "+" anodlu dövrədən bəri. Sonra, ilk nömrənin konfiqurasiyası PORTD-ə göndərilir, məsələn, "0". Statik göstəricidən xatırlayırıq:

hal 0 : ( PORTD = 0xC0 ; fasilə ; )

hal 0: ( PORTD=0xC0; fasilə; )

Amma qeyd edək ki, "+" PORTB.1-ə bağlıdır, yəni. seqmenti işıqlandırmaq üçün ayağı yandırmaq lazımdır PORTB.1=1;

Zamanın ikinci anında hər şeyi yenidən söndürürük, ikinci nömrənin konfiqurasiyasını göndəririk və bu dəfə ikinci göstəricini yandırırıq. Sonra təkrar edirik.

At yüksək tezliklər, insan gözü bu açarları görə bilmir və belə görünür ki, göstərici daim yanır. 50Hz-dən çox olan tezliklərdən istifadə etməmək tövsiyə olunur. Test layihəmdə 120Hz istifadə etdim. Taymer 1MHz-ə təyin edilmişdir. Kod Timer1 kəsilməsində işlənir. Kesinti saniyədə 240 dəfə çağırılır, çünki iki göstərici var, ona görə də müqayisə registrinə 1000 000/240=4166 və ya 0x1046 itələnir. Proteus dinamik göstərici ilə dostluq edə bilmədi, lakin o, dərhal hardware üzərində işlədi.

Qeyd!!! Göstəricini birləşdirərkən, hər bir seqmentdə bir ümumi deyil, cərəyan məhdudlaşdıran bir rezistorun asılması tövsiyə olunur. Ayrıca, bir tranzistor vasitəsilə göstəricinin ümumi telini açmağı məsləhət görürəm, əks halda ayağı yandıra bilərsiniz.

Ümumi anod dövrəsi üçün

Ümumi katod dövrəsi üçün

Test proqram təminatı olaraq mən əvvəlki layihənin taymerindən istifadə etdim.

Firmware haqqında video

Məlumatı göstərməyin ən geniş yayılmış üsullarından biri 7 seqmentli göstəricidir. O, asanlıqla rəqəmsal və psevdomətn məlumatlarını göstərməyə imkan verir (həmçinin xüsusi mətn çoxseqmentli göstərici var), lakin bunun üçün nəzarətçidən çoxlu sayda pulsuz çıxış tələb olunur. İstifadə olunan sancaqların sayını azaltmağın iki yolu var: xüsusi sürücüdən (və ya bufer elementindən) istifadə edin və ya dinamik göstəricidən istifadə edin. Ekrana seqmentlərin hər biri və hər bir simvol üçün bir ədəd 7 sancaq gedəcək və simvollar növbə ilə o qədər yüksək sürətlə yanacaq ki, insan bunu ayırd etməyəcək və ona göstəricinin bərabər olduğu görünəcək. yanma.

OPSİYON=0b00000000; // Tənzimləmə TMR0 INTCON=0b10100000; // Kesintilər aktivdir və yalnız TMR0-dan

İşləmək üçün sizə aşağıdakı qlobal dəyişənlər lazımdır:

İmzasız simvol v1,v2,v3, vn;

İlk üçü müvafiq seqmentlərin dəyərlərinə cavabdehdir, sonuncusu isə hazırda yanan seqmentin sayına görədir (dinamik göstərici).

Kəsmə işləyicisi seqmentləri növbə ilə dəyişən taymeri emal etməklə məşğuldur.

Ləğv kəsilməsi isr(void) ( if(T0IF) // əgər TMR0 aşıbsa ( vn++; // seqment keçidini dəyişdirin(vn) // seqmenti seçin ( hal 1:seg7(v1,1); fasilə; hal 2:seg7(v2) ,2);break; hal 3:(seg7(v3,3);vn=0;)break; ) TMR0=100; // taymerin başlanğıcdan başqa bir şeyə qurulması T0IF=0; // bayrağı sıfırlayın ) )

Ümumi anodlu yeddi seqmentli ekranın simvol dəyərini göstərmək üçün aşağıdakı funksiya istifadə olunur:

Ləğv et seg7(insigned char c, unsigned char s) ( unsigned char t=0; // g seqment PORTA=0b00000000; // reset port A switch(s) // select anod ( case 1:(t=1;)break ; hal 2:(t=2;)break; hal 3:(t=32;)break; ) keçid(c%10) // seqmentləri (katodlar) seçin ( // 00bfaed g hal 0: (PORTC=0b00000000; PORTA=t+4;)break;iş 1: (PORTC=0b00011110;PORTA=t+4;)fasilə;iş 2: (PORTC=0b00010001;PORTA=t;)fasilə;iş 3: (PORTC=0b00010100;PORTA =t;)break;hal 4: (PORTC=0b00001110;PORTA=t;)break;hal 5: (PORTC=0b00100100;PORTA=t;)break;hal 6: (PORTC=0b00100000;PORTA=t;)break ;iş 7: (PORTC=0b00010110;PORTA=t+4;)fasilə;iş 8: (PORTC=0b00000000;PORTA=t;)fasilə;iş 9: (PORTC=0b00000100;PORTA=t;)fasilə; ) )

PIC16F676 natamam çıxış portlarına malikdir, ona görə də bütün seqmentlər C portuna sığmırdı, g seqmenti A portuna yerləşdirilməli və nöqtə inverter vasitəsilə ümumi anodlardan birinə sxematik şəkildə qoşulmalı idi. Belə bir əlaqənin sxemi aşağıdakı kimidir:

Ən azı bir tam portu olan başqa mikrokontrollerdən istifadə edirsinizsə, məsələn, PIC16F628A

funksiya aşağıdakı formanı alacaq:

Etibarsız seg7(insigned char c, unsigned char s) ( unsigned char t=0; switch(c%10) // seqmentləri (katodlar) seçin ( // gcPdeafb halda 0: (t=0b10100000;)break; hal 1: ( t=0b10111110;)fasilə; hal 2: (t=0b01100010;)fasilə; hal 3: (t=0b00101010;)fasilə; hal 4: (t=0b00111100;)fasilə; hal 5: (t=0b00010;)break ;iş 6: (t=0b00100001;)fasilə;iş 7: (t=0b10111010;)fasilə;iş 8: (t=0b00100000;)fasilə;iş 9: (t=0b00101000;)portA=0;00; // port A keçid(lər)ini sıfırlayın // anod seçin (1-ci hal:( PORTA =4;)break; hal 2:( PORTA =8;)break; hal 3:( PORTA =64;)break; ) PORTB= t; əgər(c>9) ( PORTB=t ) )

Əgər simvolun yanındakı nöqtə yanır ilə 9-dan böyükdür, dəyər hələ də göstəricidə göstəriləcək, yəni. yalnız ən az əhəmiyyətli rəqəm çıxarılacaq, qalan hər şey atılır (məsələn: 1 9 , 39 = 9. ).

Əsas funksiyada (əsas) MK səssizcə öz işini görür, çıxış üçün yeni məlumatlar ekranda onun dəyişənlərin dəyərlərini dəyişməsi kifayətdir v1,v2,v3, lakin göstəricidə çaşqınlığın qarşısını almaq üçün onlar eyni vaxtda dəyişdirilməlidir.

Dinamik göstərici temperatur, gərginlik, vaxt və ya sadəcə olaraq hər hansı bir cihaz və ya sensorun tetikleyicilərinin sayı kimi müxtəlif məlumatları göstərmək üçün geniş istifadə olunur. Bazadakı dinamik göstərici mikrokontrollerlərlə birlikdə mükəmməl şəkildə əlaqələndirilir. Bununla belə, proqramlaşdırma ədəbiyyatında AVR mikro nəzarətçiləri bu məsələ çox səthi nəzərdən keçirilir və müvafiq mövzuda hər kitabda deyil. Buna görə, dinamik göstəricisi olan yeddi seqmentli bir göstəricini bir mikrokontrolörə, bu halda ATmega8-ə necə bağlayacağını daha ətraflı nəzərdən keçirəcəyik, lakin hər hansı bir seriyanın AVR MK üçün analogiya qorunur.

Rəqəmlərin (rəqəmlərin) sayına görə dinamik yeddi seqmentli göstəricilər birrəqəmli, ikirəqəmli, üçrəqəmli, dördrəqəmli və çox nadir hallarda altı rəqəmlidir. Dinamik göstəricinin ən çox istifadə olunan növü kimi dörd rəqəmli yeddi seqmentli göstəricilərə diqqət yetirəcəyik. Onlar ümumi anod və ümumi katod ilə hazırlanır. Fərdi seqmentlərin LED-lərini birləşdirmək üçün diaqramlar rəqəmlərdə göstərilmişdir.

Rəqəmlərdən göründüyü kimi, rəqəm adlanan hər bir rəqəmin rəqəm daxilində ümumi olan öz ayrıca çıxışı var. 4 rəqəmli dinamik göstərici nəzərə alındığından dörd belə çıxış var - digit1, digit2, digit3, digit4.

4 rəqəmli yeddi seqmentli göstəricinin çıxışlarının pinoutu aşağıdakı şəkildə göstərilmişdir. Bu halda, yuxarıdan görünüş göstərilir, yəni göstəricini alt-üst etmək lazım deyil.

Dinamik göstərici necə işləyir

İndi ümumi katodla dinamik göstəricinin necə işlədiyinə baxaq. Məsələn, 1987 rəqəmini göstərməliyik.Bunun üçün ilk anda vahidi təşkil edən seqmentlərin anodlarına yüksək potensial tətbiq edilməlidir - b və c və aşağı potensial tətbiq edilməlidir. birinci kateqoriyanın ümumi katoduna. Qalan üç rəqəmin ümumi katodları - digit2, digit3 və digit4 əlaqəsiz qalır.

Zamanın ikinci anında 9 rəqəmini təşkil edən seqmentlər güc alır, ikinci rəqəmin ümumi katodu mənfiyə bağlanır və rəqəm1 gücünü itirir; rəqəm2, rəqəm3, əvvəlki kimi, əlaqəsiz qalır.

Zamanın üçüncü anında üçüncü göstəricidə 8 rəqəmi yanır, qalan göstəricilər isə sönür.

Dördüncü vaxtda son göstərici güc alır və 7 rəqəmi göstərilir.

Sonra hər şey yenidən təkrarlanır. Boşalmadan 25 Hz-dən çox boşalmaya keçid tezliyi ilə, LED-lərin yüngül inersiyasına görə gözlərimiz keçidin necə baş verdiyini görməyə vaxt tapmır, buna görə də vizual olaraq bütün boşalmaların ayrılmaz parıltısını eyni anda qəbul edirik. .

Dinamik göstəricinin mikrokontrollerə qoşulması sxemi ATmega 8

Dinamik göstərici seqmentlərini nominal dəyəri 330 Ohm olan cərəyan məhdudlaşdıran seqmentlər vasitəsilə ATmega8 mikrokontrollerinin D portunun sancaqlarına bağlayacağıq. Rəqəm1, rəqəm2, rəqəm3, rəqəm4-ə uyğun gələn nəticələr tranzistorlar vasitəsilə birləşdirilir. n-p-n növü, məsələn, BC547 və ya 2n2222 port B sancaqlarına.

Dinamik göstəricini birləşdirmək üçün kodun yazılması alqoritmi

Daha konkret hərəkətlər üçün ümumi katodlu 4 rəqəmli yeddi seqmentli göstəricidən istifadə edəcəyik. İlk addım 0-dan 9-a qədər rəqəmlər massivi yaratmaqdır. Biz bunu əvvəllər öyrənmişdik. Sonra, 4 rəqəmli rəqəmi dörd ayrı rəqəmə bölmək lazımdır. Məsələn, 1987 rəqəmi 1, 9, 8 və 7-yə bölünməlidir. Sonra vahid göstəricinin birinci rəqəmində, ikincidə doqquz, üçüncüdə səkkiz və dördüncü rəqəmdə yeddi göstərilməlidir.

Çoxrəqəmli ədədi ayrı-ayrı ədədlərə bölmək üçün bir çox alqoritmlər arasında bölmə əməliyyatlarından və bölmənin qalan hissəsindən istifadə edəcəyik. Məsələni nəzərdən keçirək:

1987/1000 → 1

1987%1000/100 → 9

1987%100/10 → 8

1987%10 → 7

C-də, tam məlumat növündən istifadə edərkən int bölməni yerinə yetirərkən bütün ondalıqlar, yüzlüklər və s., yəni birdən kiçik olan bütün ədədlər atılır. Yalnız tam ədədlər qalır. Burada riyazi yuvarlaqlaşdırma işləmir, ona görə də bu halda 1,9 2 deyil, 1 olacaq.

"Bölünmə qalığı" əmri "faiz işarəsi ilə göstərilir" % ". Bu əmr bütün tam ədədləri rədd edir və qalan nömrəni tərk edir. Məsələn, 1987%1000 → 987; 1987%100 → 87; 1987%10 → 7.

Sonra, əvvəlcə birinci rəqəmi və ona uyğun gələn nömrəni, sonra müəyyən bir müddətdən sonra ikinci rəqəmi və ona uyğun gələn nömrəni göstərəcək bir əmr yazmalısınız; və s. Aşağıda şərhləri olan kod var.

KOD

#müəyyənləşdirmək F_CPU 1000000L

#daxildir

#daxildir

#CHISLO PORTD-u təyin edin

#RAZRIAD PORTB-ni təyin edin

imzasız int razr1 = 0, razr2 = 0, razr3 = 0, razr4 = 0;

imzasız int nömrəsi = (

// 0-dan 10-a qədər rəqəmlər

0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f

};

void vse_chislo (imzasız int rabivka_chisla)

{

razr1 = rabivka_chisla/1000; // minlərlə

razr2 = rabivka_chisla%1000/100; // yüzlərlə

razr3 = rabivka_chisla%100/10; // onlarla

razr4 = rabivka_chisla%10; // vahidlər

}

int əsas(boş)

{

DDRB = 0b00001111;

DDRD = 0b11111111;

RAZRIAD = 0b00000001; // ilkin olaraq 1-ci rəqəm

CHISLO=0x3f; // 0 nömrəsi

isə (1)

{

vse_chislo(1987); // nömrəni göstərin

RAZRIAD = 0b00000001; // 1-ci biti yandırın, qalanını söndürün

CHISLO=chisla ; // 1-ci rəqəmi göstərin

_gecikmə_ms(3);

RAZRIAD = 0b00000010; // 2-ci biti yandırın, qalanını söndürün

CHISLO=chisla ; // 2-ci rəqəmi göstərin

_gecikmə_ms(3);

RAZRIAD = 0b00000100; // 3-cü biti yandırın, qalanını söndürün

CHISLO=chisla ; // 3-cü rəqəmi göstərin

_gecikmə_ms(3);

RAZRIAD = 0b00001000; // 4-cü biti yandırın, qalanını söndürün

CHISLO=chisla ; // 4-cü rəqəmi göstərin

_gecikmə_ms(3);

}

}

Dinamik göstərici üçün proqramın təkmilləşdirilməsi

Yuxarıdakı alqoritm daha çox öyrənmə alqoritmidir, ona görə də bir qədər sadələşdirilmişdir, lakin real vaxtda heç bir sürətli hesablama aparmayan proqramlarda da yeri var. Yeganə mənfi cəhət bu alqoritm gecikmələrin istifadəsidir, bunun mənfi təsiri daha əvvəl müzakirə edilmişdir. Gecikmələrin istifadəsindən xilas olmaq üçün taymer sayğaclarından kəsilmələrdən istifadə edə bilərsiniz. Aşağıdakı kodda gecikmələr sıfır taymer sayğacından istifadə etməklə və bu sayğacın daşması zamanı fasilə çağırmaqla formalaşır.

Rəqəmlərin hər kəsilmədə indikatorun hər bir rəqəmində ardıcıl olaraq göstərilməsi üçün bc547 dəyişəni əlavə edilmişdir ki, bu da ISR kəsilməsinin (TIMER0_OVF_vect) sonrakı çağırışında bir artır. Sonra bc547 dəyişəninin qiyməti yoxlanılır və müvafiq bit enerji ilə təchiz edilir. bc547 dörddən çox olduqda, birinə sıfırlanır.

DGöstəricidə çoxrəqəmli nömrəni göstərmək üçün əvvəlcə nömrəni komponentlərinə bölməkdən ibarət olan çətin manipulyasiya etməlisiniz. Nümunə olaraq, ümumi anodlu dörd yeddi seqmentli göstəricidə 1234 nömrəsinin ekranını verəcəyəm.


Dörd rəqəmli nömrəni göstərmək üçün siz göstərmək istədiyiniz nömrənin yerləşəcəyi bir ümumi dəyişən yaratmalısınız (dəyişən W), hər işarə üçün məlumat saxlayacaq dörd dəyişən (N) və aralıq çevrilmələr üçün daha dörd dəyişən (M) əsas dəyişənə toxunmamaq üçün. Dəyişən onda saxlanacaq dəyərə uyğun olmalıdır.I. Belə ki, dəyişən üçünWnövü kifayət edəcəkdirtam , çünki bu tipli dəyişən xp-yə qadirdir-32768-dən +32767-yə qədər (və yasöz mənfi ədədlərdən istifadə etməyi planlaşdırmasanız). DəyişənlərdəN0-dan 9-a qədər rəqəmlər yerləşəcək, belə ki, tipli bir dəyişəndən istifadə etmək kifayət edəcəkdirbayt
. Və dəyişənlərdəM olacaqdəyişəndəki kimi eyni dəyərlərW, beləliklə növü təyin etdik tam .

Dim W Tam Ədədi
Dim N1 Bayt kimi
Dim N2 Bayt kimi
Dim N3 Bayt kimi
Dim N4 Bayt kimi
M1-i tam ədəd kimi azaldın
M2-ni tam ədəd kimi azaldın
Dim M3 Tam Ədədi
M4-ü tam ədəd kimi azaldın


Dəyişənləri elan etdikdən sonra çıxış üçün portları quraşdırırıqgöstəricini birləşdirmək üçün istifadə ediləcək:

DDRC = &B11111111
DDRD = &B11111111


DDRC=&B 00001111 və DDRD=&B 01111111 (C limanının dörd ilk ayağıanodlar və altı birinci port üçün D alt seqmentləri).

Sonra dəyişənə təyin edin W göstəricidə göstərəcəyimiz dəyər:

W=1234

"Arial","sans serif""> Proqramın əsas dövrəsində M dəyişənlərinə dəyişənin qiymətini təyin edirikW, mən bunu edirəm:

M1=W
M2 = M1
M3 = M1
M4 = M1


"Arial","sans serif""> Bu paranoya deyil)), bu, bütün M dəyişənlərində eyni sayda olması məqsədi ilə edilir, çünki təyinat əməliyyatı zamanı bir kəsmə (əgər varsa və əlil deyilsə) işləyicisində asanlıqla daxil ola bilər. dəyişənW dəyişə bilər. Və əgər tapşırıq belə getsə: М1= W , M 2= W , M 3= W , M 4= W dəyişənlərdə M yalan olacaq müxtəlif mənalar bu da oxunuşlarda qarışıqlığa səbəb olacaq.

Dəyişənlərə qiymətlər təyin etdikdən sonra onlarla işləməyə başlayırıq
bunların hər biri bir dəyişənə çevriləcək şəkildə N olacaq dəyəri aldı
göstəricidə göstərilir: dəyişəndə
N 1 "1" olmalıdır N 2 - "2", N 3 - "3", N 4 - "4".

M1=M1/1000" M1=1234/1000=1.234
N1=Abs(m1)" N1=Abs(1.234)=1

abs – dəyişənin tam ədədini qaytaran funksiya.Dəyişənə N 1 faktiki tələb olunan vahidi vurdu.

Bir dəyişənə iki təyin etmək N 2 əməliyyatı bir az daha mürəkkəb olacaq:

M2= M2 Mod 1000 " M2 =1234 Mod 1000 = 234
M2=M2/100" M2=234/100=2.34
N2= Abs (m2) " N2 = Abs (2.34) = 2

"Arial","sans serif""> Funksiyadan başlamaq üçünMod ilk üçünü qaytarırıq
nömrənin rəqəmləri (1000-ə bölmənin qalan hissəsi), sonra hər şey birinci vəziyyətdə olduğu kimidir.

Son iki rəqəmlə demək olar ki, eyni şey:

M3 = M3 Mod100
M3=M3/10
N3 = Abs (m3)

M4 = M4 Mod 10
N4= Abs (m4)


İndi dəyişənlərimiz göstərmək istədiyimiz dəyərləri ehtiva edir, mikrokontrolörün ayaqlarını vurması və bu dəyərləri göstəricidə göstərməsi vaxtıdır, bunun üçün ekran emal alt proqramı adlandırırıq:

"Arial","sans serif"">

Gosub Led

"Arial","sans serif""> Prosessor etiketli alt proqrama keçəcəkLed:

Led:

Portc = &B00001000

"Arial","sans serif""> Burada yüksək səviyyədə xidmət edirikPORTC .3, biz birinci kateqoriyanın anodunu bu ayaqla birləşdirdik. Daha sonra birinci dəyişənin dəyərini göstərmək üçün hansı seqmentləri işıqlandıracağımızı seçirik. O, bizdən biridir, ona görə də sıfır onun ayağında olacaq Port .1 və Portd seqmentlərə uyğun gələn .2 B və C göstəricisi.

N1 işi seçin









Seçimi bitir
Gözləyir 5

"Arial","sans serif""> Lazımi seqmentlər yandırıldıqdan sonra 5 ms gözləyirik və aşağıdakı nömrələri göstərməyə davam edirik:

Portc = &B00000100
N2 işi seçin
Case 0: Port = &B11000000
1-ci hal: Port = &B11111001
2-ci hal: Port = &B10100100
3-cü hal: Port = &B10110000
İş 4: Port = &B10011001
İş 5: Port = &B10010010
İş 6: Port = &B10000010
İş 7: Port = &B11111000
Case 8: Portd = &B10000000
İş 9: Port = &B10010000
Seçimi bitir

Gözləyir 5

Portc = &B00000010

N3 Case seçin
Case 0: Port = &B11000000
1-ci hal: Port = &B11111001
2-ci hal: Port = &B10100100
3-cü hal: Port = &B10110000
İş 4: Port = &B10011001
İş 5: Port = &B10010010
İş 6: Port = &B10000010
İş 7: Port = &B11111000
Case 8: Portd = &B10000000
İş 9: Port = &B10010000
Seçimi bitir

Gözləyir 5

Portc = &B00000001

N4 Case seçin
Case 0: Port = &B11000000
1-ci hal: Port = &B11111001
2-ci hal: Port = &B10100100
3-cü hal: Port = &B10110000
İş 4: Port = &B10011001
İş 5: Port = &B10010010
İş 6: Port = &B10000010
İş 7: Port = &B11111000
Case 8: Portd = &B10000000
İş 9: Port = &B10010000
Seçimi bitir

Gözləyir 5

"Arial","sans serif""> Göstəricidə məlumatları göstərdikdən sonra, əsas proqram dövrəsinə qayıtmalısınız, burada döngəni tamamlamaq və proqramın sonunu qeyd etmək lazımdır.

"Arial","sans serif""> Sonda əldə etdiyimiz budur:

"Arial","sans serif"">

"Arial","sans serif""> Kiçik gecikmə səbəbindən keçid insan gözünə görünməyəcək və biz 1234 tam ədədini görəcəyik.

Mənbə kodunu və layihəni Proteus-da aşağıda yükləyə bilərsiniz:"Arial","sans serif"">

Bəzən bir neçə yeddi seqmentli göstəriciləri və ya bir LED matrisini mikro nəzarətçiyə qoşmaq tələb olunur, məlumatı göstərmək üçün dinamik göstərici istifadə olunur. Dinamik indikasiyanın mahiyyəti indikatorlar üzrə məlumatların ardıcıl əks olunmasıdır. Aşağıdakı diaqram dinamik göstəricini həyata keçirmək üçün bir neçə yeddi seqmentli göstəriciləri (məsələn, ümumi katodla) birləşdirməyə nümunə göstərir, ümumiyyətlə nöqtəni nəzərə alaraq 8 seqment alınır, lakin köhnə üsulla onlar o tərəfə çağırdı. Eyni adlı seqmentlərin bütün nəticələri (anodları) rezistorlar vasitəsilə mikrokontrollerə qoşulan cəmi 8 xətt üçün bir-birinə bağlıdır. Hər bir göstəricinin ümumi katodu tranzistor vasitəsilə mikrokontrollerə qoşulur.


Göstəriş alqoritmi aşağıdakı kimidir: birincisi, birinci indikatorda hansı seqmentlərin yandırılmalı olmasından (soldan sağa) asılı olaraq lazımi məntiqi səviyyələri təyin edirik, açmaq üçün yüksək məntiqi səviyyədə, aşağıdan aşağı seqmenti söndürün. Sonra, tranzistor VT1-in bazasına yüksək məntiqi səviyyə tətbiq edirik, bununla da birinci göstəricinin ümumi katodu ümumi naqillə birləşdirilir, bu anda anodlarında məntiqi vahid olan həmin seqmentlər yanır. vasitəsilə müəyyən vaxt(fasilə) tranzistorun bazasına aşağı məntiq səviyyəsini tətbiq etməklə göstəricini söndürün, sonra ikinci göstərici üçün nəzərdə tutulan çıxış məlumatına uyğun olaraq xətlərdəki məntiq səviyyələrini yenidən dəyişdirin və işəsalma siqnalını işə salın. tranzistor VT2. Beləliklə, dairəvi dövrədə bütün göstəriciləri dəyişdiririk, bu, bütün dinamik göstəricidir.

Fırtınasız möhkəm bir görüntü əldə etmək üçün keçid yüksək sürətlə aparılmalıdır, LED-lərin titrəməsinin qarşısını almaq üçün yeniləmə sürəti 70 Hz və ya daha çox olmalıdır, mən onu adətən 100 Hz-ə təyin edirəm. Yuxarıda göstərilən tikinti üçün fasilə aşağıdakı kimi hesablanır: 100 Hz tezliyi üçün dövr 10 ms-dir, yalnız 4 göstərici var, müvafiq olaraq hər bir göstəricinin parıltı müddəti 10/4 = 2,5 ms olaraq təyin olunur. Bir korpusda çoxrəqəmli yeddi seqmentli göstəricilər var ki, orada eyni adlı seqmentlər korpusun özündə birləşdirilir, təbii ki, onlardan istifadə etmək üçün dinamik göstəricidən istifadə etmək lazımdır.

Dinamik göstəricini həyata keçirmək üçün taymerlərdən birinin daşması zamanı kəsilmələrdən istifadə etmək lazımdır. Aşağıda TMR0 taymerindən istifadə edən koddur:

;4 yeddi seqmentli göstərici üzrə dinamik indikasiyanın həyata keçirilməsi;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; bcf ind1 ;1-ci göstəricini söndürün bcf ind2 ;2-ci göstəricini söndürün bcf ind3 ;3-cü göstəricini söndürün bcf ind4 ;4-cü göstəricini söndürün; incf shet,F ;increment register shet movlw .5 ;registr məzmununu yoxlayın shet xorwf shet,W ;5 btfss STATUS-a bərabər olub olmadığını yoxlayın,Z ; goto met1 ;şet registrindəki nömrə 5 movlw-ə bərabər deyil .1 ;şet registrindəki nömrə 5-dir: 1 movwf shet nömrəsini yazın ;şet registrinə ; met1 movlw .1 ;registr məzmununu yoxlayın shet xorwf shet,W ;1 rəqəminə bərabər btfss STATUS,Z ; goto met2 ;şet registrindəki nömrə 1-ə bərabər deyil: met2-ə keçid movf datind1,W ;şet registrindəki nömrə 1-ə bərabərdir: movwf PORTB-ni köçürün ;datind1 registrinin məzmunu PORTB registrinə bsf ind1 ;1-ci göstəricini yandırın met2 movlw .2 ;registrinin məzmununu yoxlayın xorwf shet,W ;2 btfss STATUS,Z-ə bərabərdir; goto met3 ;shet registrindəki nömrə 2-yə bərabər deyil: met3-ə keçin movf datind2,W ;şet registrindəki nömrə 2-dir: movwf PORTB-ni köçürün ;datind2 registrinin məzmunu PORTB registrinə bsf ind2 ;2-ci göstəricini yandırın goto exxit ;keç label exxit met3 movlw .3 ;registr məzmununu yoxlayın shet xorwf shet,W ;3 btfss STATUS,Z bərabərdir; goto met4 ;shet registrindəki nömrə 3-ə bərabər deyil: met4-ə keç movf datind3,W ;şet registrindəki nömrə 3-dür: movwf PORTB-ni köçürün ;datind3 registrinin məzmunu PORTB registrinə bsf ind3 ;3-cü göstəricini yandırın, keçiddən çıxış; label exxit met4 movf datind4,W ;datind3 registrinin movwf PORTB məzmununu kopyalayın ;PORTB registrinə bsf ind4 ;4-cü göstəricini yandırın; movlw .100 ;taymer registrinə 156 yazın TMR0 movwf TMR0 ; ; movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Əsas proqram ................. movlw b"11010011" ; OPTION_REG, bununla da daxili tənzimləmə; preskaler nisbətini 1:16 təyin etmək; clrf shet; başlamazdan əvvəl reyestr vərəqini sıfırlayın; TMR0 daşqında fasilələr, yerinə yetirildi; clrf datind1 ;clrf datind2-yə məlumat çıxarmaq üçün registrlərin təmizlənməsi ;indikatorlar, bu, clrf datind3-ün söndürülməsinə bərabərdir ;indikatorlar, ümumi clrf datind4 ;katod; bcf INTCON,T0IF ; TMR0 daşqının kəsilməsinin işarəsini təmizləyin bsf INTCON,T0IE ; TMR0 daşqın kəsilməsini aktivləşdirin bsf INTCON,GIE ; qlobal kəsmələri aktivləşdirin; movlw b"00000110" ; 13.52 çıxış nümunəsi movwf datind1 ; movlw b"11001111" ; movwf tarixli2; movlw b"01101101" ; movwf tarixli3; movlwb"01011011" ; movwf tarixli4; ; . ................; ...................; ...................; ; bütün proqramın sonu;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;4 yeddi seqmentli göstərici üçün dinamik indikasiyanın həyata keçirilməsi

;Misal takt tezliyi 4 MHz, maşın dövrü 1 μs

org 0000h ;proqramın icrasına 0000h ünvanında başlayın

Başlat üzərinə gedin; Başlanğıc etiketinə keçin

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Rutini kəsin

org 0004h ;0004h ünvanında alt proqramın icrasına başlayın

movwf W_TEMP ;açar registr dəyərlərini yadda saxla

swapf STATUS,W ;

movwf STATUS_TEMP ;

bcf ind1 ;1-ci göstəricini söndürün

bcf ind2 ;2-ci göstəricini söndürün

bcf ind3 ;3-cü göstəricini söndürün

bcf ind4 ;4-cü göstəricini söndürün

incf shet,F ;increment register shet

movlw .5 ; reyestr vərəqinin məzmununu yoxlayın

xorwf shet,W ; 5-ə bərabərdir

btfss STATUS,Z ;

goto met1 ;registr vərəqindəki nömrə 5-ə bərabər deyil

movlw .1 ;şet registrindəki nömrə 5-dir: 1 nömrəsini yazın

movwf shet ;şeti qeydiyyatdan keçirmək üçün

met1 movlw .1 ; shet registrinin məzmununu yoxlayın

xorwf shet,W ; 1 rəqəminə bərabərdir

btfss STATUS,Z ;

goto met2 ;şet registrindəki nömrə 1-ə bərabər deyil: met2-yə keçin

movf datind1,W ;şet registrindəki nömrə 1-dir: surət

movwf PORTB ; datind1 məzmununu PORTB reyestrinə qeyd edin

bsf ind1 ;1-ci göstəricini yandırın

goto exxit; etiket çıxışına keçin

met2 movlw .2 ; shet registrinin məzmununu yoxlayın

xorwf shet,W ; 2 rəqəminə bərabərdir

btfss STATUS,Z ;

goto met3 ;şet registrindəki nömrə 2-yə bərabər deyil: met3-ə keçid

movf datind2,W ;şet registrindəki nömrə 2-dir: surət

movwf PORTB ; datind2 məzmununu PORTB registrinə qeyd edin

bsf ind2 ;2-ci göstəricini yandırın

goto exxit; etiket çıxışına keçin

met3 movlw .3 ; shet registrinin məzmununu yoxlayın

xorwf shet,W ; 3 rəqəminə bərabərdir

btfss STATUS,Z ;

goto met4 ;şet registrindəki nömrə 3-ə bərabər deyil: met4-ə keçin

movf datind3,W ;şet registrindəki nömrə 3-dür: surət

movwf PORTB ; datind3 məzmununu PORTB registrinə qeyd edin

bsf ind3 ;3-cü göstəricini yandırın

goto exxit; etiket çıxışına keçin

met4 movf datind4,W; datind3 reyestrinin məzmununu kopyalayın

movwf PORTB ;portB reyestrinə

bsf ind4 ;4-cü göstəricini yandırın

exxit bcf INTCON,T0IF ;TMR0 daşma kəsilməsi bayrağını sıfırlayın

movlw .100 ;TMR0 taymer registrinə 156 nömrəsini yazın

swapf STATUS_TEMP,W ; əsas registrlərin məzmununu bərpa edin

swapf W_TEMP,F ;

swapf W_TEMP,W;

retfie; fasilə rejimindən çıxmaq

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Əsas proqram

Start ................. ;registrlərin ilkin qurulması

................. ;xüsusi təyinatlı

.................

bsf STATUS,RP0 ;yazın ikili ədəd Qeydiyyatdan keçmək üçün 11010011

movlw b"11010011" ;OPTION_REG, bununla da daxili parametrləri təyin edin

movwf OPTION_REG ; TMR0 üçün saat mənbəyi

bcf STATUS,RP0 ;TMR0-dan əvvəl əvvəlcədən ölçmə cihazını işə salın

;Ön ölçmə nisbətini 1:16 olaraq təyin edin

clrf shet; başlamazdan əvvəl cədvəl reyestrini sıfırlayın

;daşma kəsilməsi TMR0, yerinə yetirildi

;elektrik işə salındıqdan sonra bir dəfə

clrf datind1 ; məlumatı çıxarmaq üçün registrləri təmizləyin

clrf datind2 ;göstəricilər, off-a bərabərdir

clrf datind3 ;indikatorlar, çünki ümumi olan göstəricilər

clrf datind4 ;katod

bcf INTCON,T0IF ;TMR0 daşma kəsilməsi bayrağını sıfırlayın

bsf INTCON,T0IE ;TMR0 daşqın kəsmələrini aktivləşdirin

bsf INTCON,GIE; qlobal kəsmələri aktivləşdirin

movlw b"00000110" ; 13.52 çıxış nümunəsi

movlw b"11001111" ;

movlw b"01101101" ;

movlwb"01011011" ;

................. ;

................. ;

................. ;

son; bütün proqramın sonu

Əsas proqramda biz əvvəlcə OPTION_REG registrindən istifadə edərək taymer qurduq, əvvəllər üçün taymerlərdən istifadə haqqında danışmışdım. Sonra, hər bir göstərici üçün 1-dən 4-ə qədər bir say daxil etmək üçün nəzərdə tutulmuş cədvəl registrini təmizləyirik. Bu registr kəsmə xidməti rejimində artırılır və orada düzəliş edilir (1-dən 4-ə qədər sayılacaq), beləliklə, bu klirinq enerji işə salındıqdan sonra bir dəfə həyata keçirilir. Bu reyestrə əsasən hansı göstəricinin daxil ediləcəyini müəyyənləşdirəcəyik və ona uyğun olan məlumatları verəcəyik. Növbəti addım məlumat saxlama registrlərini, dörd göstəriciyə uyğun gələn dörd dataind1,2,3,4 registrlərini təmizləməkdir. Təmizləmə indikatorların söndürülməsinə bərabərdir, çünki kəsmə xidməti rejimində bu registrlərin məzmunu göstərici anodlarının qoşulduğu PORTB registrinə köçürülür. Bu, fasilələr işə salındıqdan sonra göstəricilərdə hər hansı bir zibilin görünməməsi üçün lazımdır, prinsipcə, çıxış üçün düzgün məlumat dərhal yazılsa, bunu etmək olmaz. Sonra, taymer daşması kəsilmə bayrağını sıfırlayın, TMR0 daşma kəsmələrini aktivləşdirin və nəhayət qlobal kəsmələri aktivləşdirin.

Kəsmə rejimində ilk növbədə bütün göstəriciləri söndürürük (tranzistorların əsaslarına aşağı məntiq səviyyələri tətbiq etməklə), hansının aktiv olduğu bilinmir. Şət registrini 5 rəqəminə bərabərliyini yoxlayaraq artırırıq, əgər belə bir uyğunluq varsa, 1-dən 4-ə qədər saymaq lazım olduğu üçün reyestrə 1 nömrəsini yazın. Sonra şetdə hansı nömrə olduğunu yoxlayırıq. registr, onun vasitəsilə biz PORTB-dan məlumatları müvafiq göstərici üçün PORTB məlumat saxlama registrlərinə (dataind) yükləyirik və onu işə salırıq. Bundan sonra, TMR0 daşqın kəsilməsi bayrağını sıfırlayırıq, vaxt gecikməsi üçün taymerə 100 nömrəsini yazırıq (bu dəyərin hesablanması aşağıda verilmişdir) və kəsmə işləyicisindən çıxırıq. Birinci fasilədə birinci göstərici açılır, ikinci kəsildikdə, ikincisi və s. dairəvi dövrədə. Əsas proqramda yalnız hər bir göstərici üçün məlumatların saxlama registrlərinə məlumat yükləmək qalır. Kəsmə alt proqramında, əsas registrlərin dəyərlərini saxlamağı və bərpa etməyi unutmayın, bu barədə bir məqalədə yazdım.

Nömrələri çıxarmaq üçün verilənlər cədvəli şəklində simvol generatorundan istifadə etmək daha yaxşıdır. Məsələn, göstəricilərdə 3456 nömrəsini göstərmək üçün rəqəmlərə bölünməlidir, rəqəmlərin nömrələrini (0-dan 9-a qədər) saxlamaq üçün ayrıca registrlərdən istifadə etmək daha yaxşıdır, sonra bu registrləri simvol generatoru vasitəsilə işə salın və bununla da müvafiq seqmentləri alovlandırmaq üçün düzgün baytların əldə edilməsi (verilənlər və registrlərə yüklənir).

Saat generatorunun tezliyini 4 MHz olaraq alacağıq, maşın dövrü 1 μs-dir. Hər bir göstəricinin yeniləmə sürəti 100 Hz (dövr T = 10 ms) olsun, müvafiq olaraq tələb olunan vaxt gecikməsi 10/4 = 2,5 ms-dir. TMR0 üçün qabaqcadan ölçmə faktoru 1:16 olaraq təyin edilib, maksimum mümkün gecikmə isə 256x16 = 4096 µs-dir və bizə 2,5 ms fasilə lazımdır. TMR0-a yazmaq üçün rəqəmi hesablayaq: 256-((256x2.5)/4.096) = 256-156.25 = 99.75. Yuvarlaqlaşdırdıqdan sonra 100 rəqəmini alırıq.

Aşağıda PIC16F628A mikro nəzarətçisindən istifadə edərək ümumi katodlu 4 rəqəmli göstəricidə dinamik göstəricinin həyata keçirilməsi ilə Proteus proqramı, proqram təminatı və mənbə kodu üçün bir model yükləyə bilərsiniz. Məsələn, göstəricidə 0000 rəqəmləri göstərilir; 0001; 0002; 13.52; 9764.

İndi 8x8 piksel (LED) qətnamə ilə matrisi birləşdirməyi düşünün. Bir matrisin strukturu adətən satırlar və sütunlar baxımından nəzərə alınır. Aşağıdakı şəkildə, hər sütunda, bütün LED-lərin katodları, hər bir cərgədə isə anodlar birləşdirilir. Simlər (8 sətir, LED anodlar) mikrokontrollerə rezistorlar vasitəsilə bağlanır. Hər bir sütun (LED katodları) 8 tranzistor vasitəsilə mikrokontrollerə qoşulur. Göstəriş alqoritmi eynidır, əvvəlcə sətirlərdə lazımi məntiqi səviyyələri təyin edirik, buna uyğun olaraq LED-lərin sütunda yanması lazımdır, sonra birinci sütunu bağlayırıq (göstəriş soldan sağa). Müəyyən bir fasilədən sonra sütunu söndürürük və ikinci sütunu göstərmək üçün sətirlərdəki məntiqi səviyyələri dəyişdiririk, sonra ikinci sütunu birləşdiririk. Və beləliklə alternativ olaraq bütün sütunları dəyişdirin. Aşağıda matrisin mikrokontrollerə qoşulması diaqramı verilmişdir.


Ümumilikdə, belə bir matrisi birləşdirmək üçün 16 mikrokontroller sancağı tələb olunur, bu olduqca çoxdur, buna görə də idarəetmə xətlərini azaltmaq üçün serial sürüşmə registrlərindən istifadə etmək daha yaxşıdır.

Ən çox yayılmış seriyalı registr 74HC595 mikrosxemdir, məlumatların yüklənməsi üçün sürüşmə registrini və məlumatların çıxış xətlərinə ötürülməsi üçün saxlama registrini ehtiva edir. Məlumatların ona yüklənməsi sadədir, SH_CP saat girişində məntiqi 0-ı təyin edin, sonra DS məlumat girişində lazımi məntiq səviyyəsini təyin edin, bundan sonra səviyyə dəyərini saxlayarkən saat girişini 1-ə keçirik (DS girişində) növbə registrinin daxilində. Eyni zamanda, məlumatlar bir bit ilə dəyişdirilir. SH_CP çıxışını yenidən 0-a sıfırlayın, DS girişində tələb olunan səviyyəni təyin edin və SH_CP-ni 1-ə qaldırın. Sürüşmə registri tam yükləndikdən sonra (8 bit), ST_CP çıxışını 1-ə təyin edin, bu anda məlumatlar ötürülür. saxlama registri və Q0 ... Q7 çıxış xətlərinə qidalanır, bundan sonra biz ST_CP çıxışını sıfırlayırıq. Ardıcıl yükləmə zamanı məlumatlar Q0-dan Q7-yə köçürülür. Pin Q7' sürüşmə registrinin son bitinə qoşulur, bu pin ikinci mikrosxemin girişinə qoşula bilər, beləliklə, məlumatları bir anda iki və ya daha çox mikrosxemə yükləyə bilərsiniz. OE pininə məntiq 1 tətbiq edildikdə çıxış xətlərini üçüncü (yüksək müqavimətli) vəziyyətə keçir.MR pin keçid registrini sıfırlamaq, yəni registr tetikleyicilərinin çıxışlarında aşağı məntiq səviyyələrini təyin etmək üçün nəzərdə tutulmuşdur. səkkiz sıfırın yüklənməsinə bərabərdir. Aşağıda başlanğıcda sıfırların olması şərtilə Q0 ... Q7 çıxış xətlərində 11010001 dəyərini təyin edən 74NS595 mikrosxeminə məlumatların yüklənməsi diaqramı verilmişdir:


İki 74HC595 sürüşmə registrindən istifadə edərək 8×8 matrisi PIC16F628A mikro nəzarət cihazına qoşmağı düşünün, diaqram aşağıda göstərilmişdir:


Məlumat DD2 çipinə yüklənir (sətirlərdə məntiq səviyyəsinə nəzarət, LED anodları), sonra Q7 pinindən DD3-ə (sütun nəzarəti) ötürülür, müvafiq olaraq sütunu aktivləşdirmək üçün əvvəlcə baytı, sonra baytı yükləyirik. sətirlərdəki məntiqi səviyyələrlə. Matris sütunlarını dəyişdirən tranzistorlar (LED katodları) DD3-ün çıxış xətlərinə qoşulur. Şəkili matrisdə göstərmək üçün proqram kodu aşağıdadır:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;8x8 ayırdetmə qabiliyyətinə malik matris üçün dinamik indikasiyanın həyata keçirilməsi ;Saat generatorunun tezliyi, məsələn, 4 MHz, maşın dövrü 1 µs org 0000h ;proqramın icrasına 0000h ünvanından başlayın Start ;Başlat etiketinə keçin ;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Rutini kəsin org 0004h ;alt proqramın icrasına 0004h movwf W_TEMP ünvanından başlayın ;açar registr dəyərlərini yadda saxlayın swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; ; movwf FSR_osn ;FSR_osn reyestrinə movf FSR_prer,W ;əvvəllər saxlanmış dəyərin movwf FSR ;FSR_prer registrindən FSR registrinin ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;stolb registrinin məzmununu çipə yükləyin movf stolb,W ;stolb registrinin məzmununu movwf var ;registrinə var met2 btfsc var,0 ;çıxış ds-i btfss var,0-a uyğun olaraq təyin edin; bcf ds; bcf sh_cp ; rrf var,F ;Shift registri var hazırlamaq hüququ;növbəti bit getdi met2 ;scetbit sıfıra bərabər deyil: met2 etiketinə keçid;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;INDF registrinin məzmununu çipə yükləyin;74HC595 (seriyalı sürüşmə registri) movf INDF,W ;INDF registrinin məzmununu movwf var ;var registrinə köçürün movlw .8 ;sketbit registrinə 8 rəqəmini yazın, movwf scetbit hesablanması üçün ;transfer bitləri met1 btfsc var ,7 ;bsf ds uyğun olaraq çıxış ds təyin edin ;registrin 7-ci bitinin dəyəri var btfss var,7 ; bcf ds; bsf sh_cp ;saat sh_cp çıxışı məlumatı bağlamaq üçün bcf sh_cp ; rlf var,F ;Shift registri var hazırlamaq üçün sol;növbəti bit decfsz scetbit,F ;Registr şərti ilə azalma scetbit goto met1 ;scetbit sıfıra bərabər deyil: met1 etiketinə keçin ; bsf st_cp ; yüklənmiş bcf st_cp ; baytları 74HC595 çiplərinin çıxış xətlərinə ötürmək üçün st_cp çıxışını saatla ; bcf STATUS,C ;söndürmədən əvvəl registr statusunun C bitini sıfırlayın rrf stolb,F ;left shift register stolb ; incf FSR,F ;FSR registrini artırın, növbətini hazırlayın ;Məlumatı 74HC595 decfsz shet,F-ə göndərmək üçün qeydiyyatdan keçin ;Registr şərti shet ilə azalma exxit ;Shet registr 0-a bərabər deyil: Çıxışa keçin movlw data1 ;Shet registri 0-a bərabərdir: İlk ünvanı yazın movwf FSR ;FSR registrində məlumat saxlamaq üçün qeydiyyat movlw .8 ;Movwf shet saxlamaq üçün 8 rəqəminin şet registrinə yazılması ;Sütunların hesablanması ; exxit bcf INTCON,T0IF ;daşma kəsilməsi bayrağını sıfırla TMR0 movlw . 124 ;taymer registrinə 124 nömrəsini yazın TMR0 movwf TMR0 ; ; movf FSR,W ;FSR-nin cari dəyərini yadda saxlayın movwf FSR_prer ;To FSR_prer movf FSR_osn ,W ;Əvvəlcə saxlanmış movwf FSR dəyərini bərpa edin ;FSR-dən FSR_osn ; swapf STATUS_TEMP,W ; əsas registrlərin məzmununu bərpa edin movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W; ; retfie ;kesinti alt proqramından çıxmaq;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Əsas proqram Başlanğıc ................ ;Registrlərin ilkin qurulması ................. ;Xüsusi təyinatlı..... ............ bsf STATUS,RP0 ;11010011 ikili nömrəsini movlw b"11010010" ;OPTION_REG registrinə yazın, bununla da daxili movwf OPTION_REG ;saat mənbəyini TMR0 bcf STATUS,RP0 təyin edin ;öncədən ölçməni aktivləşdirin TMR0; preskaler nisbətini 1:8 təyin edin; movlw .8 ;movwf shet-ə başlamazdan əvvəl shet registrinə 8 nömrəsini yazın, movwf shet ;tmr0 daşması kəsilir, icra edilir;bir dəfə, movlw b"10000000" işə salındıqdan sonra ;movwf stolb registrinə 10000000 binar nömrəsini yazın, aktiv etmək üçün ;stolb1st sütunu; is gücü işə saldıqdan sonra bir dəfə həyata keçirilir; movlw data1 ;Birinci registrin ünvanını (saxlama registrləri movwf FSR_prer ;məlumat) FSR_prer registrinə yazın, yerinə yetirildi; işə salındıqdan bir dəfə sonra; movlw .8 ;movwf tmp-ə məlumat çıxışının 8 registrinin təmizlənməsi ;matris, movlw data1-in söndürülməsinə ekvivalent ;matris movwf FSR ; met3 clrf INDF; incf FSR,F ; decfsz tmp,F ; get met3 ; ; bcf INTCON,T0IF ; TMR0 daşqının kəsilməsinin işarəsini təmizləyin bsf INTCON,T0IE ; TMR0 daşqın kəsilməsini aktivləşdirin bsf INTCON,GIE ; qlobal kəsmələri aktivləşdirin; m1 movlw data1;R çıxış nümunəsi movwf FSR; movlw b"00000000" ; movwf INDF; incf FSR,F ; movlw b"01111111" ; movwf INDF; incf FSR,F ; movlwb"00001001" ; movwf INDF; incf FSR,F ; movlwb"00011001" ; movwf INDF; incf FSR,F ; movlwb"00101001" ; movwf INDF; incf FSR,F ; movlw b"01000110" ; movwf INDF; incf FSR,F ; movlw b"00000000" ; movwf INDF; incf FSR,F ; movlw b"00000000" ; movwf INDF; ; ...................; ...................; ...................; ; bütün proqramın sonu;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;8x8 ayırdetmə qabiliyyəti olan matris üçün dinamik indikasiyanın həyata keçirilməsi

;Misal takt tezliyi 4 MHz, maşın dövrü 1 μs

org 0000h ;proqramın icrasına 0000h ünvanında başlayın

Başlat üzərinə gedin; Başlanğıc etiketinə keçin

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Rutini kəsin

org 0004h ;0004h ünvanında alt proqramın icrasına başlayın

movwf W_TEMP ;açar registr dəyərlərini yadda saxla

swapf STATUS,W ;

movwf STATUS_TEMP ;

movf FSR,W ;FSR registrinin cari dəyərini yadda saxlayın

movwf FSR_osn ;FSR_osn reyestrinə

movf FSR_prer,W ; əvvəllər saxlanmış dəyəri bərpa edin

movwf FSR ;FSR_prer-dən FSR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (seriyalı sürüşmə qeydiyyatı)

movf stolb,W; stolb reyestrinin məzmununu kopyalayın

movwf var ;var qeydiyyatdan keçmək

movlw .8 ;saymaq üçün sketbit registrinə 8 nömrəsini yazın

movwf scetbit; ötürülən bitlər

met2 btfsc var,0 ;a uyğun olaraq ds çıxışını təyin edin

bsf ds ;registrinin 7-ci bit dəyəri var

bsf sh_cp ;məlumatları bağlamaq üçün saat sh_cp çıxışı

rrf var,F ; kaydırma registrini var hazırlamaq hüququ

;növbəti bit

decfsz scetbit,F ;sketbit registrinin şərti ilə azalma

goto met2 ;scetbit sıfıra bərabər deyil: met2 etiketinə keçin

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (seriyalı sürüşmə qeydiyyatı)

movf INDF,W; INDF reyestrinin məzmununu kopyalayın

movwf var ;var qeydiyyatdan keçmək

movlw .8 ;saymaq üçün sketbit registrinə 8 nömrəsini yazın

movwf scetbit; ötürülən bitlər

met1 btfsc var,7 ;a uyğun olaraq ds çıxışını təyin edin

bsf ds ;registrinin 7-ci bit dəyəri var

bsf sh_cp ;məlumatları bağlamaq üçün saat sh_cp çıxışı

rlf var,F ;hazırlamaq üçün sola sürüşdürün

;növbəti bit

decfsz scetbit,F ;sketbit registrinin şərti ilə azalma

goto met1 ;scetbit sıfıra bərabər deyil: met1 etiketinə keçin

bsf st_cp ;yüklənmiş ötürmək üçün st_cp çıxışını saat

bcf st_cp ;74HC595 çıxış xətləri üçün bayt

bcf STATUS,C ; yerdəyişmədən əvvəl status registrinin C bitini təmizləyin

rrf stolb,F ;sola sürüşmə qeydiyyatı stolb

incf FSR,F ;FSR reyestrini artırın, növbətini hazırlayın

74HC595-ə məlumat göndərmək üçün qeydiyyatdan keçin

decfsz shet,F ;registr şərti cədvəli ilə azalma

goto exxit ;shet reyestri 0-a bərabər deyil: çıxışa keçid

movlw data1 ;shet registri 0-dır: birincinin ünvanını yazın

movwf FSR ;FSR-də məlumat saxlamaq üçün qeydiyyatdan keçin

movlw .8 ;istinad üçün shet registrinə 8 nömrəsini yazın

movwf vərəqi ;sütun sayır

movlw b"10000000" ;ikilik rəqəmi 10000000-a yazın

movwf stolb ;1-ci sütunu daxil etmək üçün stolb-u qeyd edin

exxit bcf INTCON,T0IF ;TMR0 daşma kəsilməsi bayrağını sıfırlayın

movlw .124 ;TMR0 taymer registrinə 124 nömrəsini yazın

movf FSR,W ;FSR registrinin cari dəyərini yadda saxlayın

movwf FSR_prer ;FSR_prer reyestrinə

movf FSR_osn ,W ; əvvəllər saxlanmış dəyəri bərpa edin

movwf FSR ;FSR_osn-dan FSR

swapf STATUS_TEMP,W ; əsas registrlərin məzmununu bərpa edin

swapf W_TEMP,F ;

swapf W_TEMP,W;

retfie; fasilə rejimindən çıxmaq

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Əsas proqram

Start ................. ;registrlərin ilkin qurulması

................. ;xüsusi təyinatlı

.................

bsf STATUS,RP0 ;qeydiyyatdan keçmək üçün 11010011 ikili nömrəsini yazın

movlw b"11010010" ;OPTION_REG, bununla da daxili

movwf OPTION_REG ; TMR0 üçün saat mənbəyi

bcf STATUS,RP0 ;TMR0-dan əvvəl əvvəlcədən ölçmə cihazını işə salın

;Ön ölçmə nisbətini 1:8 olaraq təyin edin

movlw .8 ;çalışmazdan əvvəl shet registrinə 8 nömrəsini yazın

movwf shet ; TMR0 daşması kəsilir, işləyir

;elektrik işə salındıqdan sonra bir dəfə

movlw b"10000000" ;ikilik rəqəmi 10000000-a yazın

movwf stolb ;1-ci sütunu daxil etmək üçün stolb-u qeyd edin

Hər bir sütunun sətirləri üçün məntiqi səviyyələri olan məlumatlar 8 informasiya saxlama registrində saxlanılır, onlara daxil olur. Birinci registrin ünvanı data1 adlanır. Shet və stolb registrlərinin ilkin yazılmasından əlavə, ilk məlumat saxlama registrinin ünvanını FSR_prer registrinə yazmaq lazımdır (registr data1-dir, FSR_prer-də qeyd bir dəfə yerinə yetirilir, sonra o, registrdə düzəliş edilir. işləyici), yalnız bundan sonra TMR0 daşqın kəsmələrinə icazə verin.

Fasilələri işə salmazdan əvvəl məlumat saxlama registrlərini təmizləmək məsləhətdir, bu əməliyyat əlavə tmp registrindən (sayğac kimi) və dolayı ünvanlamadan istifadə etməklə həyata keçirilir, klirinq matrisin söndürülməsinə bərabərdir.

Kəsmələrin idarə olunması qaydasında biz stolb registrinin məzmununu DD2 çipinə yükləyirik (kesintiləri işə saldıqdan sonra ilk dəfə registrdə yuxarıda qeyd edildiyi kimi 10000000 rəqəmi var). Yükləmə, yükləndikcə Q0-dan Q7-yə (DD2 çipinin daxilində) istiqamətdə dəyişən stolb registrinin aşağı bitindən başlayır, yükləmə alqoritmi yuxarıda müzakirə olundu, məncə kodu başa düşmək çətin olmayacaq. . Sonra, INDF registrinin məzmununu DD2-yə yükləyirik, bu, ünvanı FSR-də olan məlumat saxlama registrlərindən biridir (kesintiləri işə saldıqdan sonra işləyiciyə ilk dəfə daxil olduqda, FSR-də birincinin ünvanı var. data1) adlanan informasiya saxlama registridir. Yükləmə INDF registrinin yüksək bitindən başlayır. Nəzərə alınan 2 baytı yüklədikdən sonra st_cp çıxışını saatlayırıq, bununla da yüklənmiş məlumatlar DD2, DD3 mikrosxemlərinin çıxış xətlərinə ötürülür. Beləliklə, işləyiciyə ilk girişdə məlumatların1 registrinin məzmununa uyğun olaraq anodlarında yüksək məntiq səviyyəsi olan LED-lərin yandığı matrisin birinci sütunu dəyişdirilir. ilk məlumat saxlama reyestri).

Sonra, matrisin ikinci sütununu kəsmə işləyicisinə növbəti girişdə keçid üçün hazırlamaq üçün stolb registrini bir bit sağa sürüşdürürük. Növbədən əvvəl STATUS registrinin C bayrağı silinməlidir, çünki yerdəyişmə bu bayraq vasitəsilə baş verir və yerdəyişmə zamanı onun vəziyyəti məlum deyil. Növbədən sonra biz ikinci sütun üçün məntiqi sıra səviyyələri ilə növbəti saxlama registrini (data1 registrindən sonra) hazırlayaraq FSR registrini artırırıq. Bundan sonra, biz shet registrini şərtlə azaldırıq və əgər sıfıra bərabər deyilsə, TMR0 daşqın kəsilməsi bayrağını yenidən qurun, nömrəni taymerə yazın və kəsmə işləyicisindən çıxın.

Növbəti dəfə işləyiciyə daxil olduqda, matrisin ikinci sütunu işə salınacaq və s. Shet registrini sıfırladıqda (8-ci sütunu dəyişdirdikdən sonra) sütunların dəyişdirilməsinin növbəti dövrü üçün ona 8 nömrəsi yazılır, əlavə olaraq, stolb registrinin dəyəri düzəldilir, ilk məlumat saxlama registrinin ünvanı ( data1) FSR reyestrinə yazılır.

TMR0 taymeri üçün vaxt gecikməsini hesablayaq, takt tezliyi 4 MHz, maşın dövrü 1 μs-dir. LED-lərin titrəməsinin qarşısını almaq üçün hər bir sütunun yeniləmə sürətini 100Hz (dövr T=10ms) götürək, gecikmə vaxtı 10/8 = 1,25 ms-dir. Maksimum mümkün gecikmə 256x8 = 2048 µs olduğu halda, əvvəlcədən ölçmə nisbətini TMR0 1:8 olaraq təyin etdik. 1,25 ms fasilə üçün taymer (256x1,25) / 2,048 = 156,25 dəfə saymalıdır, yuvarlaqlaşdıraraq 156 say alırıq. Müvafiq olaraq, taymerə 256-156 = 100 rəqəmini yazmaq lazımdır.Lakin bu, tamamilə düzgün qiymət deyil, çünki kəsmə rejimini yerinə yetirmək üçün bir az vaxt lazımdır, bu halda təxminən 190 µs vaxt tələb olunur, nəzərə alınmaqla yenidən hesablanır. prescaler əmsalını nəzərə alsaq, 190/8 = 23,75 və ya 24 say alırıq. TMR0-a yazmaq üçün düzgün dəyər: 100+24=124.

Əsas proqramda matrisdə göstərmək istədiklərimizə uyğun olaraq 8 məlumat saxlama registrini yazırıq. Aşağıda yuxarıdakı kod üçün matrisə məlumatın çıxışını izah edən diaqram verilmişdir.


Dəyişən registrlərə əlavə olaraq, yeddi seqmentli göstəricilər və LED matrisləri haqqında məlumatların göstərilməsi üçün ixtisaslaşmış sürücülər var, bu halda sürücü özü dinamik göstəricini həyata keçirir, qalan yalnız onu göstərmək üçün məlumat göndərməkdir. Bu məşhur sürücülərdən birini haqqında bir məqalədə nəzərdən keçirdim.

Linkin altında iki 74HC595 sürüşmə registrindən istifadə edərək 8x8 matrisdə dinamik göstəricinin həyata keçirilməsi ilə PIC16F628A mikro nəzarətçi üçün proqram təminatı və mənbə kodunu yükləyə bilərsiniz, əlaqə diaqramı yuxarıda müzakirə edilmişdir. R, L hərfləri, 46 rəqəmi, gülüş və sadəcə xaç şəklində olan naxış növbə ilə matrisdə göstərilir, bu animasiya aşağıdakı videoda göstərilir.

etiketləri ilə, . Oxuyun.