Но возникает проблема: для этого нужно много выводов микроконтроллера. К примеру, если у нас 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 у МК не нарисована, но подразумевается; картинка кликабельна):
Для реализации статической индикации я написал недольшую библиотеку. Она изначально поддерживает Дисплей с 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). Исходники прокомментированы.
Удачи!
Bibliothèque de téléchargement pour l'affichage statique et exemples
radioelektr.ru