Программирование дисплея на контроллере ST7920
Здравствуйте, я хочу рассказать о программировании дисплея на контроллере ST7920 с использованием ATtiny2313 контроллера.
Характеристики дисплеяПриблизительная цена: 15$ Размер дисплее вместе с платой: 93.0 (Длина) × 70.0(Ширина) × 13.50(Высота) мм Размер видимой области: 70x38 мм.
- Графический
- Текстовый
- Подключение по 8 битной шине
- Подключение по 4 битной шине
- Подключения по SPI (3 битной шине)
- Нормальный: потребление 450 мкА, 5 В
- Спящий режим: потребление 30 мкА, 5 В
- Работе в текстовом режиме
- Подключения и программирование по 8 битной шине
- Подключения и программирование по SPI
- Дисплей на контроллере ST7920
- 2 подстрочных резистора на 10 кОм.
- Для 8 битного режима резистор на 4.7 кОм (или больше)
- Контроллер ATtiny2313
- Источник питание на 5В.
Распиновка контактов: GND — Земля VCC — +5В V0 — Настройка контрастности RS — Определяет режим передачи данных (1 — это данные, 0 — это команда) RW — Запись или чтения (1 — чтения, 0 — запись) E — Строб D0-D7 — Шина данных PSB — Определяет какой протокол передачи данных будет использоваться ( 1 — 8/4 бит шина, 0 — SPI) BLA — Анод подсветки (+) BLK — Катод подсветки (-)
На схеме DB0-DB7 и PB0-PB7 не замкнуты, это 8 битная шина данных. Реальное соединения таково: DB0 — PB0 DB1 — PB1 DB2 — PB2 DB3 — PB3 DB4 — PB4 DB5 — PB5 DB6 — PB6 DB7 — PB7
Подключение по SPIРаспиновка контактов: GND — Земля VCC — +5В V0 — Настройка контрастности RS — (CS) Начало/окончание передачи данных (1 — начало, 0 — окончание) RW — (SID) Шина данных E — (SCLK) Строб PSB — Определяет какой протокол передачи данных будет использоваться ( 1 — 8/4 бит шина, 0 — SPI) BLA — Анод подсветки (+) BLK — Катод подсветки (-)
Подстроечные резисторыRP1 — Регулятор контрастности RP2 — Регулятор яркости
Описание протоколов программирования дисплея 8 битный режимИ так, с начало я расскажу о том как в общих чертах происходит работа с дисплеем. Для того что бы работать с дисплеем нам нужно отправлять команды и данные на дисплей. К командам относится: Включения/выключение дисплея, отображение курсора, перемещение курсора и т.д. К данным относятся например символы которые вы хотите видеть на дисплее.
- Задержка в 50 мкс.
- Отправляем команду установки 8 битного режима.
- Задержка 120 мкс.
- Отправляем команду включения дисплея ( в ней же указывается, включить ли курсор, и мигать ли курсором)
- Задержка в 50 мкс.
- Повторно отправляем функцию установки 8 битного режима
- Задержка 120 мкс.
- Отправляем команду отчистить экран
- Задержка 20 мкс.
- Устанавливаем ENTRY MODE (эта команда говорит о том в какую сторону сдвигать курсор после написания символа, нам соответственно нужно вправо)
Вот и все, после выполнения этих действий, если вы указали в команде включения дисплея отображать курсор, на экране вы увидите курсор.
- Устанавливаем низкий уровень E
- Устанавливаем низкий уровень RS
- Устанавливаем низкий уровень RW
- Задержка 1 мкс.
- Устанавливаем высокий уровень E
- Отправляем в порт данных байт команды
- Задержка 1 мкс.
- Устанавливаем низкий уровень E
- Задержка 50 мкс.
Для отправки одного байта данных выполняется абсолютно то же самое, только в начале устанавливается высокий уровень RS. RS = 0 Команда RS = 1 Данные
- Устанавливаем низкий уровень E
- Устанавливаем высокий уровень RS
- Устанавливаем низкий уровень RW
- Задержка 1 мкс.
- Устанавливаем высокий уровень E
- Отправляем в порт данных байт команды
- Задержка 1 мкс.
- Устанавливаем низкий уровень E
- Задержка 50 мкс.
Давайте рассмотрим код отправки команды Для начала установим константы что бы было удобнее:
Функция отправки команды:
Функция отправки данных:
В коде был использован макрос LCD8_MACRO_DELAY, вот его код
Теперь рассмотрим команды инициализации дисплея в текстовом, 8 битном режиме:
- Если установлено 1 то устанавливаем 8 бит передачу данных
- Если установлено 0 то устанавливается 4 бита передача данных
- Если установлено 1 то устанавливается набор расширенных команд
- Если установлено 0 то устанавливается набор базовых команд
- Если установлено 1 то дисплей включен
- Если установлено 0 то дисплей выключен
- Если установлено 1 то курсор включен
- Если установлено 0 то курсор выключен
- Если установлено 1 то курсор будет мигать
- Если установлено 0 то курсор не будет мигать
- Если I/D = 1 то курсор сдвигается вправо
- Если I/D = 0 то курсор сдвигается влево
На основе этих четырех команд можно написать функцию инициализации дисплея:
После выполнения инициализации на экране вы должны увидеть мигающий курсор.
Режим SPI- SID это контакт передачи данных, на дисплее он же RW
- SCLK – это линия строб, на дисплее он же E
- CS – это начала/окончания передачи данных, на дисплее он же RS
- Устанавливаем высокий уровень CS
- Передаем 4 единицы подряд
- Передаем 1 бит RW – чтения или запись
- Передаем 1 бит RS – Команда или данные
- Передаем 0
- Передаем 4 бита старшей половины байта данных
- Передаем 4 нуля
- Передаем 4 бита младшей половины байта данных
- Передаем 4 нуля подряд
- Устанавливаем низкий уровень CS
На этом передача одного байта завершена.
- Задержка 1 мкс.
- Устанавливаем высокий уровень SCLK
- Задержка 1 мкс.
- Устанавливаем низкий уровень SCLK
- Задержка 1 мкс.
Рассмотрим функцию передачи команды/данных в режиме SPI, но сперва объявим константы:
А теперь сама функция:
Текстовый режимТеперь после того как вы научились инициализировать дисплей вы можете выводить любые символы на экран, например вывести букву A:
И на дисплее вы увидите букву A.
И так, теперь о том как устроенно адресное пространство в текстовом режиме: Экран делится на 8 столбцов и 4 строки, в каждый столбец вы можете записать по 2 обычных символа или 1 иероглиф. Адресное пространство находится от 0 до 31. 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 Как видите первая строчка это адреса от 0 до 7 Вторая же строчка от 16 до 23 Третья строчка от 8 до 15 То есть если вы напишете 16 букв подряд с адреса 0, то они будут в первой строчке, но если вы напишите 17 символов, то последний символ будет не на второй строчке, а на третей!
Графический режимИ напоследок, для тех кто хочет использовать графический режим, есть такая статья: LCD 12864 на контроллере ST7920. Параллельный режим (8 бит)