Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino

Tvoříte zajímavý projekt? Pochlubte se s ním.
Pravidla fóra
Vkládejte prosím jen HOTOVÉ projekty, které chcete představit ostatním.
Odpovědět
Uživatelský avatar
Diego
Příspěvky: 271
Registrován: 23 črc 2017, 09:43
Kontaktovat uživatele:

Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino

Příspěvek od Diego » 30 zář 2026, 04:41

Dnes se podíváme na jednoduchý 7-mi segmentový displej řízený posuvným registrem a jeho ovládání pomocí Arduina.
https://www.michaluvbrloh.cz/2026/09/30 ... o-arduino/
LED_74HC595_01-scaled.jpg
https://www.michaluvbrloh.cz - Můj web
https://hackaday.io/projects/hacker/1326779 - Moje některé probíhající i dokončené projekty

AstroMiK
Příspěvky: 676
Registrován: 08 pro 2017, 19:05

Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino

Příspěvek od AstroMiK » 01 říj 2026, 18:19

Podle mého názoru se tato sestava (posuvný registr a displeje s navzájem pospojovanými segmenty) k Arduinu moc nehodí.
Právě proto, že je nutné se starat o multiplexování.

Jestli jde jen o zobrazení nějakého statického nápisu, tak asi ano. To by se zvládnout dalo.

Kdyby to mělo ale ještě komunikovat, listovat někde v menu, něco měřit, využívat inerrupty ... atd., tak už bych měl trochu strach, jestli se podaří udržet pravidelný multiplex, aby nějaké segmenty viditelně nepoblikávaly.

Posuvné registry bych použil v případě, kdy bude každý segment (LEDka) ovládaný zvlášť.
Pak by stačilo:
- připravit jeden dlouhý (64-bitový) řetězec (8 znaků * 8 segmentů)
- nasypat ho do řady posuvných registrů (každá zobrazovací jednotka by měla svůj 8-bitový)
- jedním pulsem na LATCH ho překlopit do LEDek
- jas by se dal plynule upravovat pomocí PWM na společné elektrodě všech displejů

Dál už se o zobrazení není třeba starat.

Z vlastní zkušenosti bych se ale přikláněl spíš k použití toho v článku zmíněného TM1637 v kombinaci s displejem se spojenými segmenty.
Pak už se o multiplexování stará samotný obvod a Arduino má volné prostředky pro své činnosti.


Jinak máš pěkné články, sleduji všechny.

Uživatelský avatar
gilhad
Příspěvky: 919
Registrován: 07 bře 2018, 11:22

Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino

Příspěvek od gilhad » 01 říj 2026, 20:35

Taky se mi to líbí :)
Ale to blokující Delay() bych přepsal na verzi s millis() (Blink without delay ), i když by to bylo o něco pracnější.

(Obecně se snažím dělat věci v loop() rychlé a nechat je testovat to, co potřebují, co nejčastěji.)

Uživatelský avatar
Diego
Příspěvky: 271
Registrován: 23 črc 2017, 09:43
Kontaktovat uživatele:

Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino

Příspěvek od Diego » 02 říj 2026, 04:35

Díky. Tenhle displej se mi v zásobách válí už dlouho. Tenkrát jsem s ním chtěl něco dělat ale nakonec k tomu nikdy nedošlo. Lepší na použití je displej s vlastním řízením kterému stačí poslat data a on si multiplex řídí sám. O něm bude článek další středu ;)
https://www.michaluvbrloh.cz - Můj web
https://hackaday.io/projects/hacker/1326779 - Moje některé probíhající i dokončené projekty

Uživatelský avatar
JPLABS
Příspěvky: 127
Registrován: 28 pro 2025, 16:52
Bydliště: Praha
Kontaktovat uživatele:

Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino

Příspěvek od JPLABS » 02 říj 2026, 23:33

na internetu se často objevuje řízení LED displeje pomocí posuvných registrů. Asi nejhorší možné řešení. To se používalov dobách, kdy nebylyu ještě ani procesory, natož mikropočítače. Klasický multiplex je lepší. Ten se používal ve spojení s procesory. Pro mikropočítače je nejlepší řešení sériové řízení pomocí obvodu od Maxima (7219).
S časem se vše zhoršuje (zákon prof. Parkinsona)
Obrázek

Uživatelský avatar
Caster
Příspěvky: 535
Registrován: 11 zář 2019, 09:02

Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino

Příspěvek od Caster » 04 říj 2026, 02:40

Osmimístný displej s 74HC595 bez práce v loop(). Obnovu číslic necháme na Timer1

Osmimístný sedmisegmentový modul s dvojicí 74HC595 neumí multiplexovat sám. Program musí rychle přepínat číslice, jinak displej bliká nebo zhasne. V běžné ukázce se o to stará loop() a delayMicroseconds(). Jde to ale i tak, že smyčka zůstane prázdná a celou obnovu si vezme přerušení od Timer1.

Na Arduino UNO a Nano s ATmega328P k tomu stačí jeden časovač. Druhý časovač na čtení číslic z paměti není potřeba. Buffer je v RAM a obsluha Timer1 si z něj bajt segmentů vezme sama.

Proč ne delay() v loop()

Modul nerozsvítí všech osm míst najednou. Zapne jednu číslici, nastaví její segmenty, za chvíli přepne na další a tak pořád dokola. Když je to dost rychlé, oko blikání nevidí.

Ukázkový program to dělá blokujícím čekáním, typicky delayMicroseconds(1000) na každou číslici. Celý průchod tak zablokuje smyčku zhruba na 8 ms. Počítadlo to přežije. Jakmile v loop() přibude měření, sériová linka nebo delší výpočet, displej se rozbliká.

Přerušení od časovače tenhle problém oddělí. Hlavní program může stát, displej se obnovuje dál.

Zapojení
  • VCC modulu na 5 V
  • GND na GND
  • DIO / DATA na D7
  • SCK / CLK na D6
  • RCK / LATCH na D5
Piny nejsou povinné. V ukázce jsou na portu D schválně, protože obsluha přerušení zapisuje přímo do PORTD a ne přes digitalWrite().

Co se mění v programu

V setup() zůstanou piny, vynulování bufferu a první setNumber(0). Navíc se nastaví Timer1 do režimu CTC. Při taktu 16 MHz, předděličce 8 a OCR1A = 1999 přijde přerušení přesně jednou za 1 ms.

loop() se vyprázdní:

Kód: Vybrat vše

void loop() {}
V ISR(TIMER1_COMPA_vect) se děje jen tohle:
  1. Oba registry se krátce zapíšou nulami, ať neprosvítá sousední číslice.
  2. Index 0…7 se posune o jednu pozici a přemapuje přes digitMap.
  3. Z displayBuffer se vezme bajt segmentů, složí se bajt výběru číslice a uplatní se SEGMENTS_ACTIVE_LOW a DIGITS_ACTIVE_LOW.
  4. Oba bajty se pošlou do 74HC595 v pořadí podle SEND_DIGIT_FIRST. Latch se zvedne až po nich.
  5. Číslice svítí do dalšího tiku, tedy asi 1 ms. To odpovídá původnímu delayMicroseconds(1000).
  6. Jednou za 1000 průchodů softwarový dělič zvedne počítadlo a zavolá setNumber(). Tím se plní paměť, ze které multiplex čte.
displayBuffer a počítadlo musí být volatile. setNumber() zapisuje celé číslo naráz. Kdyby se buffer měnil i mimo obsluhu, zápis patří mezi noInterrupts() a interrupts(), jinak se hodnota roztrhne uprostřed.

V obsluze nesmí být shiftOut(), digitalWrite(), delayMicroseconds() ani Serial. Jsou pomalé a v přerušení nemají co dělat. Timer0 se nesahej. millis() dál běží, tahle smyčka ho jen nepotřebuje.

Jas a blikání

Perioda Timer1 je současně délka svitu jedné číslice. Menší OCR1A znamená rychlejší obnovu a nižší jas. Větší perioda jas zvedne, ale od zhruba 2 ms na číslici už blikání uvidíš. Proud modulu pořád není zanedbatelný. 74HC595 není budič jako MAX7219, proud ani jas sám nehlídá.

Druhý časovač dává smysl až ve chvíli, kdy máš druhou nezávislou periodu, která nesmí rozhodit jas. Třeba měření ADC jednou za 100 ms. Na samotné přečtení číslic a jejich poslání ven je jeden Timer1 přesnější i jednodušší.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host