Файл: Учимся программировать микроконтроллеры 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