Вы находитесь на странице: 1из 5

основы схемотехники

(Продолжение. Начало — № 4–11/2001) 1001В — 9. Выходы дешифратора


DD3 соединены с одноименными
Микроконтроллеры? входами индикатора соответствую
щими анодами сегментов. Катоды
Это же просто! сегментов каждого разряда, как уже
Сопряжение со светодиодными индикаторами типа АЛС318 упоминалось, объединены внутри
индикатора и управляются выходами

А
ЛС318 — наиболее удобный дешифратора DD3 (КР514ИД1) и второго дешифратора DD4. На ин
для рассмотрения многораз DD4 (К555ИД7) и половинку микро формационные входы последнего
рядный 7сегментный свето схемы с открытым коллектором поступают сигналы с трех старших
диодный индикатор. Разобрав DD2 (КР155ЛЛ2). Последняя, как линий порта Р1 — Р1.5, Р1.6 и Р1.7.
шись с тем, как его использовать, будет показано ниже, управляет де Они позволяют управлять индикато
вы без особых усилий адаптируете сятичной запятой. Вместо всех этих ром, имеющим до 8 индицируемых
описываемые в статье аппаратные трех микросхем вполне возможно разрядов. Оставшаяся линия (Р1.4)
и программные средства под лю использовать запрограммиров ан используется для управления деся
бой 7сегментный индикатор, ную соответствующим образом тичной запятой — разрядом h инди
будьто панель, набранная из де ПЛИС, которая «вберет» их в себя и катора. Установка этой линии в 1 за
сятка одиночных индикаторов с будет выполнять те же функции. Но жигает запятую в том разряде, ка
большими цифрами, или малога при этом потеряется ясность, поче тодный вывод которого установлен
баритный 5разрядный АЛС328 в му именно так, а не иначе мы пост в 0 соответствующим выходом де
14выводном DIPкорпусе. роили нашу программу связи МК с шифратора DD4.
Напомню, что 7сегментные све индикатором, и как изменить про Как видите, для управления
тодиодные индикаторы выпускают грамму, если чтото изменено в 8разрядным 7сегментным свето
ся либо с объединенными анодами, схеме сопряжения. Поэтому я и диодным индикатором нам понадо
либо с объединенными катодами. рассматриваю схему на дискретных билось 8 линий вывода — весь порт
АЛС318 принадлежит к последним. элементах, пусть даже несколько Р1. В предыдущем случае, при
Его анодами обычно управляет де архаичную, но наиболее удобную использовании НТ1610, линии вво
шифратор типа КР514ИД1. Управ для первоначального знакомства. да/вывода использовались более
ление катодами можно организо А разобравшись с ней, вы будете экономно. Но ничего не поделаешь,
вать двумя способами — с исполь делать то, что для вас легче, проще, это плата за отсутствие внутри ин
зованием второго дешифратора элегантнее — когда знаешь, что и дикатора АЛС318 дополнительного
или напрямую от микроконтролле как сделать, придумать десяток ва микроконтроллера.
ра. Мы рассмотрим первый вари риантов на любой вкус несложно. Наверное, вы уже догадались, что
ант — он требует использования Итак, рассмотрим схему на рис. 24. если вам нужно управлять не 8, а
меньшего числа выводов микро Для работы с индикатором использу 16разрядным индикатором, в ка
контроллера. ется порт Р1. Четыре его младшие честве DD4 необходимо использо
Схема сопряжения нашего МК с линии (Р1.0Р1.3) выводят на дешиф вать дешифратор «4 в 16». Соответ
индикатором АЛС318 приведена на ратор DD3 код отображаемой ственно, для управления им пона
рис. 32. Она включает в себя два цифры: 0000В — 0; 0001В — 1; добятся не 3, а 4 линии порта.
Логичнее всего использовать для
этого Р1.4Р1.7, внеся соответству
ющие изменения в приведенную
ниже программу. Ну, а управление
десятичной запятой, если она вам
необходима, придется осущест
вить по какойлибо линии другого
порта, например, по Р3.0.
Будем считать, что перед нами
стоит та же задача, что и в преды
дущем случае — отобразить под
программой IZOBR на индикаторе
два 4разрядных числа, хранящих
ся в двоичнодесятичном пред
ставлении во внутреннем ОЗУ МК
в ячейках памяти с адресами от
AD00+3 (старший разряд первого
числа) до AD00 (младший разряд).
В данном примере, как и ранее,
символическому адресу AD00 я
присвоил численное значение 30Н,
AD00+1 — 31Н, … AD00+4 — это
34Н, AD00+7 — 37Н. Первое число
я вывожу в четыре правых разряда
индикатора, второе — в четыре ле
Рис. 24. Схема сопряжения МК с АЛС318 вых, а в средний (индикаторто
9разрядный) вывожу пробел.
основы схемотехники

Таким образом, если ячейка с ад (левый) разряд индикатора, а в NOP


ресом 30Н содержит число 07Н, младших 8 разрядах отображать NOP
31Н — число 02Н, 32Н — число 05Н, число от 00000000 до 99999999? NOP
33Н — число 04Н, а в следующих Естественно, нужно было бы подать NOP
четырех ячейках с адреса 34Н по единичку на катод старшего разря NOP
37Н хранятся, соответственно, чис да, а с выходами дешифратора со RET
ла 08Н, 00Н, 01Н и 02Н, то при запу единить оставшиеся восемь като
ске подпрограммы IZOBR на инди дов и при этом не забыть сделать Она реализует отображение ме
каторе АЛС318 вы увидите (слева соответствующие изменения в при тодом динамической индикации.
направо) числа 2108 и 4527, разде водимой ниже программе. Напомню, что при этом одноимен
ленные пробелом. Ну а теперь перейдем непосред ные (в нашем случае анодные) сег
А как быть, если нам нужно отоб ственно к программе IZOBR: менты разных разрядов индикатора
разить не 2108 и 4527, а 2,108 и объединены между собой, и, вслед
45,27? Очень просто. Вспомним, ; ствие этого, код отображаемого
что отображаемые цифры, храня AD00 .EQU символа одновременно подается
щиеся в адресах с AD00+0 по 30H на аноды всех разрядов. Отобража
AD00+7, — 4битные (от 0000В до CNSKIND .EQU ется же этот символ в том разряде,
1111В), а старшие четыре бита каж 40H ;счетчик 0255 катоды которого находятся под ну
дой из этих цифр хранят незнача ; левым потенциалом, при этом все
щие нули. Давайте договоримся, ;ПОДПРОГРАММА IZOBR ОБЕСПЕЧИВАЕТ остальные разряды индикатора
что пятый бит в каждой из ячеек па ВЫВОД ИНФОРМАЦИИ оказываются погашены. Следова
мяти AD00+0AD00+7 отвечает за ;НА ЭКРАН 8РАЗРЯДНОГО ДИСПЛЕЯ тельно, если мы на дешифратор
десятичную запятую, идущую непо АЛС318 DD3 подадим код символа, который
средственно за соответствующей ; должен быть отображен в первом
отображаемой цифрой. В нашем IZOBR: разряде, то для того, чтобы он вы
примере в числе 2,108 запятая MOV CNSKIND,#0 светился в нужном месте, на входы
должна отображаться вместе с IZOBR1: второго дешифратора (DD4) нужно
двойкой, то есть в ячейке с адресом MOV A,CNSKIND подать код, при котором бы на его
37Н должно храниться не 02Н, а INC A выходе, соединенном с катодом
12Н. Соответственно, в числе 45,27 JZ GASH первого разряда, появился лог. 0.
десятичная запятая идет после пя MOV CNSKIND,A Далее, дав небольшую задержку,
терки, то есть она хранится в виде ANL на DD3 подадим код символа, кото
единички в пятом по счету разряде A,#00000111B рый должен отобразиться во вто
числа в ячейке 32Н — там вместо MOV R0,A ром разряде, а на входы DD4 — та
05Н должно находиться 15Н. В ос LCALL DISPLEY кой код, чтобы лог. 0 появился на
тальных же ячейках, хранящих циф SJMP IZOBR1 его выходе, соединенном с като
ры 1, 0 и 8 числа 2,108, и 4, 2, 7 чис GASH: MOV P1,#11101111B дом второго разряда. Процедуру
ла 45,27, все четыре старших бита RET будем повторять до тех пор, пока не
попрежнему должны хранить не ; переберем все разряды индикато
значащие нули. ;ПРИ ВХОДЕ В ЭТУ П/П R0=0...7 (СКАНИ ра и не высветим в каждом из них
Соответственно, при отображе ;РОВАНИЕ). НАДО ПОСЧИТАТЬ AD00+R0, соответствующую цифру, затем
нии на индикаторе той или иной ци ;ПРОЧИТАТЬ ПО ЭТОМУ АДРЕСУ ЧИС еще раз, еще, еще и т. д.
фры мы в соответствующей под ЛО,ПОМЕС Обратимся снова к схеме на
программе должны не только пере ;ТИТЬ ЕГО В МЛ. 5 БИТ P1, А СОДЕРЖИ рис. 24. Заметьте, что крайний пра
нести ее из четырех младших битов МОЕ вый разряд я соединил с выходом 0
ячейки AD00+n в четыре младших ;R0 — В СТАРШИЕ 3 БИТА дешифратора DD4, второй справа
разряда порта Р1 (Р1.0Р1.3), но DISPLAY: — с выходом 1, третий — с выходом
перенести также и пятый бит ячей MOV A,#AD00 2 и т. д. Это означает, что при отоб
ки AD00+n в пятый разряд Р1, т. е. в ADD A,R0 ражении цифры, стоящей в самом
Р1.4. Вот тогда мы сможем на инди MOV R1,A правом разряде, на входах DD4
каторе увидеть не только 2108 и ;R1=AD00+R0 должен присутствовать код 000В,
4527, но и 2,108 и 45,27. MOV A,@R1 при отображении цифры во втором
И еще один момент, на который я ANL справа разряде — код 001В, в тре
хочу обратить ваше внимание. Как A,#00011111B тьем справа — код 010В, в четвер
мы договорились, дешифратор MOV R1,A том — 011В, в шестом (пятый от
DD4 может управлять восемью раз MOV A,R0 ключен подачей на его катоды еди
рядами индикатора. В то же время RR A ницы) — 100В, в седьмом — 101В, в
АЛС318 — 9разрядный, и мы хо RR A восьмом — 110В, и в девятом,
тим, чтобы средний (пятый с любо RR A крайнем слева — 111В. Вспомним
го края) разряд был всегда пога ADD A,R1 также, что цифра, которая должна
шен. Как погасить разряд, на управ MOV P1,A отобразиться в крайнем справа
ление которым у нас уже нет NOP разряде, хранится в ячейке с адре
свободного выхода дешифратора? NOP сом AD00+0, следующая — с адре
Правильно, подать на его катод NOP сом AD00+1, и т. д. Таким образом,
единичный уровень. А если бы мы NOP для реализации отображения мето
захотели погасить самый старший NOP дом динамической индикации мы,
основы схемотехники

вопервых, должны гдето в микро не завершится


контроллере иметь счетчик, после выполнение про
довательно перебирающий значе граммы. А ведь
ния 0, 1, 2, 3, 4, 5, 6, 7, 0, 1… Вовто именно это нам и
рых, когда значение этого счетчика нужно! Далее мы
(назовем его счетчиком сканирова должны это хра
ния) равно 0, то нужно отображать нящееся в акку
цифру из ячейки AD00+0, когда 1 — муляторе число
из ячейки AD00+1, и т. д. Иными перенести в три
словами, если значение счетчика старших разряда
равно n, то отображаемая цифра порта Р1 и поми Рис. 25. Последовательность выполнения трех
должна быть извлечена из ячейки мо этого приба команд RR A
AD00+n. И втретьих, вместе с ото вить его к AD00;
бражаемой цифрой мы должны найденную сумму мы возьмем в ка рит о том, что чтение должно быть
на входы дешифратора DD4 (т. е. на честве адреса ячейки, откуда из осуществлено из внутренней памя
линии Р1.5Р1.7) вывести текущее влечем отображаемую цифру (она ти данных. Следовательно, MOV
значение упомянутого счетчика. находится в младших четырех битах A,@R1 предписывает МК найти, ка
Вот, собственно, и все, что должна этой ячейки) и выведем ее в четыре кой адрес хранится в регистре R1,
сделать наша программа. младших разряда Р1. Вспомним после чего перенести в аккумуля
Как это реализовано в IZOBR? еще, что в пятом бите упомянутой тор данные из той ячейки внутрен
В ячейке памяти CNSKIND органи ячейки, как мы договаривались, него ОЗУ, адрес которой найден в
зован счетчик, значение которого в хранится разряд десятичной запя R1. Попутно отмечу, что команда
начальный момент устанавливает той. Его нужно вывести на ту линию MOV @R1,A вынуждает МК совер
ся в 0 командой MOV CNSKIND,#0. порта, которая управляет сегмен шить обратное действие — пере
В ходе выполнения программы оно том h индикатора, то есть в Р1.4 нести данные из аккумулятора в
непрерывно увеличивается — (см. программу). ячейку внутренней памяти, адрес
команда MOV A,CNSKIND перено Полученное после выполнение которой хранится все в том же R1.
сит его содержимое в аккумулятор, команды ANL A,#00000111B значе Кстати, подобный метод адреса
затем команда INC A увеличивает ние реализованного программным ции, когда адрес ячейки памяти,
его на 1, а команда MOV путем счетчика мы сохраняем в ре участвующей в обмене данными,
CNSKIND,A возвращает инкремен гистре R0 (команда MOV R0,A) и за находится в какомлибо регистре,
тированное значение обратно в тем вызываем подпрограмму носит название косвенной адреса
ячейку CNSKIND. Идущая затем DISPLAY. Последняя загружает в ак ции (адрес мы находим косвенно,
команда ANL A,#00000111B зану кумулятор число #AD00 и командой при помощи R1 или DPTR), в отли
ляет пять старших битов этого ADD A,R0 суммирует его со значе чие от прямой адресации (напри
счетчика, точнее оставшейся в ак нием счетчика, хранимого в R0. По мер, MOV A,R1), где адрес (регистр
кумуляторе его копии. Зачем? Если лученная сумма сохраняется в ре R1) в явном виде указан в команде.
вы еще не догадались, поясню. По гистре R1 (MOV R1,A). Теперь вернемся к нашей про
сле выполнения этой команды в ак Далее идет пока еще не очень грамме, от которой мы слегка от
кумуляторе остается либо 0, либо нам знакомая команда MOV A,@R1. влеклись. Чуть раньше мы нашли
1, либо 2, либо 3, либо 4, либо 5, Что она делает? Напомню, что в адрес ячейки памяти, где хранится
либо 6, либо 7. Никакой другой ци предыдущей главе, рассматривая цифра, соответствующая значению
фры там остаться не может. Чтобы регистр DPTR, мы узнали, что счетчика сканирования (счетчика,
осознать это, представьте, что команда MOVХ A,@DPTR предписы последовательно перебирающего
до выполнения команды ANL вает микроконтроллеру прочитать в значения 0, 1, 2, 3, 4, 5, 6, 7, 0, 1…).
A,#00000111B в нем была восьмер аккумулятор данные из ячейки Этот адрес, равный AD00+n, мы со
ка. Вспомним, что 8 — это внешней памяти, адрес которой хранили в R1. Затем мы вызвали ко
00001000В. Занулите ее 5 старших хранится в DPTR. Вспомнив это, вы манду MOV A,@R1. Думаю, что
бит, и получите 0. От девятки догадаетесь, что MOV A,@R1 заста всем, читающим эти строки, оче
(00001001В) после зануления 5 вит наш МК прочитать в аккумуля видно, что после выполнения по
старших бит останется 1, от десят тор данные из ячейки памяти, ад следней в аккумуляторе будет на
ки (00001010В) — двойка, и т. д., до рес которой хранится … где? Пра ходиться та самая цифра, которую
15 (00001111В), которые при этом вильно, в R1. Вспомните также, что нам надо отобразить. Но цифра эта
оставят семерку. А вот от идущего при рассмотрении команды MOVХ хранится в четырех младших битах
после 15 числа 16 (00010000В) — A,@DPTR я отметил, что Х на конце аккумулятора, а в пятом хранятся
(обратите на это внимание) — зану команды MOVХ говорит о том, что 1 или 0, зажигающие или гасящие
ление 5 старших бит оставит снова чтение должно осуществляться из десятичную запятую после отобра
0. От 17 останется единица, от 18 — внешней памяти данных. В команде жаемой цифры. Три старших бита
двойка, и т. д. же MOV A,@R1 этого Х нет, что гово пока не несут полезной информа
Таким образом, в результате вы
полнения вышеупомянутых команд
в аккумуляторе последовательно,
друг за другом, оказываются 0, 1, 2,
3, 4, 5, 6, 7. Затем эти цифры снова
повторяются в той же последова Рис. 26. Сложение аккумулятора и регистра R1
тельности, затем еще и еще, пока
основы схемотехники

тьей. Нетрудно убедиться, что,


применив ее три раза, мы добьем
ся желаемого эффекта — счетчик
сканирования из трех младших
бит переместится в три старших.
При этом в пяти младших битах
будут находиться нули.
Теперь нам осталось только сло
жить содержимое аккумулятора и
регистра R1. Делается это при по
мощи уже знакомой нам команды
ADD A,R1. Нули в трех старших
разрядах R1 не исказят при сло
жении с аккумулятором хранящие
ся в его старших трех разрядах би
ты счетчика сканирования. Пять
младших разрядов аккумулятора,
хранивших нули, при сложении с
пятью битами R1, содержащими
отображаемую цифру, в результа
те суммирования будут именно ее
и хранить (рис. 26). После этого
нам ничего не остается, как выве
сти это число в порт Р1 командой
MOV Р1,A, и требуемая цифра
Рис. 27. Схема сопряжения с индикатором с общими анодами загорится в нужном разряде
АЛС318. Дав ей погореть какоето
ции. Занулим их для надежности в связи с чем нам и пришлось его время (пока МК будет выполнять
командой ANL A,#00011111B , по вначале освободить, а затем пере поставленные для реализации за
сле чего разместим в этих старших нести в него значение счетчика ска держки команды NOP), контрол
трех битах значение счетчика ска нирования. лер осуществит возврат из под
нирования (напомню, что оно хра Перенос из младших битов в программы DISPLAY, инкременти
нится в R0 и в нашем случае равно старшие мы осуществим при по рует счетчик сканирования и
000, 001, 010, …, 110 или 111). мощи трех команд циклического приступит к отображению следую
Операция занесения счетчика сдвига аккумулятора вправо щей цифры.
сканирования в старшие биты акку (RR A). При выполнении этой ко А как быть, если мы решили
мулятора также довольно проста. манды старший, седьмой бит ак использовать индикаторы не с об
Сначала мы сохраняем значение кумулятора, переместится в шес щими катодами, а с общими
аккумулятора все в том же регистре той, шестой переедет в пятый, и анодами? Схема сопряжения с та
R1 командой MOV R1,A. Взамен это т. д., вплоть до первого. Первый ким индикатором приведена на
го числа мы переносим в аккумуля же переместится на место нулево рис. 27. Нам нужно лишь заменить
тор счетчик сканирования из R0 ко го бита, а как бы «вытолкнутый» из дешифратор 514ИД1 на 514ИД2 и
мандой MOV A,R0. Зачем? аккумулятора нулевой бит пере управлять общими анодами не на
Да потому что значение счетчика сылается на место старшего, прямую с дешифратора DD4,
сканирования хранится в трех седьмого. Сказанное поясняет а через буферные транзисторы.
младших битах R0, а нам нужно пе рис. 25, показывающий состояние Поскольку информация для деши
ренести его в три старших бита. А аккумулятора до выполнения ко фратора DD3 попрежнему выво
подобное преобразование мы мо манды RR A, после выполнения дится через младшие четыре ли
жем сделать только в аккумуляторе, первой из них, затем второй и тре нии порта Р1, а для DD4 — через
его старшие три линии, как и в
схеме, рассмотренной на рис. 24,
то для схемы на рис. 27 годится та
же программа, что и для рис. 24,
без какихлибо изменений.
Последний рассматриваемый в
качестве примера случай — сде
лать 16разрядное табло из оди
ночных индикаторов, например с
общими катодами. Фактически эта
задача почти полностью сводится
к случаю, который проиллюстри
рован на рис. 24. Объединим, как
показано на рис. 28, у всех оди
ночных индикаторов одноименные
Рис. 28. Многоразрядный индикатор из отдельных одноразрядных аноды a, b, c, d, e, f, g, а для управ
ления (необъединяемыми!) 16 ка
и з м е р и т ел ь н а я т е х н и к а

тодами используем дешифратор ;…AD00+15 НА ЭКРАН 16РАЗРЯДНОГО MOV R1,A


155ИД3 (4 в 16). Как говорилось ДИСПЛЕЯ ;R1=AD00+R0
выше, для управления последним ; MOV A,@R1
дешифратором используем линии IZOBR: MOV C,ACC.4
Р1.4Р1.7 порта Р1, а для десятич MOV CNSKIND,#0 MOV P3.0,C
ной запятой — линию Р3.0. В ос IZOBR1: ANL A,#00001111B
тальном же схема остается без из MOV A,CNSKIND MOV R1,A
менений. INC A MOV A,R0
Программа, управляющая этим JZ GASH RR A
16разрядным табло, приведена ни MOV CNSKIND,A RR A
же. Она аналогична той, что рассмо ANL RR A
трена нами чуть выше, но учитывает A,#00001111B RR A
отличия в аппаратной части — ис MOV R0,A ADD A,R1
пользование 16разрядного индика LCALL DISPLEY MOV P1,A
тора и управление десятичной запя SJMP IZOBR1 NOP
той по другой линии порта. Ком GASH: MOV P1,#11111111B NOP
ментировать эту программу я не CLR P3.0 NOP
буду — вам должно быть вполне по RET NOP
силам самостоятельно найти отли ; NOP
чия в программах и разобраться, ;ПРИ ВХОДЕ В ЭТУ П/П R0=0...15 (СКАНИ NOP
чем вызваны эти отличия. ;РОВАНИЕ).НАДО ПОСЧИТАТЬ AD00+R0, NOP
;ПРОЧИТАТЬ ПО ЭТОМУ АДРЕСУ NOP
; ЧИСЛО,ПОМЕС NOP
AD00 .EQU ;ТИТЬ ЕГО В МЛ. 4 БИТА P1, А RET
30H СОДЕРЖИМОЕ
CNSKIND .EQU ;R0 — В СТАРШИЕ 4 БИТА. ЗАПЯТУЮ В Р3.0
40H ;счетчик 0255 ; Александр Фрунзе,
; DISPLAY: alex.fru@dian.ru
;ПОДПРОГРАММА IZOBR ОБЕСПЕЧИВАЕТ MOV A,#AD00
ВЫВОД 16 ЦИФР ИЗ AD00+0… ADD A,R0 Продолжение следует

Вам также может понравиться