10.2.1. Устройство управления четырьмя светодиодами
На рис. 10.2 приведена схема устройства для управления четырьмя светодиодами.

Рис. 10.2. Принципиальная схема устройства управления светодиодами
Ниже приводится текст программы "бегущий огонь" для данной схемы.
| ; WALKLEDS.ASM | |||||
| LIST | P=16C84 | ||||
| ; | |||||
| PORTB | EQU | ||||
| TRISB | EQU | 86h | |||
| OPTREG | EQU | 81h | |||
| STATUS | EQU | ||||
| CARRY | EQU | ||||
| RP0 | EQU | ||||
| MSB | EQU | ; номер бита для крайнего слева | |||
| светодиода | |||||
| ; | |||||
| CLRF | PORTB | ; погасить все светодиоды | |||
| BSF | STATUS, RP0 | ; выбрать регистровый банк 1 | |||
| CLRF | TRISB^80h | ; установить все разряды PORTB | |||
| на вывод информации | |||||
| MOVWF | 0Ah | ||||
| MOVLW | OPTREG^80h | ; настроить предварительный | |||
| делитель в WDT на (1:4) | |||||
| BCF | STATUS, RP0 | ; выбрать регистровый банк 0 | |||
| INCF | PORTB, F | ; включить крайний справа | |||
| светодиод | |||||
| BCF | STATUS, CARRY | ; очистить флаг CARRY | |||
| LEFT | SLEEP | ; подождать тайм-аута WDT | |||
| RLF | PORTB, F | ; сдвинуть содержимое индикатора | |||
| влево | |||||
| BTFSS | PORTB, MSB | ; достигли крайней левой позиции? | |||
| GOTO | LEFT | ; если нет – цикл | |||
| RIGHT | SLEEP | ; подождать тайм-аута WDT | |||
| RRF | PORTB, F | ; сдвинуть содержимое индикатора | |||
| вправо | |||||
| BTFSS | PORTB, 0 | ; достигли крайней левой позиции? | |||
| GOTO | RIGHT | ; если нет – цикл | |||
| GOTO | LEFT | ; начать новый цикл | |||
| END | |||||
Программа "бегущий огонь" предназначена для использования четырех светодиодов, но можно изменять значение MSB для использования большего количества светодиодов: для количества светодиодов 5, 6, 7 и 8 значения MSB должны быть 4, 5, 6 и 7 соответственно.
10.2.2. Управление ЖКИ с помощью последовательного адаптера
Несмотря на широкое применение символьных жидкокристаллических дисплеев (ЖКД), использование ЖКИ по-прежнему остается одним из распространенных способов реализации цифровых отсчетных устройств в измерительной аппаратуре с малым энергопотреблением. Это обусловлено прежде всего тем, что ЖКИ, в отличие от ЖКД, имеют более широкий диапазон рабочих температур и напряжений, а также широкий диапазон габаритов символов.
Управление ЖКИ с помощью микроконтроллеров PIC16C92x, имеющих LCD модуль, не всегда представляется целесообразным.
Для управления ЖКИ можно использовать как последовательные, так и параллельные адаптеры. Управление параллельным адаптером реализуется очень просто, применением команды MOVWF PORTx для записи подготовленных данных в регистр адаптера. Однако использование параллельных адаптеров не всегда является оптимальным (например, если все порты ввода/вывода используются по нескольким назначениям и (или) количество этих портов небольшое).
Применение последовательного адаптера требует наличия у микроконтроллера всего трех свободных (или относительно свободных) линий ввода/вывода.
Фирма Microchip Technology Incorporated производит очень удобный и недорогой последовательный адаптер символьного 32-сегментного ЖКИ AY0438.
На рис. 10.3 приводится функциональная схема управления ЖКИ через адаптер AY0438 микроконтроллерами среднего семейства.
Ниже приводится текст программы, написанной для MPASM, реализующей управление ЖКИ.
; AY0438.ASM
LIST p=16C71, f=inhx8m
;******************************************************************
; Соединение выводов PORTB с адаптером AY0438:
; PORTB.0 ® CLK (тактовый сигнал для сдвига данных в регистре AY0438)
; PORTB.1 ® DATA IN (входные данные для регистра сдвига AY0438)
; PORTB.2 ® LOAD (сигнал окончания загрузки данных в регистр сдвига AY0438)
;
; ЖКИ соединяется с AY0438 следующим образом:
; Старший разряд ® сегменты с 1-го по 7-й
; Третий разряд ® сегменты с 9-го по 15-й
; Второй разряд ® сегменты с 17-го по 23-й
; Младший разряд ® сегменты с 25-го по 31-й
; Выводы децимальных точек индикатора не присоединены, но могут подключаться
; к выводам адаптера: SEG8, SEG16, SEG24, SEG32.
; Для каждого разряда сегменты подключаются так:
; SEG A ® SEG(8n + 1)
; SEG B ® SEG(8n + 2)
; SEG C ® SEG(8n + 3)
; SEG D ® SEG(8n + 4)
; SEG E ® SEG(8n + 5)
; SEG F ® SEG(8n + 6)
; SEG G ® SEG(8n + 7)
; где n = 0, 1, 2, 3 для старшего, 3-го, 2-го, младшего разрядов ЖКИ соответственно.
; В программе приняты обозначения регистров:
; MSD, THRDSD, SCNDSD и LSD для определения цифр, выводимых на AY0438.
; В данном примере кнопка, соединенная с PORTB.7, периодически проверяется,
; и, если она нажата, данные, расположенные в регистрах от MSD до LSD,
; выводятся на соответствующие разряды ЖКИ.
;******************************************************************

Рис. 10.3. Функциональная схема управления ЖКИ через адаптер AY0438
| #include p16с71.inc | ||||
| _CONFIG 03FF3; RC генератор | ||||
| ; | ||||
| MSD | EQU | 0x20 | ||
| THRDSD | EQU | 0x21 | ||
| SCNDSD | EQU | 0x22 | ||
| LSD | EQU | 0x23 | ||
| COUNT | EQU | 0x24 | ||
| TEMP | EQU | 0x25 | ||
| PORTB | EQU | 0x06 | ||
| #DEFINE | CLK | PORTB, 0 | ||
| #DEFINE | DATAIN | PORTB, 1 | ||
| #DEFINE | LOAD | PORTB, 2 | ||
| #DEFINE | UPDATELCD | PORTB, 7 | ||
| W | EQU | |||
| STATUS | EQU | 0x03 | ||
| C | EQU | |||
| RP0 | EQU | |||
| OPTION | EQU | 0x81 | ||
| RBPU | EQU | |||
| PCL | EQU | 0x02 | ||
| PCLATH | EQU | 0x0A | ||
| ; | ||||
| ; | ||||
| ORG | ||||
| GOTO | START | |||
| ; | ||||
| ORG | 0x10 | |||
| ; | ||||
| ; Эта таблица кодировки цифр должна быть всегда расположена на странице 0 | ||||
| ; для работы данной программы | ||||
| ; | ||||
| DECODEVALUE | ||||
| ADDWF | PCL | |||
| RETLW | B'00111111' | ; код цифры "0" | ||
| RETLW | B'00000110' | ; код цифры "1" | ||
| RETLW | B'01011011' | ; код цифры "2" | ||
| RETLW | ; код цифры "3" | |||
| RETLW | ; код цифры "4" | |||
| RETLW | ; код цифры "5" | |||
| RETLW | ; код цифры "6" | |||
| RETLW | ; код цифры "7" | |||
| RETLW | ; код цифры "8" | |||
| RETLW | ; код цифры "9" | |||
| ; | ||||
| START | ||||
| CLRF | PORTB | |||
| BSF | STATUS, RP0 | ; настроить линии 0, 1, 2 | ||
| PORTB как выходы | ||||
| MOVLW | B'11111000' | ; сигналы управления адап- | ||
| тером установить в "0" | ||||
| MOVWF | PORTB | |||
| BCF | OPTION, RBPU | ; разрешить включение | ||
| кнопки | ||||
| BCF | STATUS, RP0 | |||
| WAIT | ||||
| BTFSC | UPDATELCD | ; кнопка нажата (низкий | ||
| уровень)? | ||||
| GOTO | WAIT | ; если нет, то перейти на | ||
| метку WAIT | ||||
| BCF | LOAD | ; если да, то установить сиг- | ||
| нал LOAD = 0 | ||||
| MOVF | LSD, W | ; получить значение цифры | ||
| младшего разряда | ||||
| CLRF | PCLATH | ; PCH = 0 | ||
| CALL | DECODEVALUE | ; кодировать данное значение | ||
| CALL | SEND8 | ; последовательный вывод | ||
| значений сегментов | ||||
| MOVF | SCNDSD, W | ; получить значение цифры | ||
| 2-го разряда | ||||
| CALL | DECODEVALUE | ; кодировать данное значение | ||
| CALL | SEND8 | ; последовательный вывод | ||
| значений сегментов | ||||
| MOVF | THRDSD, W | ; получить значение цифры | ||
| 3-го разряда | ||||
| CALL | DECODEVALUE | ; кодировать данное значение | ||
| CALL | SEND8 | |||
| MOVF | MSD, W | ; получить значение цифры | ||
| старшего разряда | ||||
| CALL | DECODEVALUE | ; кодировать данное значение | ||
| CALL | SEND8 | ; последовательный вывод | ||
| значений сегментов | ||||
| BSF | LOAD | ; установить сигнал LOAD = 1 | ||
| BCF | LOAD | ; установить сигнал LOAD = 0 | ||
| KEYRELEASED | ||||
| BTFSS | UPDATELCD | ; ждать нажатия кнопки | ||
| GOTO | KEYRELEASED | |||
| GOTO | WAIT | ; повторить цикл. | ||
| ; | ||||
| ; SEND8 посылает 8 битов данных, расположенных в регистре W, на адаптер | ||||
| ; | ||||
| SEND8 | ||||
| MOVWF | TEMP | ; переслать текущее содержимое | ||
| регистра W в TEMP | ||||
| MOVLW | .8 | ; установка на 8 | ||
| MOVWF | COUNT | ; счетчика битов | ||
| SENDLOOP | ||||
| BCF | DATAIN | ; установить DATA IN = 0 | ||
| RRF | TEMP | ; циклический сдвиг значения | ||
| вправо через перенос | ||||
| BTFSC | STATUS, C | ; пропустить, если бит равен "0" | ||
| BSF | DATAIN | ; иначе установить DATA IN = 1 | ||
| BSF | CLK | ; установить CLK = 1 | ||
| BCF | CLK | ; установить CLK = 0 | ||
| DECFSZ | COUNT | ; декрементировать COUNT и | ||
| проверить на "0" | ||||
| GOTO | SENDLOOP | ; вывести следующий бит, если | ||
| COUNT ¹ 0 | ||||
| RETURN | ; возврат из процедуры, если | |||
| COUNT = 0 | ||||
| ; | ||||
| END |
10.2.3.Аналого-цифровое преобразование
Функциональная схема 4-канального 8-разрядного преобразователя
напряжение – код (АЦП) приведена на рис. 10.4. Здесь в качестве опорного напряжения используется VDD. Входные напряжения поданы на входы RA0 – RA3. Микроконтроллер PIC16C71 использует внутренний RC генератор.

Рис. 10.4. Функциональная схема 4-канального АЦП
Ниже приводится макет текста программы, написанный для MPASM, реализующий работу 4-канального 8-разрядного АЦП.
| ; Инициализация АЦП. | |||
| ; Выбор СН0:СНЗ, внутренний RC генератор. | |||
| ; Запись результата в 4 регистра, начиная с адреса ADTABLE (10h) | |||
| ; | |||
| ; Инициализация | |||
| BSF | STATUS, PR0 | ; Выбор банка 1 | |
| MOVLW | B'00000000' | ; Выбор RA3:RA0 как | |
| MOVWF | ADCON1 | ; аналоговых входов | |
| BCF | STATUS, PR0 | ; Выбор банка 0 | |
| MOVLW | B'11000001' | ; Выбор канала 0, внутреннего | |
| RC | |||
| MOVWF | ADCON0 | ; генератора, включение АЦП | |
| MOVLW | ADTABLE | ; Установка начала таблицы... | |
| MOVWF | FSR | ; записи результата | |
| ; | |||
| NEW_AD | CALL | SAMPLE-DELAY | ; Временная пауза |
| BSF | ADCON0, 2 | ; Старт преобразования | |
| LOOP | |||
| BTFSC | ADCON0, 2 | ; Преобразование завершено? | |
| GOTO | LOOP | ; Если нет – цикл | |
| ; | |||
| MOVF | ADRES, W | ; Чтение результата преобра- | |
| зования | |||
| MOVWF | ; Сохранение результата в | ||
| таблице | |||
| MOVLW | ; Выбор следующего канала | ||
| ADDWF | ADCON0 | ; | |
| BCF | ADCON0, CHS2 | ; Защита от переполнения | |
| ; Вычисление позиции записи результата в таблицу | |||
| CLRF | TEMP | ; Очистка регистра temp | |
| BTFSC | ADCON0, CHS0 | ; Проверка установки бита CHS0 | |
| BSF | TEMP, 0 | ; Если текущий канал СН1, СНЗ | |
| BTFSC | ADCON0, CHS1 | ; Проверка установки бита CHS0 | |
| BSF | TEMP, 1 | ; Если текущий канал СНО, СН2 | |
| MOVLW | ADTABLE | ; Запись нового значения | |
| ADDWF | TEMP, W | ; позиции таблицы в регистр | |
| MOVWF | FSR | ; указатель косвенной адресации | |
| GOTO | NEW_AD |






