Текстовый экран 16×2 [Амперка / Вики]
Текстовый экран 16×2 пригодится для вывода показаний датчиков, отображения простых меню, подсказок и приветствий.
Видеообзор
Подключение и настройка
Дисплей MT-16S2H предназначен для вывода текста на латинице и кириллице.
Экран имеет 16 контактов для питания логики, взаимодействия с управляющей электроникой и подсветки.
Вывод | Обозначение | Описание |
---|---|---|
1 | GND | Общий вывод (земля) |
2 | Vcc | Напряжение питания (3,3—5 В) |
3 | Vo | Управление контрастностью |
4 | RS | Выбор регистра |
5 | R/W | Выбор режима записи или чтения |
6 | E | Разрешение обращений к индикатору (а также строб данных) |
7 | DB0 | Шина данных (8-ми битный режим)(младший бит в 8-ми битном режиме) |
8 | DB1 | Шина данных (8-ми битный режим) |
9 | DB2 | Шина данных (8-ми битный режим) |
10 | DB3 | Шина данных (8-ми и 4-х битные режимы)(младший бит в 4-х битном режиме) |
11 | DB4 | Шина данных (8-ми и 4-х битные режимы) |
12 | DB5 | Шина данных (8-ми и 4-х битные режимы) |
13 | DB6 | Шина данных (8-ми и 4-х битные режимы) |
14 | DB7 | Шина данных (8-ми и 4-х битные режимы) |
15 | +LED | + питания подсветки |
16 | –LED | – питания подсветки |
Дисплей может работать в двух режимах:
8-битный режим — в нём используются и младшие и старшие биты (
DB0
—DB7
)4-битный режим — в нём используются только младшие биты (
DB4
—DB7
)
Использовать восьмибитный режим не целесообразно. Для его работы требуется на 4 дополнительные ноги, а выигрыша по скорости практически нет.
Подключение дисплея к управляющей плате
В качестве примера подключим дисплей к управляющей плате Arduino Uno. Для подключения понадобится Breadboard Half и соединительные провода «папа-папа».
Вывод | Обозначение | Пин Arduino Uno |
---|---|---|
1 | GND | GND |
2 | Vcc | 5V |
3 | Vo | GND |
4 | RS | 12 |
5 | R/W | GND |
6 | E | 11 |
7 | DB0 | — |
8 | DB1 | — |
9 | DB2 | — |
10 | — | |
11 | DB4 | 5 |
12 | DB5 | 4 |
13 | DB6 | 3 |
14 | DB7 | 2 |
15 | Vcc | 5V |
16 | GND | GND |
Аналогично можно подключить дисплей к платформе Iskra JS.
Вывод | Обозначение | Пин Iskra JS |
---|---|---|
1 | GND | GND |
2 | Vcc | 5V |
3 | Vo | GND |
4 | RS | P12 |
5 | R/W | GND |
6 | E | P11 |
7 | DB0 | — |
8 | DB1 | — |
9 | DB2 | — |
10 | DB3 | — |
11 | DB4 | P5 |
12 | DB5 | P4 |
13 | DB6 | P3 |
14 | DB7 | P2 |
15 | Vcc | 5V |
16 | GND | GND |
Примеры работы для Arduino
Для упрощения работы с LCD-дисплеем используйте встроенную библиотеку Liquid Crystal. В ней вы найдёте примеры кода с подробными комментариями.
Библиотека подходит как для работы с контроллерами на AVR-платформе, так и с ARM-контроллерами.
Вывод текста
Для вывода первой программы приветствия, воспользуйтесь кодом вроде этого:
- helloWorld.ino
// подключаем стандартную библиотеку LiquidCrystal #include <LiquidCrystal.h> // инициализируем объект-экран, передаём использованные // для подключения контакты на Arduino в порядке: // RS, E, DB4, DB5, DB6, DB7 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // устанавливаем размер (количество столбцов и строк) экрана lcd.begin(16, 2); // печатаем первую строку lcd.print("Hello world"); // устанавливаем курсор в колонку 0, строку 1 // на самом деле это вторая строка, т.к. нумерация начинается с нуля lcd.setCursor(0, 1); // печатаем вторую строку lcd.print("Do It Yourself"); } void loop() { }
Кириллица
Существует два способа вывода кириллицы на текстовые дисплеи:
Рассмотрим оба способа более подробно.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв. Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я
соответствует код B1
в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x##
встроить в строку код символа:
lcd.print("\xB1ndex");
Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x
, он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона 0-9
и A-F
следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются.
Сравните две строки кода для вывода надписи «Яeee»:
lcd.print("\xB1eee"); // ошибка lcd.print("\xB1""eee"); // правильно
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
- helloAmperkaRusCharacterGenerator.ino
// подключаем стандартную библиотеку LiquidCrystal #include <LiquidCrystal.h> // инициализируем объект-экран, передаём использованные // для подключения контакты на Arduino в порядке: // RS, E, DB4, DB5, DB6, DB7 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // устанавливаем размер (количество столбцов и строк) экрана lcd.begin(16, 2); // устанавливаем курсор в колонку 5, строку 0 // на самом деле это первая строка, т.к. нумерация начинается с нуля lcd.setCursor(5, 0); // печатаем первую строку lcd.print("\xA8""p""\xB8\xB3""e\xBF"); // устанавливаем курсор в колонку 3, строку 1 // на самом деле это вторая строка, т.к. нумерация начинается с нуля lcd.setCursor(3, 1); // печатаем вторую строку lcd.print("o\xBF A\xBC\xBE""ep\xBA\xB8"); } void loop() { }
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
// переключение с нулевой страницы на первую command(0x101010); // переключение с первой страницы на нулевую command(0x101000);
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.
- changePageCharacterGenerator.ino
// Подключаем стандартную библиотеку LiquidCrystal #include <LiquidCrystal.h> // Инициализируем объект-экран, передаём использованные // для подключения контакты на Arduino в порядке: // RS, E, DB4, DB5, DB6, DB7 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // устанавливаем размер (количество столбцов и строк) экрана lcd.begin(16, 2); // устанавливаем курсор в колонку 5, строку 0 // на самом деле это первая строка, т.к. нумерация начинается с нуля lcd.setCursor(5, 0); // печатаем строку lcd.print("\x9b\x9c\x9d\x9e\x9f"); } void loop() { // устанавливаем 0 станицу знакогенератора (стоит по умолчанию) lcd.command(0b101000); // ждём 1 секунду delay(1000); // устанавливаем 1 станицу знакогенератора lcd.command(0b101010); // ждём 1 секунду delay(1000); }
Полную таблицу символов с кодами можно найти в документации к экрану.
Использование библиотеки LiquidCrystalRus
Совсем не обязательно мучатся со знакогенератором, чтобы вывести русский символ. Для решения проблемы скачайте и установите библиотеку LiquidCrystalRus.
Это копия оригинальной библиотеки LiquidCrystal
с добавлением русского языка. Добавленный в библиотеку код трансформирует русские символы UTF8
в правильные коды для текстового экрана.
В качестве примера выведем фразу «Привет, Амперка» на дисплей.
- helloAmperkaRus.ino
// подключаем библиотеку LiquidCrystalRus #include <LiquidCrystalRus.h> // инициализируем объект-экран, передаём использованные // для подключения контакты на Arduino в порядке: // RS, E, DB4, DB5, DB6, DB7 LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2); void setup() { // устанавливаем размер (количество столбцов и строк) экрана lcd.begin(16, 2); // устанавливаем курсор в колонку 5, строку 0 // на самом деле это первая строка, т.к. нумерация начинается с нуля lcd.setCursor(5, 0); // печатаем первую строку lcd.print("Привет"); // устанавливаем курсор в колонку 3, строку 1 // на самом деле это вторая строка, т.к. нумерация начинается с нуля lcd.setCursor(3, 1); // печатаем вторую строку lcd.print("от Амперки"); } void loop() { }
Примеры работы для Iskra JS
Для работы с LCD-дисплеем из среды Espruino существует библиотека HD44780.
Вывод текста
Для вывода программы приветствия, воспользуйтесь скриптом:
- hello-world.js
// создаём переменную для работы с дисплеем // HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев var lcd = require("HD44780").connect(P12,P11,P5,P4,P3,P2); // печатем первую строку lcd.print("Hello world"); // устанавливаем курсор в колонку 0, строку 1 // на самом деле это вторая строка, т.к. нумерация начинается с нуля lcd.setCursor(0, 1); // печатаем вторую строку lcd.print("Do It Yourself");
Кирилица
Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.
Таблица знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв. Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.
Так букве Я
соответствует код B1
в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x##
встроить в строку код символа:
lcd.print("\xB1ndex");
Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x
, он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона 0–9
и A–F
следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются.
Сравните две строки кода для вывода надписи «Яeee»:
lcd.print("\xB1eee"); // ошибка lcd.print("\xB1"+"eee"); // правильно
Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:
- hello-amperka-rus-character-generator.js
// создаём переменную для работы с дисплеем // HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев var lcd = require("HD44780").connect(P12,P11,P5,P4,P3,P2); // устанавливаем курсор в колонку 5, строку 0 // на самом деле это первая строка, т.к. нумерация начинается с нуля lcd.setCursor(5, 0); // печатаем первую строку lcd.print("\xA8"+"p"+"\xB8\xB3"+"e\xBF"); // устанавливаем курсор в колонку 3, строку 1 // на самом деле это вторая строка, т.к. нумерация начинается с нуля lcd.setCursor(3, 1); // печатаем вторую строку lcd.print("o\xBF"+" A\xBC\xBE"+"ep\xBA\xB8");;
Переключение страниц знакогенератора
Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:
// переключение с нулевой страницы на первую command(0x101010); // переключение с первой страницы на нулевую command(0x101000);
Дисплей не может одновременно отображать символы разных страниц.
Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.
- change-page-character-generator.js
// создаём переменную для работы с дисплеем // HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев var lcd = require("HD44780").connect(P12,P11,P5,P4,P3,P2); // создаём переменную состояния var state = false; // устанавливаем курсор в колонку 5, строку 0 // на самом деле это первая строка, т.к. нумерация начинается с нуля lcd.setCursor(5, 0); // печатаем первую строку lcd.print("\x9b\x9c\x9d\x9e\x9f"); setInterval(function() { // каждую секунду меняем переменую состояния state = !state; // вызываем функцию смены адреса страницы lcdChangePage(); }, 1000); function lcdChangePage () { if (state) { // устанавливаем 0 станицу знакогенератора (стоит по умолчанию) lcd.write(0b101000, 1); } else { // устанавливаем 1 станицу знакогенератора lcd.write(0b101010, 1); } }
Полную таблицу символов с кодами можно найти в документации к экрану.
Комнатный термометр
Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».
Что понадобится
Как собрать
Возьмите Troyka Shield и установите сверху на управляющую плату — Arduino или Iskra JS.
- Подключите аналоговый термометр к управляющей плате через 3-проводной шлейф к аналоговому пину
A0
. В итоге должна получится схема. Прошейте управляющую платформу кодом, приведённым ниже.
Скетч для Arduino
- thermometerRoom.ino
// подключаем стандартную библиотеку LiquidCrystal #include <LiquidCrystal.h> // инициализируем объект-экран, передаём использованные // для подключения контакты на Arduino в порядке: // RS, E, DB4, DB5, DB6, DB7 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // пин датчика температуры #define TEMPERATURE_PIN A0 void setup() { // устанавливаем размер (количество столбцов и строк) экрана lcd.begin(16, 2); } void loop() { // очищаем дисплей lcd.clear(); // устанавливаем курсор в колонку 3, строку 0 // на самом деле это первая строка, т.к. нумерация начинается с нуля lcd.setCursor(3, 0); // считываем показания с датчика температуры int sensorADC = analogRead(A0); // переводим значения с АЦП в вольты float sensorVoltage = sensorADC * (5.0 / 1023.0); // переводим вольты в градусы цельсия int temperature = (sensorVoltage - 0.5) * 100; // выводим результат на дисплей lcd.print("Temp="); lcd.print(temperature); lcd.print("\x99""C"); delay(500); }
Скрипт для Iskra JS
- thermometerRoom.js
// создаём переменную для работы с дисплеем // HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев var lcd = require("HD44780").connect(P12,P11,P5,P4,P3,P2); // создаём переменную для работы с датчиком температуры var thermometer = require('@amperka/thermometer') .connect(A0); // каждую секунду считываем данные с датчика температуры и выводим на дисплей setInterval(function() { var celsius = thermometer.read('C'); lcd.setCursor(3, 0); lcd.print("Temp="+ celsius.toFixed(0) + "\x99"+"C"); }, 1000);
Характеристики
Напряжение питания: 3,3—5 В
Максимальный ток потребления: 1 мА
Потребляемый ток подсветки: 100 мА
Индикация: 2 строки по 16 символов. Символы отображаются в матрице 5×8 точек
Габариты: 84×44×13 мм
Ресурсы
wiki.amperka.ru
Подключение LCD 1602 по I2C интерфейсу | RadioLaba.ru
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <P16F628A.INC>
LIST p=16F628A
__CONFIG H’3F10′ ;Конфигурация микроконтроллера
errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге
Sec equ 0020h ;вспомогательные регистры счета
Sec1 equ 0021h ;
Sec2 equ 0022h ;
scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит
perem equ 0025h ;вспомогательный регистр приема/передачи байта по интерфейсу
tmp equ 0026h ;вспомогательный регистр счетчик
;
lcd_tmp equ 0027h ;вспомогательный регистр передачи инструкций
;
adr_i2c equ 0028h ;регистры подпрограммы передачи данных по интерфейсу
tmp_i2c equ 0029h ;
slave_adr equ 002Ah ;
data_i2c equ 002Bh ;
;
flag equ 007Fh ;регистр флагов
#DEFINE sda PORTB,0 ;линия sda
#DEFINE scl PORTB,1 ;линия scl
#DEFINE sda_io TRISB,0 ;линия направления sda
#DEFINE scl_io TRISB,1 ;линия направления scl
#DEFINE knp_led PORTB,2 ;кнопка вкл/выкл подсветки
#DEFINE led PORTB,3 ;светодиод ошибки передачи данных по интерфейсу
;flag,2 — флаг состояния подсветки (0 — выключена, 1 — включена)
;flag,3 — флаг передачи команда/данные (0 — команда, 1 — данные)
;flag,4 — флаг направления передачи (0 — чтение, 1 — запись)
;flag,5 — флаг окончания приема данных от ведомого
;flag,6 — флаг ошибки передачи по интерфейсу I2C (отсутствие подтверждения от ведомого)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0000h ;начать выполнение программы с адреса 0000h
goto Start ;переход на метку Start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Основная программа
Start movlw b’00000000′ ;установка значений выходных защелок порта B
movwf PORTB ;
;
movlw b’00000111′ ;выключение компараторов
movwf CMCON ;
;
bsf STATUS,RP0 ;выбрать 1-й банк
movlw b’11110111′ ;настройка линий ввода\вывода порта B
movwf TRISB ;RB3 — на выход, остальные на вход
bcf STATUS,RP0 ;выбрать 0-й банк
;
clrf flag ;сброс регистра флагов
;
call lcd_led_on ;вызов подпрограммы включения подсветки
;
call init_lcd ;вызов подпрограммы инициализации дисплея
call err_prov ;проверка ошибки
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw 0x02 ;установка адреса DDRAM памяти (1-я строка 3-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
movlw ‘R’ ;Вывод надписи RadioLaba.ru
call lcd_dat ;
movlw ‘a’ ;
call lcd_dat ;
movlw ‘d’ ;
call lcd_dat ;
movlw ‘i’ ;
call lcd_dat ;
movlw ‘o’ ;
call lcd_dat ;
movlw ‘L’ ;
call lcd_dat ;
movlw ‘a’ ;
call lcd_dat ;
movlw ‘b’ ;
call lcd_dat ;
movlw ‘a’ ;
call lcd_dat ;
movlw ‘.’ ;
call lcd_dat ;
movlw ‘r’ ;
call lcd_dat ;
movlw ‘u’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
;
movlw 0x43 ;установка адреса DDRAM памяти (2-я строка 4-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
;
movlw ‘L’ ;Вывод надписи LCD 1602A
call lcd_dat ;
movlw ‘C’ ;
call lcd_dat ;
movlw ‘D’ ;
call lcd_dat ;
movlw ‘ ‘ ;
call lcd_dat ;
movlw ‘1’ ;
call lcd_dat ;
movlw ‘6’ ;
call lcd_dat ;
movlw ‘0’ ;
call lcd_dat ;
movlw ‘2’ ;
call lcd_dat ;
movlw ‘A’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
call paus ;пауза 1 сек
;
movlw .16 ;сдвиг экрана влево на 16 позиций
movwf tmp ;
met_1 movlw b’00011000′ ;команда сдвига экрана влево
call lcd_comm ;вызов подпрограммы передачи команды
decfsz tmp,F ;
goto met_1 ;
movlw 0x13 ;установка адреса DDRAM памяти (1-я строка 20-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
movlw ‘P’ ;Вывод надписи PCF8574AT
call lcd_dat ;
movlw ‘C’ ;
call lcd_dat ;
movlw ‘F’ ;
call lcd_dat ;
movlw ‘8’ ;
call lcd_dat ;
movlw ‘5’ ;
call lcd_dat ;
movlw ‘7’ ;
call lcd_dat ;
movlw ‘4’ ;
call lcd_dat ;
movlw ‘A’ ;
call lcd_dat ;
movlw ‘T’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
;
movlw 0x54 ;установка адреса DDRAM памяти (2-я строка 21-я позиция)
call lcd_adr ;вызоа подпрограммы передачи адреса DDRAM
;
movlw ‘I’ ;Вывод надписи I2C bus
call lcd_dat ;
movlw ‘2’ ;
call lcd_dat ;
movlw ‘C’ ;
call lcd_dat ;
movlw ‘ ‘ ;
call lcd_dat ;
movlw ‘b’ ;
call lcd_dat ;
movlw ‘u’ ;
call lcd_dat ;
movlw ‘s’ ;
call lcd_dat ;
;
call paus ;пауза 1 сек
call paus ;пауза 1 сек
;
sdvig movlw .16 ;сдвиг экрана вправо на 16 позиций с одновременным опросом кнопки подсветки
movwf tmp ;с частотой 10 Гц
sdvig_1 movlw b’00011100′ ;команда сдвига экрана вправо
call lcd_comm ;вызов подпрограммы передачи команды
call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_1 ;
movlw .20 ;пауза 2 сек с опросом кнопки подсветки с частотой 10 Гц
movwf tmp ;
sdvig_2 call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_2 ;
movlw .16 ;сдвиг экрана влево на 16 позиций с одновременным опросом кнопки подсветки
movwf tmp ;с частотой 10 Гц
sdvig_3 movlw b’00011000′ ;команда сдвига экрана влево
call lcd_comm ;вызов подпрограммы передачи команды
call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_3 ;
movlw .20 ;пауза 2 сек с опросом кнопки подсветки с частотой 10 Гц
movwf tmp ;
sdvig_4 call knp_opros ;вызов подпрограммы опроса кнопки подсветки
movlw .100 ;
call paus_lcd ;пауза 100 мс
decfsz tmp,F ;
goto sdvig_4 ;
goto sdvig ;переход на метку sdvig
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
knp_opros btfsc knp_led ;Подпрограмма опроса кнопки подсветки дисплея
return ;кнопка не нажата: выход из подпрограммы
call paus_knp ;кнопка нажата, ожидание отжатия
btfss knp_led ;
goto $-2 ;
;
btfsc flag,2 ;опрос флага состояния подсветки
goto knp_1 ;
call lcd_led_on ;подсветка выключена: вызов подпрограммы включения подсветки
return ;выход из подпрограммы
;
knp_1 call lcd_led_off ;подсветка включена: вызов подпрограммы выключения подсветки
return ;выход из подпрограммы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
err_prov btfss flag,6 ;проверка ошибок передачи данных
return ;нет ошибок: выход из подпрограммы
err_1 bsf led ;ошибка: включить светодиод led
goto err_1 ;переход на метку err_1: зацикливание программы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма включения/выключения подсветки дисплея
lcd_led_on movlw b’00001000′ ;Команда включения подсветки 3-й бит в 1
movwf adr_i2c ;
bsf flag,2 ;установка флага включенного состояния подсветки
goto lcd_led_1 ;
lcd_led_off movlw b’00000000′ ;Команда выключения подсветки 3-й бит в 0
movwf adr_i2c ;
bcf flag,2 ;установка флага выключенного состояния подсветки
lcd_led_1 movlw b’01111110′ ;
movwf slave_adr ;запись адреса микросхемы PCF8574AT в регистр slave_adr
clrf tmp_i2c ;
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
return ;выход из подпрограммы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма инициализации дисплея LCD 1602
init_lcd movlw .15 ;пауза 15 мс
call paus_lcd ;
movlw b’00110000′ ;Передача команды 0011 (старший полубайт)
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
movlw .5 ;пауза 5 мс
call paus_lcd ;
movlw b’00110000′ ;Передача команды 0011 (старший полубайт)
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
movlw .1 ;пауза 1 мс
call paus_lcd ;
movlw b’00110000′ ;Передача команды 0011 (старший полубайт)
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 0010 (старший полубайт)
movlw b’00100000′ ;Установка 4-х битного режима
call lcd_comm_1 ;вызов подпрограммы передачи полубайта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00101000
movlw b’00101000′ ; 4-х битный режим, использовать 2 строки дисплея, шрифт 5×8
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00001000
movlw b’00001000′ ;выключить дисплей, выключить курсор, выключить мигание курсора
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
movlw b’00000001′ ;Передача команды очистки дисплея 00000001
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00000110
movlw b’00000110′ ;направление движения курсора- вправо (инкремент адреса), запретить сдвиг экрана
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
btfsc flag,6 ;проверка ошибки
return ;
;Передача команды 00001100
movlw b’00001100′ ;включить дисплей, выключить курсор, выключить мигание курсора
call lcd_comm ;вызов подпрограммы передачи байта команды на дисплей
return ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма передачи полубайта команды на дисплей
lcd_comm_1 movwf lcd_tmp ;
movlw b’01111110′ ;
movwf slave_adr ;запись адреса микросхемы PCF8574AT в регистр slave_adr
movlw b’11110000′ ;Передача старшего полубайта, бит E=1
andwf lcd_tmp,W ;
movwf adr_i2c ;
movlw b’00000100′ ;
iorwf adr_i2c,F ;
btfsc flag,2 ;опрос флага состояния подсветки
bsf adr_i2c,3 ;флаг подсветки=1, включение подсветки
movlw data_i2c ;установка первого регистра приема/передачи
movwf FSR ;
movlw b’11110000′ ;Передача старшего полубайта, бит E=0
andwf lcd_tmp,W ;
movwf INDF ;
btfsc flag,2 ;опрос флага состояния подсветки
bsf INDF,3 ;флаг подсветки=1, включение подсветки
movlw .1 ;передача 1-го байта
movwf tmp_i2c ;
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
return ;выход из подпрограммы
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Подпрограмма передачи команды или данных на дисплей (1 байт)
lcd_adr movwf lcd_tmp ;Команда записи адреса
bsf lcd_tmp,7 ;установка 7-го бита,
bcf flag,3 ;сброс флага, передача команды
goto lcd_met_1 ;
lcd_cgram movwf lcd_tmp ;Команда установки адреса CGRAM памяти
bcf lcd_tmp,7 ;сброс 7-го бита, установка 6-го бита
bsf lcd_tmp,6 ;
bcf flag,3 ;сброс флага, передача команды
goto lcd_met_1 ;
lcd_dat movwf lcd_tmp ;Подпрограмма записи данных в дисплей
bsf flag,3 ;установка флага, передача данных
goto lcd_met_1 ;
lcd_comm movwf lcd_tmp ;Подпрограмма передачи команды на дисплей
bcf flag,3 ;сброс флага, передача команды
lcd_met_1 movlw b’01111110′ ;
movwf slave_adr ;запись адреса микросхемы PCF8574AT в регистр slave_adr
movlw b’11110000′ ;Передача старшего полубайта, бит E=1
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf adr_i2c ;если передаются данные бит RS=1
btfsc flag,3 ;
movlw b’00000101′ ;
btfss flag,3 ;
movlw b’00000100′ ;
iorwf adr_i2c,F ;
btfsc flag,2 ;опрос флага состояния подсветки
bsf adr_i2c,3 ;флаг подсветки=1, включение подсветки
movlw data_i2c ;установка первого регистра приема/передачи
movwf FSR ;
movlw b’11110000′ ;Передача старшего полубайта, бит E=0
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf INDF ;если передаются данные бит RS=1
btfss flag,3 ;
goto lcd_met_2 ;
movlw b’00000001′ ;
iorwf INDF,F ;
lcd_met_2 incf FSR,F ;инкремент регистра FSR
swapf lcd_tmp,F ;меняем местами полубайты
movlw b’11110000′ ;Передача младшего полубайта, бит E=1
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf INDF ;если передаются данные бит RS=1
btfsc flag,3 ;
movlw b’00000101′ ;
btfss flag,3 ;
movlw b’00000100′ ;
iorwf INDF,F ;
incf FSR,F ;инкремент регистра FSR
movlw b’11110000′ ;Передача младшего полубайта, бит E=0
andwf lcd_tmp,W ;если передается команда бит RS=0
movwf INDF ;если передаются данные бит RS=1
btfss flag,3 ;
goto lcd_met_3 ;
movlw b’00000001′ ;
iorwf INDF,F ;
lcd_met_3 btfss flag,2 ;опрос флага состояния подсветки
goto lcd_met_4 ;флаг подсветки=0, подсветка выключена, биты не меняем
movlw data_i2c ;установка первого регистра приема/передачи
movwf FSR ;
bsf INDF,3 ;флаг подсветки=1, включение подсветки
incf FSR,F ;
bsf INDF,3 ;
incf FSR,F ;
bsf INDF,3 ;
lcd_met_4 movlw .3 ;передача 3-х байта
movwf tmp_i2c ;
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
btfsc flag,3 ;проверка команда или данные
return ;выход из подпрограммы передачи данных на дисплей
swapf lcd_tmp,F ;меняем местами полубайты
movlw .1 ;проверка крманды очистка дисплея
xorwf lcd_tmp,W ;
btfsc STATUS,Z ;
goto lcd_met_5 ;команда соответствует очистке дисплея переход на lcd_met_5
movlw b’11111110′ ;проверка крманды возврата курсора
andwf lcd_tmp,W ;
xorlw .2 ;
btfss STATUS,Z ;
return ;выход из подпрограммы передачи данных на дисплей
lcd_met_5 movlw .2 ;команда соответствует возврату курсора
call paus_lcd ;вызов подпрограммы паузы 2 мс
return ;выход из подпрограммы передачи данных на дисплей
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
radiolaba.ru
Собери свою радиосхему!
Одна из главных проблем, с который могут столкнуться русскоязычные пользователи — нестандартная кодировка кириллических символов. То есть если вы отправите в ЖКИ обычную строку с русскими символами, вместо них на экран будут выведены абраказябры. Связано это с тем, что для экономии места в памяти контроллера тупоголовые разработчики вместо увеличения объема (можно было просто занять свободные ячейки) решили оставить лишь по одной ячейке для символов со сходным начертанием. Так например, буква O или P выглядят одинаково как в кириллице, так и латинице. Неумные инженеры подумали, что так они неистово сократят объем используемой памяти, но сократили лишь функциональность дисплея. И теперь при необходимости вывести русские символы, каждый раз возникает неприятная неприятность в виде несовместимости таблиц HD44780 и ASCII. Выхода есть два, у обоих свои плюсы и минусы:
1. Написать подпрограмму для контроллера, которая на лету будет декодировать ASCII коды и выводить уже правильные символы на ЖКИ. Удобна тем, что позволяет передавать любые строки без опасения, что они будут выведены впоследствии неправильно. Но этот способ требует лишних ресурсов на перекодировку, а также нужно постоянно хранить в памяти таблицу символов.
2. Использовать утилиту для ПК, которая сама переконвертирует нужные строки в нужный формат, которые сразу подставляются в код для вывода. Удобно тем, что не занимает память контроллера, работает быстро и вообще не требует ресурсов для перекодировки. Но минус в том, что в коде программы нужные строки уже не разобрать. Вывод символов в этом фиксированный, то есть выводить можно только заранее выбранный набор строк. При использовании ввода, например, с RS-232, русские символы будут отображены некорректно.
О наличии подпрограмм для первого случая мне известно, но я не встречал ни одной библиотеки или функции на Basom, которая бы выполняла это. Если вы встречали что-то подобное, убедительная просьба прислать это мне.
Для второго случая есть множество программ, одна из таких представлена ниже.
программу. (~100кб.)
cxema21.ru