74HC595 в динамике не будут мерцать. Делал всегда выше 50Гц. Програмный SPI.
Тут эффект в другом, чем больше символов, тем выше частота индикации как следствие из-за эффекта "шим" меньше яркость сегментов.
Когда все индикаторы одинаковы, проблем нет.
Зеленые с красными - порнография! Кто не верит, спаяйте и посмотрите.
CODE
// Вывод индикации на 74НС595
// Количество символов 1 ... 8
// Начальный адрес символа dig_0 выводится первым
// За ним dig_1 , dig_2 , dig_3 .....
// 15.03.2010
// выводы подключения
.equ d_port = PORTB // Порт подключения регистров
.equ dat = PB2 // Вывод данных регистров
.equ clk = PB0 // Вывод тактирования регистров
.equ en = PB1 // Вывод управлением третьим состоянием регистров
.equ tochka = 0xDF // Символ H ( Точка на индикаторах )
.equ negativ = 0xF7 // Символ - ( Минус на индикаторах )
display: // Индикация
push tmp // Save tmp in stack
in tmp,SREG // tmp = SREG
push tmp // Save SREG in stack
push yl // Save YL in stack
push yh // Save YH in stack
push loop // Save loop in stack
ldi anod,0x01 // Set init Anod pin
sbi d_port,en // Переводим выходы регистров в третье состояние
ldi yl, low(dig_0) // выставляем начальную адресацию символа dig_0
ldi yh,high(dig_0) // выставляем начальную адресацию символа dig_0
add yl,dcnt // прибавляем символ , к начальной адресации
ld tmp,Y // читаем символ для вывода на индикатор
cpi dcnt,1 // если счетчик символов >= 1
brsh anod_rol // то сдвигаем регистр Anod на количество символов влево
print_data: // Выводим 2 байта данных в 74НС595
mov data,anod // копируем байт анода
rcall out_byte // выводим anod
mov data,tmp // копируем байт символа
rcall out_byte // выводим байт символа ( digit data )
cpi dcnt,3 // Если счетчик символов >= 3 (Здесь определение количества символов 1 - 8)
brsh dcnt_ovf // переходим на метку обнуления счетчика символов
inc dcnt // Счетчик символов + 1
rjmp ok1 // -------------------------------
dcnt_ovf: // Переполнение счечика символов |
clr dcnt // Очищаем счетчик символов |
ok1: // <-----
cbi d_port,en // Включаем выходы 74НС595
pop loop // Извлечь loop из стека
pop yh // Извлечь YH из стека
pop yl // Извлечь YL из стека
pop tmp // Извлечь SREG из стека в tmp
out SREG,tmp // SREG = tmp
pop tmp // Извлечь tmp из стека
reti // Выход из прерывания
anod_rol: // Сдвиг регистра анодов в лево на количество символов
mov loop,dcnt // копируем количество сдвигов
a_rol: // Цикл сдвига
rol anod // Сдвигаем байт анодов в лево на 1 (anod<<1)
dec loop // Счетчик циклов - 1
brne a_rol // Если счетчик не равен 0 то переходим кциклу otd
rjmp print_data // Переход на вывод данных в 74НС595
out_byte: // Вывод байта в 74HC595
ldi loop,8 // Счетчик битов
otd: // Cycle
clc // Очищаем CARY Flag
rol data // Сдвигаем данные в лево на 1 (data<<1)
brcc d_z // Если CARY Flag сброшен , идем сюда -----|
sbi d_port,dat // Если CARY Flag установлен то DATA=1 |
rjmp d_ok // |
d_z : // Data zero <----|
cbi d_port,dat // Если CARY Flag сброшен то DATA=0
d_ok: // Импульс CLK
sbi d_port,clk // CLK -> 1
cbi d_port,clk // CLK -> 0
dec loop // Счетчик битов - 1
brne otd // Если счетчик не равен 0 то переходим кциклу otd
ret // Выход из подпрограммы