Cieľom článku je zúžitkovať skúsenosti z predchádzajúceho článku http://lukas.cerro.sk/981/mikroprocesor-atmega8-a-led-display a využiť ich na ovládanie štvormiestneho LED displeja.

Použitý displej je A-574G, datasheet nájdete tu. Je to štvormiestny LED displej, zelenej farby. Na začiatok je dobré pozrieť si vnútornú schému displeja:
( Kliknite na obrázok, aby sa zobrazil v plnom rozlíšení) Nech vyzerá schéma akokoľvek, princíp je nasledovný: Každá číslica displeja obsahuje spolu s desatinnou bodkou 8 LED diód. V každej číslici, má tých 8 diód jednu spoločnú anódu ( vyvedenú na príslušný pin, napr. prvá číslica ju má na pine č. 12 ). Ďalej sú vo vnútri displeja pospájané katódy všetkých segmentov na rovnakej pozícii. To znamená, že všetky diódy, ktoré rozsvecujú segmenty “A” majú spoločnú katódu, pre segment “B” majú spoločnú katódu a takto ďalej až po desatinnú bodku. Takže ak na všetky katódy privediem cez rezistory mínus pól z napájacieho zdroja a na všetky anódy privediem plus pól, rozsvieti sa celý display.
Ak chcem vysvietiť len časť displeja, musím vhodne nakombinovať piny, ktoré budem napájať. Ak pripojím na napájanie len anódu prvej číslice, budem vykreslovať znaky len na nej. Ak pripojím na napájanie len anódu druhej číslice, budem vykreslovať znaky len na druhej číslici. Ak chcem vykreslovať rúzne znaky na všetkych 4 čísliciach, musím to trochu nakombinovať. A to ich postupným striedaním.
Ľudské oko má tú vlastnosť, že ak sa nejaký meniaci sa dej opakuje veľmi rýchlo, prestáva to vnímať ako zmenu. Tak fungujú napríkladm neónky, ktoré v skutočnosti blikajú, ale nám sa javia ako svietiace. Tento jav teraz využijem u displeja. Najprv si nastavím, čo chcem vykresliť na prvom displeji (číslicu “1″), potom ho rozsvietim a následne zhasnem. Potom nastavím na vykreslenie číslicu “2″, rozsvietim druhý displej a následne ho zhasnem. Na tretej a štvtej číslici displeja spravím to isté. Tu je video, ako to vyzerá spomalene:
No a ak sa rýchlosť preblikávania zvýši, ľudské oko už nie je schopné rozlišovať jednotlivé číslice, už to vníma, že je rozsvietený celý displej. Tu je fotka:

Schéma zapojenia mikroprocesora so štvormiestnym LED displejom A-574G:
( Kliknite na obrázok, aby sa zobrazil v plnom rozlíšení ) Táto schéma bude stále rovnaká, len zmenou programu budem vykreslovať iné nápisy. K schéme nie moc čo písať, port “D” mikroprocesora ovláda segmenty, ktoré budú vykreslené a port “C” riadi na ktorej pozícii.
Program vykresľovania čísla 1234 na 4 miestnom sedemsegmentovom LED displeji:
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#define outp(a, b) b = a
int vystup[5] = { 0xff,6,91,79,102};
int segment = 0x01;
int ukazovatel = 0x01;
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0xe0;
if(ukazovatel == 0x05) ukazovatel = 0x01;
if(segment == 0x10) segment = 0x01;
PORTC = 0xff;
PORTD = vystup[ukazovatel];
PORTC &= ~segment;
segment = segment * 0x02;
ukazovatel++;
}
int main(void)
{
DDRD=0xff;
DDRC=0xff;
PORTC = 0xff;
PORTD = 0xff;
outp((1<<TOIE0), TIMSK);
TCNT0 = 0xe0;
TCCR0 = 0x02;
sei();
while(1)
{
}
return(1);
}
Program sa mi moc nechce opisovať, celý je len o tom, že registrami TCNT0 a TCCR0 je nastavený časovač, ktorý zakaždým zavolá funkciu ISR. Tá pri prvom volaní vykreslí podľa obsahu poľa vystup[5] znak na prvej pozicii. Pri ďalšom volaní vykresľuje znak na druhej pozícii, potom na tretej, štvrtej, znova na prvej, druhej a takto dookola. Ak trocha upravím program a natiahnem pole vystup[5], dostavam pohybujúci sa text.
Úprava programu na pohybujúci sa text. Stačilo len pridať pár premenných, od ktorých závisí rýchlosť posunutia a to, kde sa čo vykreslí. Najprv výsledok :
A potom zdrojový text programu:
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#define outp(a, b) b = a
int vystup[27] = { 0,0,0,0,0,119,118,63,30,0,6,91,79,102,109,
125,7,127,111,63,0,0,0,0,0};
int segment = 0x01;
int ukazovatel = 0x01;
int pocitadlo = 0x00;
int posun = 0x00;
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0xe0;
if(ukazovatel == 0x05) ukazovatel = 0x01;
if(segment == 0x10) segment = 0x01;
PORTC = 0xff;
PORTD = vystup[ukazovatel+posun];
PORTC &= ~segment;
segment = segment * 0x02;
ukazovatel++;
pocitadlo++;
}
int main(void)
{
DDRD=0xff;
DDRC=0xff;
PORTC = 0xff;
PORTD = 0xff;
outp((1<<TOIE0), TIMSK);
TCNT0 = 0xe0;
TCCR0 = 0x03;
sei();
while(1)
{
if(pocitadlo > 0xF0)
{
if(posun == 21) posun = 0x00;
pocitadlo = 0x00;
posun++;
}
}
return(1);
}
Počítadlo bol posledný pokus, ktorý som robil. Na displeji sa vypisujú čísla od 0 do 9999. potom sa resetne do nuly. Videoukážka obsahuje len tú časť, kde sa displej resetuje.
Zdrojový text programu:
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#define outp(a, b) b = a
int pocitadlo = 0x01;
int vystup[5] = { 0xff,63,63,63,63};
int segment = 0x01;
int ukazovatel = 0x01;
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0xe0;
if(ukazovatel == 0x05) ukazovatel = 0x01;
if(segment == 0x10) segment = 0x01;
PORTC = 0xff;
PORTD = vystup[ukazovatel];
PORTC &= ~segment;
segment = segment * 0x02;
ukazovatel++;
pocitadlo++;
}
int main(void)
{
DDRD=0xff;
DDRC=0xff;
PORTC = 0xff;
PORTD = 0xff;
outp((1<<TOIE0), TIMSK);
TCNT0 = 0xe0;
TCCR0 = 0x03;
sei();
int znaky[10] = {63,6,91,79,102,109,125,7,127,111};
int jednotky = 1;
int desiatky = 1;
int stovky = 1;
int tisice = 1;
while(1)
{
if(pocitadlo == 0x50)
{
pocitadlo = 0x00;
if(jednotky == 10)
{
jednotky = 0;
if(desiatky == 10)
{
desiatky = 0;
if(stovky==10)
{
stovky = 0;
if(tisice == 10) tisice = 0;
vystup[1] = znaky[tisice];
tisice++;
}
vystup[2] = znaky[stovky];
stovky++;
}
vystup[3] = znaky[desiatky];
desiatky++;
}
vystup[4] = znaky[jednotky];
jednotky++;
}
}
return(1);
}
Záverom len dodám, že toto sú len malé pokusy z toho, čo všetko sa dá vymyslieť z displejom. Chcel by som, aby pribudol ďalší článok, kde už bude displej ukazovať aj niečo múdrejšie, závislé napríklad od rýchlosti, otáčok, teploty. Ak máte nejaký nápad, pripomienku, využite diskusiu alebo kontakty.


Mám pocit, že ten program kombinuje dve veci. Čísla raz vykresľuje cez:
PORTD = vystup[ukazovatel];
A potom cez riadky:
PORTC = 0xfe;
_delay_ms(5);
Tie dva časti programu sa vlastne bijú navzájom. Posúvanie medzi znakmi je najprv cez:
PORTC &= ~segment;
a potom cez :
PORTC = 0xf7;
Skús vyhodiť (alebo zakomentovať) tieto riadky:
PORTC = 0xfe;
_delay_ms(5);
PORTD = 0×06;
_delay_ms(1000);
PORTC = 0xfd;
_delay_ms(5);
PORTD = 0x5B;
_delay_ms(1000);
PORTC = 0xfb;
_delay_ms(5);
PORTD = 0x4F;
_delay_ms(1000);;
PORTC = 0xf7;
_delay_ms(5);
PORTD = 0×66;
_delay_ms(1000);
Ak to potom bude fungovať, zmeň len čísla v medzi zátvorkami v tomto riadku:
int vystup[5] = { 0xff,6,91,79,102};
Čiže tieto : 0xff,6,91,79,102
Daj vedieť, čo ako.
a vypisuje mi to na vsetky displeje postupne 1 na vsetky 4displeje, dvojku na vsetky styri ….
pouzivam toto aby mi postupne vypisovalo 1,2,3,4 na displeje
#include
#include
#include
#include
#define outp(a, b) b = a
int vystup[5] = { 0xff,6,91,79,102};
int segment = 0×01;
int ukazovatel = 0×01;
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0xe0;
if(ukazovatel == 0×05) ukazovatel = 0×01;
if(segment == 0×10) segment = 0×01;
PORTC = 0xff;
PORTD = vystup[ukazovatel];
PORTC &= ~segment;
segment = segment * 0×02;
ukazovatel++;
}
int main(void)
{
DDRD=0xff;
DDRC=0xff;
//PORTC = 0xff;
//PORTD = 0xff;
outp((1<<TOIE0), TIMSK);
TCNT0 = 0xe0;
TCCR0 = 0×02;
//sei();
while(1)
{
PORTC = 0xfe;
_delay_ms(5);
PORTD = 0×06;
_delay_ms(1000);
PORTC = 0xfd;
_delay_ms(5);
PORTD = 0x5B;
_delay_ms(1000);
PORTC = 0xfb;
_delay_ms(5);
PORTD = 0x4F;
_delay_ms(1000);;
PORTC = 0xf7;
_delay_ms(5);
PORTD = 0×66;
_delay_ms(1000);
}
return(1);
}
Čau.
Napádajú ma možnost, že mikroprocesor neprepína medzi displejmi. Skús na začiatok spomaliť program. Čo najviac, ako sa len dá. Displeje by mali preblikávať po jednom. Ak nie, už tu je prvý problém.
Skús tu hodiť program (neviem, či ideš podľa môjho, alebo nejakej úpravy) v procáku, možno tam dačo objavím.
Ahoj, mam mensi problem pri zapajani podla tejto schemy. Nepouzivam priamo stvormiestny displej ale mam 4 velke(101mm) 7segmentovky. tie napajam zo zdroja 7,5V a pri nahrani programu my na vsetkych segmentoch svieti vsetko rovnako. Ked dam na prvu 7segmentovku vypisat jednotku vypise sa na vsetkych styroch, ked na 2 tiez na vsetkych 4roch a tak dalej. Netusis v com by mohla byt chyba ?
Dlabať na to, dal som už ten článok na web
hm, neviem preco ale nejde mi to pdf otvorit
1. apríla dám na web článok, ktorý by ti mohol pomôcť. Je to o fotoreflektore RPR220. Vytiahol som ho zo starej tlačiarne. PDF ochutnávka článku je tu : http://lukas.cerro.sk/upload/2011/03/vystup.pdf
Už stačí len nakombinovať počítadlo s diplejom a fotoreflektor.
zdravim, mal by som jeden napad, kedze na webe to nemozem najst. malo by to byt zapojenie s infra diodou a infra tranzistorom. Nieco na ten princip ako roboty sledujuce ciaru, ale ja by som potreboval aby sa na displeji zobrazoval pocet prekazok. Cize ak pred fotodiodu dam prekazku, odrazi sa luc na fototranzistor a na displeji sa objavi jednotka, ak znovu dam dalsiu prekazku, pripocita ju a na displeji sa ukaze dvojka … atd. Dakujem