|
[ AvramKovacevic @ 17.08.2016. 12:28 ] @
| Pozdrav!
U želji da naučim više izbegao sam MAX7219 i LedControl biblioteku napisanu za taj integralac i rešio da sam isprogramiram kontrolisanje dvocifrenog(po istom principu i sa više cifara) 7 segmentnog displeja sa zajedničkom katodom. :)
Ranije sam uspešno napisao program za direktno kontrolisanje jednocifrenog, a sada se pojavila potreba za više cifara..
Direktno sam povezao segmente sa otpornicima na Arduino pinove 6-12, spojio sam segmente 1. i 2. displeja, a GND 1 i 2 na tranzistore koji bi vršili ulogu prekidača, baze tranzistora na pinove 4 i 5 na Arduinu, (slika 1 u prilogu);
Poznat mi je termin multipleksiranje, ali mi nije najjasnije kako bi trebalo da izgleda napisan kod za to.. palo mi je na pamet, a kasnije sam nasao na netu da je to ispravan način da se, ukoliko je željeni broj dvocifren, broj razlaže na 2 cifre(deseticu i jedinicu) i program ukljucuje zeljene pinove prve i uz kratki delay() "prebacuje" na programiranje druge cifre.. tako da je za ljudsko oko neprimetno da je postojala pauza izmedju ispisa obe cifre.
Evo mog koda:
Code:
int gnd1=5;
int gnd2=4;
int segmenti=[7]={12,11,10,9,8,7,6};
byte kombinacije[10][7]= {
{1,1,1,1,1,1,0},
{0,1,1,0,0,0,0},
{1,1,0,1,1,0,1},
{1,1,1,1,0,0,1},
{0,1,1,0,0,1,1},
{1,0,1,1,0,1,1},
{1,0,1,1,1,1,1},
{1,1,1,0,0,0,0},
{1,1,1,1,1,1,1},
{1,1,1,1,0,1,1}
};
void setup() {
for(int i=4;i<13;i++)
pinMode(1,OUTPUT);
Serial.begin(9600);
}
void loop() {
while(Serial.available()==0){};
int broj=Serial.parseInt();
if(broj<10){
digitalWrite(gnd1,LOW);
digitalWrite(gnd2,HIGH);
for(int c=0;c<7;c++)
digitalWrite(segmenti[c],kombinacije[broj][c]);
}
}
Sada mi je nejasno ako je broj dvocifren kako da se program prebaci na uredjivanje 2 cifre a da pri tom prva cifra ostane uključena, jer ako izvršim: digitalWrite(gnd1,HIGH); digitalWrite(gnd2,LOW); prva cifra se totalno isključuje.
Nadam se da sam jasno izlošio svoj problem. Ispravite me ako negde grešim. Veliko hvala unapred!
[Ovu poruku je menjao AvramKovacevic dana 17.08.2016. u 13:41 GMT+1] |
[ bogdan.kecman @ 17.08.2016. 15:17 ] @
Citat: AvramKovacevic: Pozdrav!
Sada mi je nejasno ako je broj dvocifren kako da se program prebaci na uredjivanje 2 cifre a da pri tom prva cifra ostane uključena, jer ako izvršim: digitalWrite(gnd1,HIGH); digitalWrite(gnd2,LOW); prva cifra se totalno isključuje.
i treba da bude iskljucena, to je poenta multipleksiranja
petlja:
ugasene obe cifre
postavis 8 bita za cifru1
upalis cifru1
cekas neko vreme
ugasis cifru1
postavis 8 bita za cifru2
upalis cifru 2
cekas neko vreme
goto petlja
neko vreme je 10-50ms zavisno od toga koliko imas cifara..
[ AvramKovacevic @ 17.08.2016. 17:21 ] @
Hvala ti prijatelju, uspeo sam.
Ja nisam uzeo u obzir da je sve pod petljom te da se vrti u krug(loop) i samim tim se neće zauvek katoda isključiti jer će se uključiti več u sledećem krugu a taj razmak je neprimetan i ukoliko bi promenljiva *broj dobila vrednost ne iz unosa korisnika već na neki drugi način svakako bi cifre pokazivale zeljenu vrednost. Dobar posao!
Postaviću svoj kod ovde ukoliko nekom zatreba:
Code:
int gnd1=5;
int gnd2=4;
int segmenti[7]={12,11,10,9,8,7,6};
byte kombinacije[10][7]=
{
{1,1,1,1,1,1,0},
{0,1,1,0,0,0,0},
{1,1,0,1,1,0,1},
{1,1,1,1,0,0,1},
{0,1,1,0,0,1,1},
{1,0,1,1,0,1,1},
{1,0,1,1,1,1,1},
{1,1,1,0,0,0,0},
{1,1,1,1,1,1,1},
{1,1,1,1,0,1,1}
};
void setup() {
for(int i=4;i<13;i++)
pinMode(i,OUTPUT);
Serial.begin(9600);
}
void loop() {
while(Serial.available()==0) {};
int broj=Serial.parseInt();
if(broj<10){
digitalWrite(gnd1,LOW);
digitalWrite(gnd2,HIGH);
for(int c=0;c<7;c++)
digitalWrite(segmenti[c],kombinacije[broj][c]);
}
for(int i=0;i<10;i++) {
if(broj>10&&broj<100) {
int jedinica=broj%10;
int desetica=broj/10;
digitalWrite(gnd1,LOW);
digitalWrite(gnd2,LOW);
for(int c=0;c<7;c++)
digitalWrite(segmenti[c],kombinacije[desetica][c]);
digitalWrite(gnd1,HIGH);
delay(10);
digitalWrite(gnd1,LOW);
for(int c=0;c<7;c++)
digitalWrite(segmenti[c],kombinacije[jedinica][c]);
digitalWrite(gnd2,HIGH);
delay(10);
// }
}
}
Ukoliko budem imao još neko pitanje u vezi ovoga postaviću ovde.
[Ovu poruku je menjao AvramKovacevic dana 17.08.2016. u 18:35 GMT+1]
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|