Главная » Статьи » Proton PICBasic

Применение динамической индикации. Пример 4 - Сдвиговый регистр 74НС164
В этой статье рассмотрим работу сдвигового регистра 74HC164. Этот регистр так же как и 74HC595 предназначен для последовательного приема и параллельного отображения данных. Также подходит в случае, когда нужно сэкономить порты. Стоимость его (в Витебске) ненамного дороже 595-го - 6,1RUR против 5,8RUR.
Рассмотрим внутреннюю схему регистра:



Как видно, он мало чем отличается от 595-го, но есть пара особенностей:

  • Отсутствует вход защелки данных, поэтому может наблюдаться мерцание символов при отправке и отображении числа.
  • В регистре присутствует вход для сброса принятых данных (см. комментарии в коде)
  • Суммарный отдаваемый ток равен 50мА, поэтому необходимо рассчитывать резисторы т.о. чтобы ток через каждый отдельный сегмент не превышал 6,25мА (с учетом точки).


Расположение выводов на мой взгляд уступает 595-му...

Схема из предыдущих примеров, но с использованием двух сдвиговых регистров 74HC164:



Ну и сам код:

'Счетчик c динамической индикацией на сдвиговом регистре 74HC164
Device 16F876A
'----------------------------Предустановки----------------------------------------------------------
Config CP_OFF, DEBUG_OFF, WRT_OFF, CPD_OFF, LVP_OFF, BODEN_OFF, PWRTE_ON, WDT_OFF, HS_OSC
Xtal 4
'----------------------------------Настройки портов-------------------------------------------------
PortB_Pullups = off 'Выключить подтяжку резисторов к порту PORTB
TRISA = %11111111
TRISB = %00000000
TRISC = %00000000
PORTB = %00000000
PORTC = %00000000
'-----------------------------------Конфигурация переменных-----------------------------------------
Symbol Rst = PORTB.0 'Вывод для сброса сдвигового регистра
Symbol Clock = PORTB.1 'Вывод для тактовых импульсов для сдвигового регистра
Symbol DTA = PORTB.2 'Вывод для передачи данных для сдвигового регистра
Dim Value As Byte 'Переменная для осуществления табличного конвертирования числа
Dim Ind As Word 'Переменная для вывода индицируемого значения величин в Portb
Dim n As Byte 'Переменная для выделения из числа нужного разряда
Dim i As Word 'Переменная для счетчика цифр
Dim j As Byte 'Переменная для организации задержки счета
'-------------------------------------Главная программа---------------------------------------------
Start:
For i = 0 To 9999 Step 1
For j = 0 To 10 Step 1
DelayMS 1
Ind = i
GoSub DI
Next j
Next i
GoTo Start
End
;------------------------------Подпрограмма динамической индикации----------------------------------
DI:
n = Ind Dig 0 'Выделяем из числа единицы
GoSub Convert 'и отправляем на табличную конвертацию
Rst = 1 'Сбрасываем сдвиговые регистры сигналом RESET
SHOut DTA, Clock, msbfirst, [8] 'Проталкиваем в нижний регистр бит для зажигания разряда № 4
SHOut DTA, Clock, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для единиц
DelayMS 2 'Задержка для отображения разряда 4
Rst = 0 'Отпускаем сброс
'
n = Ind Dig 1 'Выделяем из числа десятки
GoSub Convert 'и отправляем на табличную конвертацию
Rst = 1 'Сбрасываем сдвиговые регистры сигналом RESET
SHOut DTA, Clock, msbfirst, [4] 'Проталкиваем в нижний регистр бит для зажигания разряда № 3
SHOut DTA, Clock, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для десятков
DelayMS 2 'Задержка для отображения разряда 3
Rst = 0 'Отпускаем сброс
'
n = Ind Dig 2 'Выделяем из числа сотни
GoSub Convert 'и отправляем на табличную конвертацию
Rst = 1 'Сбрасываем сдвиговые регистры сигналом RESET
SHOut DTA, Clock, msbfirst, [2] 'Проталкиваем в нижний регистр бит для зажигания разряда № 2
SHOut DTA, Clock, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для сотен
DelayMS 2 'Задержка для отображения разряда 2
Rst = 0 'Отпускаем сброс
'
n = Ind Dig 3 'Выделяем из числа тысячи
GoSub Convert 'и отправляем на табличную конвертацию
Rst = 1 'Сбрасываем сдвиговые регистры сигналом RESET
SHOut DTA, Clock, msbfirst, [1] 'Проталкиваем в нижний регистр бит для зажигания разряда № 1
SHOut DTA, Clock, msbfirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для тысяч
DelayMS 2 'Задержка для отображения разряда 1
Rst = 0 'Отпускаем сброс
'-------------------------------Подпрограмма табличной конвертации числа----------------------------
Convert:
Value = LookUpL n, [192,249,164,176,153,146,130,248,128,144]
Return

Замечания по коду: как видно, отличий очень мало от предыдущего примера. Если использовать всего один сдвиговый регистр, то итоговый код индикации будет аналогичен, рассмотренному в примере 2. В этом случае мерцания не будет, поскольку разряды могут включаться в нужное время (после вывода цифры в регистр)

Прикрепления:




Категория: Proton PICBasic | Добавил: S_moke (11.01.2012) | Автор: S_moke
Просмотров: 27011 | Комментарии: 3 | Рейтинг: 4.6/10
Всего комментариев: 3
1 vanish   (11.01.2012 20:16) [Материал]
+1

2 MiXaS   (10.02.2012 10:33) [Материал]
+1

3 sakis-st   (28.10.2012 23:30) [Материал]
n = Ind Dig 1 (это неправильно)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]