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 |
|
|