Файл: Учимся программировать микроконтроллеры Pic на языке PicBasicPro (В.В. Хилинский, 2007).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 17.06.2025
Просмотров: 1776
Скачиваний: 8
Рис. 23. Пример Жидкокристаллического индикатора.
Существует большое количество различных типов ЖКИ, но в основном (в 99%) распространены индикаторы с интерфейсом Hitachi 44780. Что же представляют собой эти индикаторы? Большинство таких индикаторов имеет 14 выводов. Назначение этих выводов приведено в таблице 27.
Таблица 30 |
|||
ВЫВОД |
ОБОЗНАЧЕНИЕ |
НАЗНАЧЕНИЕ |
|
1 |
Vdd |
Общий |
|
2 |
Vcc |
+ Питание |
|
3 |
Contrast (Vee) |
Регулировка |
|
контрастности |
|||
4 |
R/S |
_Команда/Выбор |
|
регистра |
|||
5 |
R/W |
Чтение/_Запись |
|
6 |
Е |
Тактовые импульсы |
|
7-14 |
Data |
Данные: D0 -7,…,D7 - |
|
14 |
|||
Запись информации происходит в параллельном коде по фронту тактовых импульсов Е. Можно не только записывать данные в регистры ЖКИ, но и читать их. Для этого используется цепь R/W. Для подключения шины данных можно использовать 2 режима: Это режим 8-разрядной шины, когда данные в контроллер ЖКИ передаются байтами, или режим 4-разрядной шины, когда вначале передаются старшие 4 разряда байта, а затем младшие 4 разряда. Хотя понятно, что при 4-разрядной шине количество соединений меньше и загруженность портов меньше, но при этом и скорость обмена меньше. Цепь R/S предназначена для указания типа информации, которая в данный момент подается на выводы данных. Если на линии R/S установлена логическая 1, то на шине данных можно устанавливать ASCII код, символ которого будет отображаться в текущей позиции курсора. Если же на линии R/S будет установлен логический 0, а в цепи R/W логическая 1, то можно считать код символа, отображаемого в данный момент на экране. Хотя в большинстве конструкций вывод R/W подключается к общей шине питания, так как нет необходимости использовать режим чтения. На выполнение команд ЖКИ затрачивается разное время. Например, для стирания экрана или на перемещение курсора в начальную позицию требуется около 4,1 мс, а на другие команды достаточно 160 мкс.
Запись данных производится так же, как и запись команд, только в первом случае по цепи R/S должна быть подана 1. Но использование компилятора
67
PicBasicPro избавляет Вас от необходимости изучения интерфейса с такими ЖКИ. Он все сделает сам. Для регулировки контрастности изображения Вы можете воспользоваться схемой приведенной на рисунке 24.
Рис. 24. Схема подключения регулятора контрастности к ЖКИ.
Следующий пример хотя и является простым, но на его основе может быть построено большое число различных устройств. В этом примере, мы будем считывать напряжение с движка потенциометра, осуществлять аналого-цифровое преобразование этого напряжения и выводить результат этого преобразования на экран ЖКИ. При этом мы будем конвертировать значение на выходе АЦП в десятичный формат. Причем значение выводимое на экран будет соответствовать измеряемому напряжению. В нашем примере мы будем использовать ЖКИ имеющий две строки по 16 знакомест в каждой (2 x16). Схема для этого примера приведена на рисунке 25.
Рис. 25. Схема подключения ЖКИ к микроконтроллеру.
68
Программа:
' ——[ Определения ]—————————————————————-
DEFINE LCD_DREG PORTB |
' Определяем порт, к которому подключены |
‘ цепи данных. |
|
DEFINE LCD_DBIT 4 |
' Определяем первый вывод, к которому |
‘ подключена шина данных, |
|
DEFINE LCD_RSREG PORTB |
' Определяем порт, к которому подключена |
‘ цепь RS. |
|
DEFINE LCD_RSBIT 3 |
' Определяем вывод, к которому подключена |
‘ цепь RS. |
|
DEFINE LCD_EREG PORTB |
' Определяем порт, к которому подключена |
‘ цепь E. |
|
DEFINE LCD_EBIT 0 |
' Определяем вывод, к которому подключена |
‘ цепь E. |
|
DEFINE LCD_BITS 4 |
' Определяем режим 4 – разрядной шины. |
DEFINE LCD_LINES 2 |
' Определяем тип ЖКИ. |
DEFINE LCD_COMMANDUS 2000 |
' Определяем время задержки между |
‘ командами на ЖКИ. |
|
DEFINE LCD_DATAUS 50 |
' Определяем время задержки между |
‘ посылками данных. |
|
' Определяем параметры АЦП |
DEFINE ADC_BITS 8 ' Определяем разрядность преобразования DEFINE ADC_CLOCK 3 ' Определяем источник синхронизации для АЦП DEFINE ADC_SAMPLEUS 50 ' Определяем время преобразования
' Назначение переменных
Res Var Word ' Определяем переменную, в которую записывается ‘ результат АЦП
Volts1 Var Word ' Первые два десятичных разряда результата в мВ Volts2 Var Word ' Вторые два десятичных разряда результата в мВ
' Константы
69
Conv1 Con 19 ' 5000/256 = 19.53, this is the decimal part
Conv2 Con 53 ' Это дробная часть числа
' Инициализация |
|||
TRISA = |
1 |
' Устанавливаем вывод RA0 (AN0) на вход |
|
TRISB |
= |
0 |
' Весь PORTB на выход |
PAUSE |
500 |
' Ждем 0.5 сек инициализации ЖКИ |
|
ADCON1 = |
0 |
' Устанавливаем выводы AN0 - AN4 как аналоговые входа |
||
OPTION_REG = %00000000 |
‘ Подключаем подтягивающие резисторы |
|||
ADCON0 = |
%11000001 |
' Устанавливаем внутренний источник |
||
‘ синхронизации АЦП |
||||
LCDOUT $FE, 1 |
' Очищаем экран ЖКИ |
|||
Main: |
||||
ADCIN 0, |
Res |
' Считываем аналоговое значение и сохраняем в |
||
‘ переменной Res |
||||
Volts1 = |
Res * Conv1 |
' Умножаем это значение на 19 |
||
Volts2 = |
Res * Conv2 |
' Умножаем это значение на 53 |
||
Volts2 = |
Volts2 / 100 |
' Получаем результат в милливольтах |
||
Volts1 = |
Volts1 + Volts2 |
|||
LCDOUT $FE,2,"V = ",DEC4 Volts1 ' Выведем результат на дисплей
PAUSE 500 |
' Ждем 0,5 секунд |
GOTO Main |
|
END |
Впервой части программы мы определяем порты и выводы микроконтроллера,
ккоторым подключается ЖК-индикатор. Здесь мы также определяем тип и параметры работы индикатора. Затем идет блок определений, касающийся работы АЦП. Далее следуют блоки определений переменных и констант. Следующим блоком идет блок инициализации работы портов АЦП и портов ЖКИ. И последний блок это собственно сама программа. В первой строке программы находится уже знакомая нам команда. По этой команде происходит считывание и аналого-цифровое преобразование значения напряжения на движке потенциометра подключенного к PORTA.0. Затем мы производим преобразование полученного восьмиразрядного значения Res в шестнадцатиразрядное десятичное
70
значение. Так как максимальное значение напряжения, которое в нашем случае может быть подано на вход АЦП равно 5000 мВ, а максимальное значение переменной Res может быть 255, следовательно, цена одного бита информации в этом случае равна 5000/256 = 19,53 мВ. К сожалению, в компиляторе PicBasicPro отсутствуют переменные с плавающей точкой, поэтому мы вынуждены для перевода значений полученных в результате АЦП в милливольты, должны будем коэффициент перевода (19,53) разделить на две части это целая часть и дробная часть. Далее произведем отдельно конвертирование целой части и дробной части. Затем полученные результаты сложим. В следующей строке мы сталкиваемся с новым для нас оператором: LCDOUT $FE,2,"V = ",DEC4 Volts1. По этой команде микроконтроллер выводит, начиная с первой строки и первого знакоместа строку текста - «V = ». Затем после этого текста выводится десятичное значение переменной Volts, которое должно состоять из 4 разрядов. Далее в программе следуют уже известные нам команды.
Кроме жидкокристаллических индикаторов еще широко используются так называемые семи сегментные светодиодные индикаторы. В следующем примере будет рассмотрена работа микроконтроллера с одним из таких индикаторов.
Пример № 7. Подключение 7 сегментного светодиодного индикатора.
Для отображения цифр и некоторых букв часто используется 7-сегментный светодиодный индикатор. В таких индикаторах катоды или аноды всех светодиодов соединены друг с другом и имеют один общий вывод. В этом случае уменьшается количество внешних выводов. Поэтому различают светодиодные индикаторы с общим катодом или с общим анодом.
В примере, который мы будем разбирать ниже, используется такой 7- сегментный светодиодный индикатор с общим катодом. Индикаторы, подобные этому, используются в цифровых часах или в старых калькуляторах.
Управление 7-сегментным индикатором, в принципе, то же самое, что и управление семью отдельными светодиодами. Каждый сегмент 7-сегментного индикатора является отдельным светодиодом, но они имеют либо общий катод, либо общий анод, который выведен на один контакт. На рисунке 26 приведена схема соединений светодиодов и обозначение сегментов такого индикатора.
Рис. 26. Схема внутренних соединений 7-сегментного светодиодного индикатора.
71
Мы будем использовать PORTB микроконтроллера PIC 16F877А для того, чтобы управлять каждым сегментом индивидуально. Наша программа будет считать от 0 до 9, и затем зажжет светодиод, который является децимальной точкой в таком индикаторе. Затем программа произведет обратный счет и также в конце зажжет децимальную точку. В этой программе демонстрируется использование новой для нас команды – Lookup, с помощью которой происходит преобразование десятичной цифры в код вывода этой цифры индикатором. На Рис. 27. приведена схема для этого примера.
Рис. 27. Схема примера с 7-сегментным индикатором. |
||
Программа: |
||
x var |
byte |
' Введем переменную счета. |
numb1 |
var byte |
' переменная, в которой хранится код вывода |
' на 7-с сегментный индикатор. |
||
‘ Инициализация
TRISB = %00000000 ' Установить все выводы PORTB на выход. PORTB = %00000000 ' Установить все выводы PORTB в низкое
‘состояние.
‘Основная программа
Main:
FOR x |
= 0 TO |
9 |
‘ Оператор цикла, который ведет счет от 0 до 9 |
GOSUB |
convrt |
' Переход на подпрограмму конвертации. |
72
portb |
= numb1 |
||
PAUSE |
1000 |
' Пауза длительностью в 1 сек |
|
NEXT |
|||
HIGH 0 PORTB.0 |
' Счет достиг максимума - 9, поэтому зажигаем |
||
‘ децимальную точку. |
|||
pause |
1000 |
||
LOW 0 PORTB.0 |
' Выключаем децимальную точку. |
||
FOR x |
= 9 TO 0 STEP -1 |
' Обратный счет от 9 до 0. |
|
GOSUB |
convrt |
||
PORTB = numb1 ' Установить соответствующий вывод PORTB для отображения цифры ‘на 7- сегментном индикаторе.
PASE 1000 ' Пауза в 1 сек.
NEXT
HIGH 0 PORTB.0 |
' Счет достиг 0, поэтому зажигаем децимальную |
‘ точку. |
|
PAUSE 1000 |
' Пауза длиной в 1 сек. |
LOW 0 PORTB.0 |
' Выключаем децимальную точку. |
GOTO loop |
' Возврат к началу. |
' Подпрограмма преобразования десятичного числа в 7-сегментный код. convrt:
lookup x[$7E,$0C,$B6,$9E,$CC,$DA,$F8,$0E,$FE,$CE],numb1
Return
Начало этого примера, я думаю, никаких затруднений у Вас не вызовет. Здесь все уже Вам знакомо. Мы определяем переменные, затем делаем начальные установки и далее переходим к основной программе. Программа начинается с того, что с помощью оператора цикла FOR... TO...NEXT ведется счет от 0 до 9. Но когда мы производим счет, мы постоянно обращаемся к оператору GOSUB, который отсылает нас к подпрограмме конвертации десятичных цифр в код 7- сегментного индикатора. Преобразование это совершается с помощью оператора LOOKUP. Этот оператор позволяет нам выбирать значения из таблицы - [$7E,$0C,$B6,$9E,$CC,$DA,$F8,$0E,$FE,$CE] в зависимости от индекса (х) и
присваивать эти значения переменной - numb1. Так, например, если значение х = 0, то выбирается нулевое значение, т.е. $7E, а если х = 5, выбирается четвертое значение - $CC. Коды цифр в таблице даны в шестнадцатеричной системе - об этом указывает префикс - $. Хотя их можно было бы записать и в двоичной, и десятичной системах, но тогда бы на это ушло больше места в тексте программы. На рисунке 41 показано обозначение сегментов такого индикатора. Нулевое значение в таблице равно $7E или в двоичной системе %1111110. Здесь мы видим, что на все сегменты, кроме последнего – G, подается логическая единица, а это значит, что будет светиться цифра – 0.
73