Текстовый экран 16×2 [Амперка / Вики]

Текстовый экран 16×2 пригодится для вывода показаний датчиков, отображения простых меню, подсказок и приветствий.

Видеообзор

Подключение и настройка

Дисплей MT-16S2H предназначен для вывода текста на латинице и кириллице.

Экран имеет 16 контактов для питания логики, взаимодействия с управляющей электроникой и подсветки.

Вывод Обозначение Описание
1GNDОбщий вывод (земля)
2VccНапряжение питания (3,3—5 В)
3VoУправление контрастностью
4RSВыбор регистра
5R/WВыбор режима записи или чтения
6EРазрешение обращений к индикатору (а также строб данных)
7DB0Шина данных (8-ми битный режим)(младший бит в 8-ми битном режиме)
8DB1Шина данных (8-ми битный режим)
9DB2Шина данных (8-ми битный режим)
10DB3Шина данных (8-ми и 4-х битные режимы)(младший бит в 4-х битном режиме)
11DB4Шина данных (8-ми и 4-х битные режимы)
12DB5Шина данных (8-ми и 4-х битные режимы)
13DB6Шина данных (8-ми и 4-х битные режимы)
14DB7Шина данных (8-ми и 4-х битные режимы)
15+LED+ питания подсветки
16–LED– питания подсветки

Дисплей может работать в двух режимах:

  • 8-битный режим — в нём используются и младшие и старшие биты (DB0DB7)

  • 4-битный режим — в нём используются только младшие биты (DB4DB7)

Использовать восьмибитный режим не целесообразно. Для его работы требуется на 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 DB3
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);
  }
}

Полную таблицу символов с кодами можно найти в документации к экрану.

Комнатный термометр

Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».

Что понадобится

Как собрать

  1. Возьмите Troyka Shield и установите сверху на управляющую плату — Arduino или Iskra JS.

  2. Подключите аналоговый термометр к управляющей плате через 3-проводной шлейф к аналоговому пину A0. В итоге должна получится схема.
  3. Прошейте управляющую платформу кодом, приведённым ниже.

Скетч для 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

alexxlab

Отправить ответ

avatar
  Подписаться  
Уведомление о