Індикатор 9 розрядний семисегментний з послідовною шиною, виконаний на двох мікросхемах 74HC595D. Індикатор стояв у телефоні з АВН русь 27, до того як по ньому пройшлася гроза, та так що, відновленню телефон не підлягав, індикатору теж дісталося, згоріли всі 2 мікросхеми. Перевірити його виявилося просто. При робочих мікросхемах і поданому харчуванні, якщо доторкнутися до ліній даних, на індикаторі бігає всяка нісенітниця (за умови що лінії висять у повітрі). Індикатор з динамічною індикацією, тобто для відображення інформації послідовно запалюємо кожну цифру на певний час, наприклад на 2 мілісекунди. Складнощів з ним майже немає, якщо не враховувати що виходів у 74HC595D вісім, а цифр на індикаторі дев’ять. Дев’ята цифра підключена до висновку Q7 ‘послідовний вихід даних. Які висновки і для чого вони потрібні, читайте в DATASHEET на мікросхему. 74HC595.rar (110 Kb). Тут я просто розповім, як я вирішив проблему виведення 8 і 9 цифри. Працювати з цими мікросхемами просто. Для того щоб завантажити дані, встановлюємо, біт даних на виведенні DS serial data input, і зсуваємо (Завантажуємо) позитивним імпульсом SHcp shift register clock input. Для збереження та виводу даних у регістрі подаємо позитивний імпульс на STcp storage register clock input. Проблема виходить при виведенні 8 і 9 цифри. Індикатор тут із загальним катодом, щоб включити, наприклад 4 цифру, потрібно завантажити число 0b11110111, при цьому на виході Q7 ‘буде зрушене значення з Q6, в даному випадку 1, те, що потрібно. Значення Q6 по позитивному імпульсу SHcp зсувається в Q7 ‘. При виведенні восьмий цифри нуль зсувається в Q7 і Q7 ‘(Q7’ = 1 0b10111111 Q7 ‘= 0 0b01111111), в результаті у нас включені 8 і 9 розряд, імпульсом STcp зберігаємо і виводимо це значення, тепер якщо дати імпульс SHcp копійка з Q6 переміститься в Q7 ‘, 9 розряд погашено. Для включення 9 розряду потрібно завантажити число 0b11111111, вивести його імпульсом STcp, потім завантажуємо в регістр нулі до тих пір, поки нуль з Q6 НЕ переміститься в Q7 ‘.

Може бути все це можна зробити простіше. У мене індикатор заробив, і я на цьому заспокоївся. Зараз він працює у годинах. У годиннику є можливість регулювання яскравості індикатора. Період включення кожної цифри 2 ms. Що б зменшити яскравість індикатора, цифру можна включати, наприклад на 1 ms, що залишилися час вона буде погашена. При цьому яскравість світіння знижується.
Файли для PROTEUS (6,95) proteus.rar (20 Kb).

// WinAvr
#include <avr/io.h>
#include <avr/interrupt.h>
#define DATA  PD5
#define SHIFT PD6
#define STORAGE PD7
#define PORTSERIAL PORTD
#define PORTBUT  PORTD
#define PINBUT  PIND
#define DDRSERIAL  DDRD
#define button   BIT(0)
#define BIT(bit)  (1<<(bit))
unsigned char lcd_buffer[9]={0xEB, 0x48, 0x73, 0x7A, 0xD8, 0xBA, 0xBB, 0x73, 0x68};
//*************************************************************
void data_shift(unsigned char data)
{/ / Виводимо біт даних, зсуваємо і так 8 разів.
  unsigned char i=0;
  for(i=8; i ; i--){if (data & BIT (7)) PORTSERIAL | = BIT (DATA); / / виводимо біт даних
                    else   PORTSERIAL&=~BIT(DATA);
  data<<=1;PORTSERIAL | = BIT (SHIFT); / / зсув даних
  PORTSERIAL&=~BIT(SHIFT);
 }
}
//*************************************************************
void num_out(unsigned char znmesto)
{PORTSERIAL | = BIT (STORAGE) ;/ / висновки мікросхем в Z станdata_shift (lcd_buffer [znmesto]) ;/ / завантажуємо символ в перший регістрdata_shift (~ (1 < < (znmesto))) ;/ / вивід знакоместа, символ зсувається в другій регістр/ / ~ (1 << (znmesto)) - число в біт місця (приклад 0х3-> 0b11110111)
 PORTSERIAL&=~BIT(STORAGE);PORTSERIAL | = BIT (STORAGE); / / збереглиPORTSERIAL & = ~ BIT (STORAGE); / / і вивелиif (znmesto == 7) {/ / 7 знакоместо
    PORTSERIAL|=BIT(SHIFT);
    PORTSERIAL&=~BIT(SHIFT);/ / Shift потрібен тому що 0 перемістився з Q6 в-Q7 `
    }if (znmesto == 8) data_shift (0x0) ;/ / 9 розряд./ / Зараз всі виходи першого регістра вуст в 1,/ / Завантажуємо регістр нулями в підсумку-Q7 = 0, але не зберігаємо.
  PORTSERIAL&=~(BIT(DATA)|BIT(SHIFT)|BIT(STORAGE));
}
//*************************************************************
int main( void )
{
unsigned char i=0;
    PORTSERIAL|=BIT(STORAGE);
    DDRSERIAL=0xf0;
    PORTBUT|=button;
    TCCR0=3;
    while(1){
        TCNT0=127;while (! (TIFR & BIT (TOIE0))) ;/ / Затримка ~ 2ms
        TIFR|=1;/ / If (! (PINBUT & button)) / / якщо включити то висновок цифри
        {/ / While (! (PINBUT & button)) ;/ / буде тільки після натискання
        num_out(i);
        if (++i>8) i=0;
        }
    }
}

Автор startcd. Першоджерело.