О, вот с картинки надо было и начинать!
В общем, как это реализовать. Я не вникал особо в ваш код, скажу как бы я сделал. Вам нужно по прерыванию таймера сделать код обновления значений индикатора. Не знаю, как это будет визуально выглядеть в протеусе. Суть в том, что вы заводите какой-нибудь глобальный массив, который хранит текущее значение дисплея в виде массива байтов (unsigned char). Т. е. в нем хранятся уже закодированные для семисегментника значения - один из возможных символов - числа 0-9, знак "-", может быть какие-то буквы и т. д. Как происходит кодирование - на данном этапе неважно. Потом необходимо реализовать прерывание по таймеру для обновления дисплея, которое вызывает функцию обновления с небольшой частотой (меньше килогерц, т. к. это все-таки отнимает ресурсы. Можно уменьшить вплоть до ~50 Гц. Но я не знаю как это в протеусе это будет выглядеть визуально). Функция обновления будет по одному запихивать через первый сдвиговый регистр каждый из 8 значений для каждого сегмента. Это будут значения типа 0b00000000 - сегмент пустой, 0b11111111 - цифра 8 с точкой и также прочие символы, код которых я так по памяти не скажу - думаю тут и так понятно. При этом переключение между символами происходит засчет второго сдвигового регистра. Если у вас индикатор с общим катодом, то на этот второй регистр нужно подавать сначала 0b011111111, если с общим анодом - 0b100000000, а затем мы этот нолик или единичку сдвигаем чтобы зажечь новую секцию. Т. е. алгоритм работы функции обновления такой:
Код: Выделить всё
unsigned char indicator_data[8] = { ... }
indicator_update()
{
for(i=0; i<8; i++) {
send_shift_reg_U3(0b011111111 >> i); // общий катод; двигаем ноль на i вправо
send_shift_reg_U2(indicator_data[i]);
}
}
Функции по отсылке байт в регистры U2 и U3 напишете - это уже ваше дело, SPI использовать, или просто портами вручную управлять.
Их задача "отключить" вывод регистров, засунуть в них байт данных (при этом обеспечить нужное тактирование входа) и "включить" его заново.
Напишите сначала это, потом будет проще уже с остальной логикой разобраться.
PS. Да, если вы новичок в электронике. Не забудьте добавить на схему необходимый обвес к микроконтроллеру, ограничительные резисторы везде где надо и транзисторы для управления секциями, перед тем как это паять.
PS2. Блин, плохо посмотрел на схему - у вас же сдвиговые регистры последовательно соединены

В общем у вас вместо send_shift_reg_U3 и send_shift_reg_U2 должна быть одна функция, которая принимает не один байт, а сразу два:
Код: Выделить всё
send_indicator_data(unsigned short); //прототип
...
unsigned short data = (((unsigned short)(0b011111111 >> i)) << 8) & indicator_data[i];
send_indicator_data(data);
Надеюсь, не напугал конструкцией. Тут просто два байта в одну переменную типа short забиваются.