Ошибка базы данных WordPress: [Table './meandr_base/anzpz_usermeta' is marked as crashed and last (automatic?) repair failed]
SELECT user_id, meta_key, meta_value FROM anzpz_usermeta WHERE user_id IN (1) ORDER BY umeta_id ASC

1

Статическая индикация на семисегментниках с использованием 74hc595

Я думаю, у многих при использовании динамической индикации на семисегментных индикаторах возникали проблемы с яркостью индикаторов. А всё потому, что сегменты постоянно подключаются – отключаются и получается некое подобие ШИМ. Чтобы этого не происходило, следует использовать статическую индикацию. При таком принципе сегменты зажигаются один раз и переключаются только при изменении цифры. Это и программно удобно: не нужно постоянно вызывать из программы функции или подпрограммы, отвечающие за динамическую индикацию. Нужно только при изменении данных повторно вывести их на дисплей и всё.

 

 

Но возникает проблема: для этого нужно много выводов микроконтроллера. К примеру, если у нас 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

admin

1 комментарий

  1. можно ли такую индикацию подключить к часам на 176 серии для отображения времени, чтоб не заниматся программированием

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *