0% found this document useful (0 votes)
23 views9 pages

01 Maruza

Uploaded by

rashdiro
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
23 views9 pages

01 Maruza

Uploaded by

rashdiro
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 9

01-maruza.

7 segment displeyga ma’lumot chiqarish

Raqamli, sonli ma’lumotlarni aks ettirishda, ayniqsa, segment displeylar juda


ko’p qo’llaniladi. Kalkulator, kir yuvish mashinasi, elektron soat, konditsioner va
hokazolarda uni ko’p uchratganmiz. Ushbu darsda uning qanday ishlashini
o’rganib chiqamiz.

Uni 7 segmentli indikator deb ham atashadi. Bunga sabab u 7 ta svetadioddan


tuzilgan. Ba’zi turlarida nuqtani aks ettirish uchun qo’shimcha 8-svetadiod bo’ladi.
Svetadiodlarning har xil kombinatsiyada yonishi har xil belgi va raqamlarni aks
ettiradi. Masalan 7 ta svetadiod baravar yonsa, ‘ 8 ‘ raqami paydo bo’ladi.
O’rtadagi svetadiod o’chirilsa, ‘ 0 ‘ paydo bo’ladi va hokazo.

7 segmentli indikatorlar 2 xil bo’ladi: umumiy anodli va umumiy katodli:


Yuqoridagi rasmda bu 2 xil indikator keltirilgan. Shuningdek, bu rasmda siz
svetadiodlarning shartli ravishda harflar bilan nomlanishini ham ko’rib turibsiz. Bu
keng tarqalgan qulay usul. 1 raqamini aks ettirish uchun b va c ni yoqish kerak
bo’lsa, 2 raqami uchun a, b, d, e, g larni yoqish kerak va hokazo.

Umumiy anodli va umumiy katodli indikatorlarning farqini tushunish uchun 3


yoki 4 ta svetadiodlarni shu 2 xil uslubda ulab, yoqib-o’chirib ko’rishingiz
mumkin. Shunda svetadiodlarni 0 berib ham yoqish mumkinligini tushunib olasiz.

Umumiy katodli indikatorni arduinoga ulash sxemasi:

Qarshilik 220Ω bo’lgani yaxshi. Lekin 100 Ω ham bo’ladi. Bunda ravshanlik
ortadi. Qarshiliksiz ham ishlatish mumkin, lekin segmentlarning yorqinligi oshib
g’ashingizga tegadi. Endigi vazifa shuki, a, b, c, d, e, f, g va h ni belgilab olish.
Agar sxema xuddi rasmdagidek yig’ilgan bo’lsa, quyidagilar mos keladi:

int a=7;// digital pin 7 segment a uchun


int b=6;// digital pin 6 segment b uchun
int c=5;// digital pin 5 segment c uchun
int d=10;// digital pin 10 segment d uchun
int e=11;// digital pin 11 segment e uchun
int f=8;// digital pin 8 segment f uchun
int g=9;// digital pin 9 segment g uchun
int h=4;// digital pin 4 segment h uchun
Endi siz xohlagan raqamingizni aks ettira olasiz
7 segmentga raqamni knopka orqali sanash qurilmasini ko’rib chiqamiz:
Kerakli anjomlar:

 Arduino UNO platasi


 4-belgili umumiy anodli 7 – segmentli display
 4 ta tranzistor PNP ( 2SA1015 , 2S9015 , 2N3906 …)
 Резистор 7 х 100 Ом
 4 х 4,7 кОм резистор
 knopka
 maket plata
 simchalar

Knopka Arduino platasini A0 kirishiga ulanadi. Bu displeydagi sonlarni


oshirish uchun xizmat qiladi. Biz ko’rayotgan misolda umumiy anodli 7 segmentli
displeyda sonlarning oshishini ko’rsatib turadi. Bu sxemaga 4 ta PNP tipli
tranzistorlar ham ishtirok etgan. Bunda tranzistorning kollektor elektrodi
displeydagi har bir raqamning umumiy anodli kirishini ulab berishga xizmat qiladi.
Har bir transistor displeydagi har bir segmentni ko’rsatib turadi.

4 ta transistor displeydagi svetodiodni yonishi uchun kerakli manba toki uchun


foydalanishga yetarli, chunki Arduino (ATmega 328P) mikrokontrolleri
tranzistorsiz uddalay olmaydi (maksimal chiqish toki 40 mA ni tashkil etadi).
Tranzistorning har bir emitter elektrodi arduino platasining +5 V manbaiga ulanadi.
Kollektor elektrodlari esa Arduino platasining raqamli portlariga 4.7 kOm resistor
bilan birgalikda ulanadi.

Sxemadagi 100 Omli rezistorlar svetodiodli segmentga borayotgan ortiqcha


tokni chegaralash uchun ishlatiladi.

Endi Arduinoda kodlarni ko’rib chiqamiz. 4 ta segmentdan


foydalanayotganimiz uchun bizga displeyni juda tez yangilash zaruriyati tug’iladi.
(har bir raqam tasvirlanganda qolganlari o’chiq holatda bo’ladi). Shuning uchun
Timer1 uzilish modulidan foydalanamiz.

// Timer1 module overflow interrupt configuration


TCCR1A = 0;
TCCR1B = 1; // enable Timer1 with prescaler = 1 ( 16 ticks each 1 µs)
TCNT1 = 0; // set Timer1 preload value to 0 (reset)
TIMSK1 = 1; // enable Timer1 overflow interrupt

Yuqorida tavsiflangan konfiguratsiyada Timer1 modul har 4096


mikrosekundda (4096 = 65536 / 16) to’ldirib turadi, bu yangilanish bir me’yorda
bo’ladi.

E’tibor berilishi kerak bo’lgan jihat bu Timer1 modul 16 bitli taymerdir,


dastlabki signal 1 (TCCR1B = 1) va Arduino UNOning taktoviy chastotasi 16
MHz.

// hisoblagich knopkasini aniqlash


#define button A0

// segment pinlarini aniqlash


#define SegA 12
#define SegB 11
#define SegC 10
#define SegD 9
#define SegE 8
#define SegF 7
#define SegG 6

// 4 ta raqamning umumiy pinlarini aniqlash


#define Dig1 5
#define Dig2 4
#define Dig3 3
#define Dig4 2

// o’zgaruvchan qiymatlar
byte current_digit;
int count = 0;

void setup()
{
pinMode(button, INPUT_PULLUP);
pinMode(SegA, OUTPUT);
pinMode(SegB, OUTPUT);
pinMode(SegC, OUTPUT);
pinMode(SegD, OUTPUT);
pinMode(SegE, OUTPUT);
pinMode(SegF, OUTPUT);
pinMode(SegG, OUTPUT);
pinMode(Dig1, OUTPUT);
pinMode(Dig2, OUTPUT);
pinMode(Dig3, OUTPUT);
pinMode(Dig4, OUTPUT);

disp_off(); // displayni o’chirish

// Timer1 modulini to’xtalish konfiguratsiyasi


TCCR1A = 0;
TCCR1B = 1; // enable Timer1 with prescaler = 1 ( 16 ticks each 1 µs)
TCNT1 = 0; // set Timer1 preload value to 0 (reset)
TIMSK1 = 1; // enable Timer1 overflow interrupt

ISR(TIMER1_OVF_vect) // Timer1 interrupt service routine (ISR)


{
disp_off(); // turn off the display

switch (current_digit)
{
case 1:
disp(count / 1000); // prepare to display digit 1 (most left)
digitalWrite(Dig1, LOW); // turn on digit 1
break;

case 2:
disp( (count / 100) % 10); // prepare to display digit 2
digitalWrite(Dig2, LOW); // turn on digit 2
break;

case 3:
disp( (count / 10) % 10); // prepare to display digit 3
digitalWrite(Dig3, LOW); // turn on digit 3
break;

case 4:
disp(count % 10); // prepare to display digit 4 (most right)
digitalWrite(Dig4, LOW); // turn on digit 4
}

current_digit = (current_digit % 4) + 1;
}

// main loop
void loop()
{
if(digitalRead(button) == 0)
{
count++; // increment 'count' by 1
if(count &gt: 9999)
count = 0;
delay(200); // wait 200 milliseconds
}
}

void disp(byte number)


{
switch (number)
{
case 0: // print 0
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, HIGH);
break;

case 1: // print 1
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;

case 2: // print 2
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
break;

case 3: // print 3
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
break;

case 4: // print 4
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 5: // print 5
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 6: // print 6
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 7: // print 7
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;

case 8: // print 8
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;

case 9: // print 9
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
}
}

void disp_off()
{
digitalWrite(Dig1, HIGH);
digitalWrite(Dig2, HIGH);
digitalWrite(Dig3, HIGH);
digitalWrite(Dig4, HIGH);
}
// end of code.
Topshiriqlar:

Arduino platasiga segment, bitta knokpa va bitta svetodiod ulang. Qurilmaga


sanash dasturini tuzing va variant asosida qurilmani boshqaring.

Variant Topshiriq Variant Topshiriq

1, 11 Qurilma 10 gacha sanaganda 6, 16 Qurilma tub sonlar kelsagina


svetodiod yonsin va sanash svetodiod yonsin, aks holda
qaytadan boshlansin. o’chiq tursin.

2, 12 Qurilma 15 gacha sanaganda 7, 17 Qurilma har 10 taga kelsa


svetodiod yonsin va sanash svetodiod bir o’chib yonsin
orqaga qarab boshlansin.

3, 13 Qurilma 10 gacha sanaganda 8, 18 Qurilma 20 gacha sanaganda


svetodiod yonsin va sanash svetodiod 2 marta ochib
qaytadan ikkitadan sanash (1, yonsin va sanash orqaga
3, 5, 7, 9)ni boshlasin. qarab boshlansin

4, 14 Qurilma juft sonlar kelsagina 9, 19 Qurilma tub sonlar kelsagina


svetodiod yonsin, aks holda svetodiod o’chsin, aks holda
o’chiq tursin. yoniq tursin.

5, 15 Qurilma toq sonlar kelsagina 10, 20 Qurilma har 33 taga kelsa


svetodiod yonsin, aks holda svetodiod bir o’chib yonsin
o’chiq tursin.

You might also like