Я думаю, у многих при использовании динамической индикации на семисегментных индикаторах возникали проблемы с яркостью индикаторов. А всё потому, что сегменты постоянно подключаются – отключаются и получается некое подобие ШИМ. Чтобы этого не происходило, следует использовать статическую индикацию. При таком принципе сегменты зажигаются один раз и переключаются только при изменении цифры. Это и программно удобно: не нужно постоянно вызывать из программы функции или подпрограммы, отвечающие за динамическую индикацию. Нужно только при изменении данных повторно вывести их на дисплей и всё.
Но возникает проблема: для этого нужно много выводов микроконтроллера. К примеру, если у нас 4 цифры, то нужно 8х4=32 вывода, у у Меги16 их всего 32. Поэтому для реализации статической индикации необходимо использовать сдвиговые регистры или расширители портов.
Расширители портов, как правило, подключаются к микроконтроллеру через SPI/I2C и представляют из себя полноценный порт ввода-вывода, который можно настроить на вход/выход и перевести в высокоомное Hi-Z сотояние(это когда вывод как-бы ни к чему не подключен).
А сдвиговые регистры(я рассматриваю именно 74hc595) дают нам совокупность ножек, которые являются выходами и их также можно перевести в состояние Hi-Z. Управляются они через последовательный интерфейс. В данном случае это подобие SPI. Конечно, существуют и регистры с параллельным входом – последовательным выходом и другие, но мы не будем их рассматривать в рамках данной статьи.
Как Вы уже догадались, для реализации статической индикации нам достаточно сдвиговых регистров. Наверное, самые популярные из них – 74hc595. Это регистры-защёлки с последовательным входом – параллельным выходом. Защёлками они называются потому, что после того, как мы запишем в них данные, их необходимо “защёлкнуть” – перевести на некоторое время состояние одного из пинов в логическую единицу. Только после этого будет изменено состояние выходов.
Вот распиновка регистра:
Распишу выводы по порядку:
- VCC и GND – питание, оно может быть в пределах от 2 до 6 Вольт.
- Qa – Qh – выходы регистра, каждый из них тянет до 6 мА тока при питании 5 Вольт.
- Qh’ – вывод для объединения нескольких регистров. Он подключается к входу данных следующего регистра, ещё расскажу об этом.
- SER – вход данных регистра.
- SRCLK – вход для тактовых импульсов.
- RCLK — Защелка. Подаём на него единицу и данные защёлкиваются.
- OE – Если подать на этот вывод 1, то выходы передут в высокоомное стостояние, если 0 – в рабочее сотояние(0 или 1).
- SRCLR – сброс регистра.
Для реализации статической индикации на понадобятся выводы питания, выходы регистра и выводы SER, SRCLK, RCLK. Если больше одного регистра – можно соединить их цепочкой: вывод Qh’ предыдущего регистра с выводом SER следующего. Вот общая схема включения(подтяжка RESET у МК не нарисована, но подразумевается; картинка кликабельна):
Порядок записи в регитр такой: сначала устанавливаем нужный уровель на SER, который должен соответствовать требуемому биту, потом устанавливаем в единицу SRCLK и потом сразу-же устанавливаем его в ноль. Произойдёт вывод 1 бита, следующий бит будет сдвигать предыдущий. Повторяем такой цикл 8 раз(или 32 раза с 4-мя разрядами индикатора), после всех действий устанавливаем в единицу защёлку, потом обнуляем, и данные будут обработына и выведены. Более подробно расписано в комментариях к коду примера. Скачать можно в конце статьи.
Для реализации статической индикации я написал недольшую библиотеку. Она изначально поддерживает Дисплей с 4-мя цифрами. При желании можете сократить/увеличить количество цифр. В комментариях к коду всё подробно расписано. Пользоваться библиотекой просто. Для начала добавьте файл 74hc595segment.asm в папку с проектом, подключите библиотеку к проекту где-нибудь в конце программы, там, где находятся подпрограммы :
.include "74hc595segment.asm"
После, там, где у Вас инициализация, добавьте строку с инициальзацией(скорее, настройкой портов):
rcall display_init
Дальше пропишите порты ввода-вывода, на которых будут висеть регистры, определения находятся в начале файла с библиотекой:
;========================================================================== ;Указываем выводы, на которых будет сидеть шина данных ;Сначала порты и DDR .equ DS_PORT = PORTA .equ DS_DDR = DDRA; Данные .equ TAKT_PORT = PORTA .equ TAKT_DDR = DDRA;Вход тактировки 74hc595 .equ ZAS_PORT = PORTA .equ ZAS_DDR = DDRA;Защёлка ;А дальше указываем конкретные выводы .equ ZAS = PA2; Защёлка .equ TAKT =PA1; Вход тактировки 74hc595 .equ DS = PA0; Данные ;=========================================================================
Теперь можно пользоваться. Загружем в переменные цифры и выводим их на дисплей:
ldi r16,1;Загружем цифорки в соответствующие ячейки памяти. sts digits,r16 ldi r16,2 sts digits+1,r16 ldi r16,3 sts digits+2,r16 ldi r16,4 sts digits+3,r16 ldi r16,0b00001000; Установка точки. sts digits+4,r16 ;Младшие 4 бита соответствуют четырём точкам(слева-направо). rcall display;Выводим на дисплей данные
Полный текст программы:
;========================================================================= ;Тестовая программа для проверки библитеки, предназначеной ;Для реализации статической индикации на семисегментниках с ;Использованием сдвиговых регистров 74hc595 ; ©LPA, 2012 ; http://radioelektr.ru ;========================================================================= .include "m16Adef.inc" ;========================================================================= ldi r16,low(ramend) out spl,r16 ldi r16,high(ramend) out sph,r16 ;Стек rcall display_init ;Настройка портов ввода-вывода, к которым подключены регистры ;========================================================================= ldi r16,1;Загружем цифорки в соответствующие ячейки памяти. sts digits,r16 ldi r16,2 sts digits+1,r16 ldi r16,3 sts digits+2,r16 ldi r16,4 sts digits+3,r16 ldi r16,0b00001000; Установка точки. sts digits+4,r16 ;Младшие 4 бита соответствуют четырём точкам(слева-направо). rcall display;Выводим на дисплей данные main:;Главный цикл пуст rjmp main ;========================================================================= .include "74hc595segment.asm";Подключение библиотеки
А вот что из этого получилось:
Если хотите изменить библиотеку под свои индикаторы – никаких проблем, в конце библиотеки есть таблица символов. Её можно расширить, сократить, можно задать состояние каждого вывода регистра для определённой цифры. Код прокомментирован, поятому, я думаю, проблем не будет.
Также я сделал ещё один пример: простые часы с использованием статической индикации и DS1307. В симуляторе они выглядят так:
В архиве есть две прошивки с исходниками и модели в протеусе(v 7.7 SP2). Исходники прокомментированы.
Удачи!
Скачать библиотеку для статической индикации и примеры
radioelektr.ru
можно ли такую индикацию подключить к часам на 176 серии для отображения времени, чтоб не заниматся программированием