Во многих случаях в микроконтроллерных устройствах требуется наличие только простой индикации типа ДА/НЕТ, ВКЛ/ВЫКЛ. Такая индикация реализуется на основе отдельных светодиодов.
Для отображения многосимвольной информации используются линейные (однострочные) дисплеи. Такие дисплеи представляют собой «линейку» индикаторов (светодиодных или жидкокристаллических). Число знакомест дисплея определяется в соответствии с требованиями к МКУ. При этом, для отображения цифровой и буквенной информации широко используется семисегментные индикаторы (ССИ). Семь отображающих элементов позволяют высвечивать десятичные и шестнадцатеричные цифры, некоторые буквы русского и латинского алфавита, а также некоторые специальные символы.
Существуют два способа отображения многосимвольной информации: статический и динамический.
Первый требует наличия на входах каждого индикатора специальных буферных регистров для хранения кодов выводимых символов. Естественно, что с увеличением разрядности дисплея возрастает число дополнительных регистров, а следовательно, и стоимость МКУ.
Второй способ (динамический) основан на том, что любой световой индикатор является инерционным прибором, а человеческому глазу отображаемая на дисплее информация, если ее обновлять с частотой более 20 раз в секунду, представляется неизменяемой. Динамический способ вывода информации на дисплей требует значительно меньших аппаратурных затрат, но более сложного программного обеспечения. Именно этот способ организации отображения информации получил преимущественное распространение в МКУ.
Рассмотрим задачу, в которой необходимо предложить вариант микроконтроллерного устройства для динамической индикации 8-ми разрядных десятичных чисел на семисегментных жидкокристаллических индикаторах (ЖКИ). Индицируемые десятичные числа представляют собой результат вычислений, хранящихся в виде двоичных кодов в памяти данных микроконтроллера типа PIC 16F84.
Данную задачу можно решить различными способами. Рассмотрим более подробно один из возможных вариантов решения поставленной задачи. Для реализации исходного технического задания в данном случае необходимо осуществлять следующее (рис. 9.1.):
1. Переписать исходные двоичные коды чисел, подлежащих индкции, из регистров DATx, в которых они формируются в процессе обработки данных в МК, в регистры хранения INPx, отведенные для этих целей в памяти данных микроконтроллера.
2. Преобразовать исходные двоичные коды в двоично-десятичные (2/10-е) и записать результат в регистры вывода OUTx, отведенные для этого также в памяти данных.
Рис. 9.1. Общий алгоритм программы
3. Вывести полученные данные для индикации на восьмиразрядном линейном дисплее, состоящем из 8-ми ЖКИ индикаторов.
Причем, для осуществления динамической индикации 8-ми разрядных десятичных чисел необходимо выполнить следующие действия:
1) Сформировать 3-х разрядный двоичный код адреса очередного знакоместа (индикатора) в восьмиразрядном дисплее.
2) Преобразовать полученный код адреса в сигналы выбора очередного индикатора ВБР-И.
3) Преобразовать двоично-десятичный код, соответствующий выбранному разряду числа, в семисегментный код ВБР-С, позволяющий засветить необходимые сегменты (обеспечить протекание тока через сегменты) в выбранном индикаторе.
4) Засвечивать выбранные сегменты на протяжении не менее (7-10) мс. Для этого можно использовать временную задержку выбора следующего индикатора.
5) Повторить п.1- 4 для каждого знака 8-ми разрядного десятичного числа. Таким образом, в одном полном цикле индикации числа п.1-4 повторяются восемь раз.
6) Повторять п.1-5 непрерывно пока включено питание устройства (Питание вкл.?). Для этого необходимо организовать внешний цикл регенерации, во время которого при необходимости можно будет осуществлять смену кодов чисел в регистрах хранения INPx.
Перечисленные выше функции можно реализовать либо чисто программным способом, либо с привлечением дополнительных аппаратных средств. Второй способ более предпочтителен, так как требует меньшего количества линий ввода/вывода и освобождает микроконтроллер от выполнения действий по п.2 и п.3 предложенного выше алгоритма индикации. Для этого необходимо использовать два дешифратора DC1 и DC2, первый из которых предназначен для реализации п.2, а второй п.3 рассмотренного алгоритма. Подключение DC1, DC2 и ЖКИ к выводам портов А и В показано на рис. 9.2.
На основании рассмотренных выше принципов построения устройства для динамической индикации, алгоритма его функционирования и распределения памяти данных можно предложить вариант текста программы (INDIK-D1), который приведен ниже:
;Текст фрагмента программы INDIK-D1
LIST P=PIC16C84
; Секция заголовка
; Описание специальных регистров
STATUS EQU 03H
PORTA EQU 05H
PORTB EQU 06H
INTCON EQU 0BH
TRISA EQU 05H
TRISB EQU 06H
; Описание битов регистра STATUS
RP0 EQU 05H ; Выбор страницы памяти данных
; Описание битов регистра INTCON
GIE EQU 07H ; Запрещение/разрешение всех
; прерываний
; Описание битов порта В
RB0 EQU 00H ; Выводы порта В предназна-
RB1 EQU 01H ; ченные для выдачи двоично-
RB2 EQU 02H ; десятичного кода разряда
RB3 EQU 03H ; числа (4 бита) на дешифратор
; DC2 с целью дальнейшего
; преобразования в семи-
; сегментный код ВБР-С
; (7 бит)
; Описание битов порта А
RA0 EQU 00H ; Выводы порта А предназна-
RA1 EQU 01H ; ченные для выдачи двоичного
RA2 EQU 02H ; кода адреса разряда числа
; (3 бита) на дешифратор DC1
; с целью формирования сигналов
; выбора одного из 8-ми индика-
; торов (ВБР-N)
; Описание регистров памяти данных
DELAY0 EQU 00CH ; Регистры-счетчики для органи-
DELAY1 EQU 00DH ; зации задержки (DELAY) боль-
; шой длительности (7-10 мс)
DAT0 EQU 00EH ; Регистры в которых формиру-
DAT1 EQU 00FH ; ются двоичные коды чисел
DAT2 EQU 010H ; (данные), подлежащие инди-
; кации
INP1 EQU 011H ; Регистры хранения двоичного
INP2 EQU 012H ; кода индицируемого числа
INP3 EQU 013H
OUT0 EQU 014H ; Регистры хранения двоично-
OUT1 EQU 015H ; десятичного кода индици-
OUT2 EQU 016H ; руемого числа
OUT3 EQU 017H
; Рабочая секция
; Начало основной программы
ORG 00H ; Следующая команда будет
; расположена по адресу 00H
GOTO BEGIN
INDIK ; Вывод на индикатор (Процедура
; динамической индикации)
BSF STATUS, fRP0 ; Устанавливаем активной
; вторую страницу памяти
MOVLW B ’00000000’ ; Устанавливаем направления ра- MOVLW TRISA ; боты всех выводов порта А
; на вывод информации
MOVLW B ’00000000’ ; Устанавливаем направление ра-
MOVLW TRISB ; боты всех выводов порта В
; на вывод информации
BCF STATUS, RP0 ; Делаем активной снова первую ; страницу памяти
NEXT CLRW ; Очищаем регистр W
MOVLW PORTA ; Записываем адрес сегмента В
; порт А
MOVF OUT0, 0 ; Записываем данные для сегмен- MOVWF PORTB ; та в порт В
CALL DELAY ; Вызываем процедуру
; задержки
INCF PORTA, 1 ; Остальная часть программы выпол
; няет аналогичные действия
SWAPF OUT0, 0
MOVWF PORTB
CALL DELAY
INCF PORTA, 1
MOVF OUT1, 0
MOVWF PORTB
CALL DELAY
INCF PORTA, 1
SWAPF OUT1, 0
MOVWF PORTB
CALL DELAY
INCF PORTA, 1
MOVF OUT2, 0
MOVWF PORTB
CALL DELAY
INCF PORTA, 1
SWAPF OUT2, 0
MOVWF PORTB
CALL DELAY
INCF PORTA, 1
MOVF OUT3, 0
MOVWF PORTB
CALL DELAY
INCF PORTA, 1
SWAPF OUT3, 0
MOVWF PORTB
CALL DELAY
GOTO NEXT
DELAY ; Процедура задержки на 200000 тактов (DELAY-H)
MOVLW 0FFH
MOVWF DELAY0
DELAY_0
MOVLW 0FFH
MOVWF DELAY1
DELAY_1 DECFSZ DELAY1, 1
GOTO DELAY_1
DECFSZ DELAY0, 1
GOTO DELAY_0
RETURN
BEGIN
MOVF DAT0, 0 ; Запись, сформированного в
MOVWF INP1 ; регистрах DAT0, DAT1 и DAT2
MOVF DAT1, 0 ; двоичного кода числа в реги-
MOVWF INP2 ; стры хранения INP1,INP2,INP3
MOVF DAT2, 0
MOVWF INP3
CALL BIN-DEC ; Данная процедура переводит
; двоичный код, хранимый в регистрах INP1,INP2,INP3 (причем старший
; байт в регистре INP1, а младший в регистре INP3), в двоично-десятичный
; код потетрадно в регистры OUT0, OUT1, OUT2, OUT3.
; При этом старшая тетрада регистра OUT0 содержит двоичный код
; старшего разряда десятичного числа, а младшая тетрада регистра OUT3
; содержит двоичный код младшего разряда десятичного числа.
GOTO INDIK ; Процедура индикации
END ; Конец программы
Этот фрагмент можно оформить как стандартную подпрограмму для динамической индикации INDIK-D1. Поэтому, а также с целью упрощения примера, подпрограмма преобразования двоичного кода индицируемого числа в двоично-десятичный код BIN-DEC не включена в текст приведенного фрагмента программы. Она аналогична подпрограмме BIN-DEC1, рассмотренной ранее.