STM32F030 + дисплей от Nokia 1202 (типа Hello World LCD)

Предыдущие статьи по данной теме:

1. Подключение дисплея от Nokia 1202 к микроконтроллеру

2. STM32F030 + дисплей от Nokia 1202

Преамбула:

Команды передаются с значением первого бита — «0»  (не стоит забывать, что режим SPI 9 битный), а данные с значением первого бита — «1». Команды имеют строго определенную структуру, где биты с 0 до 3 несут информационную нагрузку и с 1 по 7й обозначают тип команды (параметра), для разных команд комбинации могут быть разными. Для данных такой путаницы нет, при передаче байта данных каждый бит несет информацию о состоянии одного из пикселей дисплея.

Начнем с позиционирования выводимой информации на дисплее.

Для простоты подачи информации сделаем следующую привязку Декартовых координат к дисплею (рисунок 1)

LCD_AxisРисунок 1 – Оси координат

В даташите оси (если это так можно назвать) обозначаются следующим образом:

  • положению оси Axis_X соответствуют адреса столбцов (Column address);
  • положению оси Axis_Y соответствуют адреса страниц (Page address);

Адресное пространство памяти контроллера состоит из 68 строк и 96 столбцов, строки разбиты на 8 секторов по 8 бит и 9-й неполный сектор в 4 бита. Структура памяти приведена на рисунке 2.

memorymapipngРисунок 2 – структура организации памяти контроллера STE2007

В память заносится одновременно 1 байт данных, что соответствует восьми строкам одного столбца таблицы памяти (одному сектору памяти).

Адресация по строкам (рисунок 3) одновременно заполняется восемь ячеек памяти (один сектор). При передаче команды код изменяется от 0xB0 до 0xB8, программная реализация:

   Y_pos = 0xB0 | (y & 0x0F);

К значению 0xB0 добавляется номер сектора от 0 до 8 закодированный в первых четырех битах байта (по маске 0x0F).

memorymapipng_page

Рисунок 3 – Таблица адресации секторов

Адресация по столбцам: В отличии от строк, столбцы выбираются по одному, а не группами, также для установка адреса памяти столбца нужно передать последовательность с двух байт а не одного как в строках, первым передается старший байт вторым младший, программная реализация:

   XL_pos = x & 0x0F;
   XH_pos = 0x10 | ((x >> 4) & 0x07);

Байт XL_pos получается отделением от байта с номером столбца первых четырех бит, XH_pos получается добавлением к 0xB0 сдвинутого в право на четыре бита номера столбца от 0 до 95, закодированный в первых трех битах байта (по маске 0x07)

 memorymapipng_column

Рисунок 4 – Таблица адресации столбцов

 При непрерывном выводе информации (без ввода в контроллер адресов) на дисплей данные заносятся в память контроллера начиная с точки заданной адресными командами. Каждый следующий байт будет прописываться в память в следующий столбец (адрес инкрементируется), адрес строк (сектора) изменяется на единицу после записи данных в сектор по адресу последнего столбца, при этом адрес столбца обнуляется (рисунок 5). По достижению конца памяти 67 строки (9-й сектор) и 95 столбца, адрес возвращается в значение нулевой строки (0-й сектор) и нулевого столбца.

cycle

Рисунок 5 – Циклическое изменение адреса

Для вывода простейшей графической информации на дисплей информации уже достаточно, реализуем на дисплее описанное выше.

Первой создадим функцию очистки экрана, записав в дисплей 96*9=864 раза байт равный нулю (0x00).

Функция будет иметь следующий вид:

void LCD_Clear(void)
{
            uint16_t num = 0;//Временная переменная
            for (num=0;num<=864;num++)//Цикл отсчета
            lcd_write_once(LCD_DATA, 0x00);//Запись данных в дисплей
}

До очистки дисплей отображал какой-то мусор (рисунок 6), после выполнения функции LCD_Clear(); с записью в память значения 0x00 получим чистый дисплей (рисунок 7). Еще можно выполнить противоположную задачу, сделать полную заливку дисплея отправив 864 раза значение 0xFF (рисунок 8).

White_

Рисунок 6 – Дисплей до очистки

0X00

Рисунок 7 – Очищенный дисплей

0XFF

Рисунок 8 – Полная заливка дисплея

 

После очистки, можно начать выводить графическую информацию, чего мы еще не умеем. Для примера установки адресов отобразим на дисплее ступенькой (рисунок 9) квадраты 8х8. Точкой отсчета будет адрес 0 по X и 0 по Y. Высота одного сектора 8 пикселей (тут все просто), после каждой записи в память адрес по столам инкрементируется, отсчитываем 8 отправок данных и увеличиваем адрес сектора на 1. Код функции:

void LCD_Steps()
{
            uint8_t num = 0;//Временная переменная
            uint8_t num1 = 0;//Временная переменная
            uint8_t X = 0;//Начальное положение по оси Х
            uint8_t Y = 0;//Начальное положение по оси Y
            lcd_write_once(LCD_COMMAND, 0xB0 | (Y++ & 0x0F) );//адрес по секторам (Y)
            lcd_write_once(LCD_COMMAND, 0x10 | (X & 0x0F));//Адрес по столбцам (Х)старший байт
            lcd_write_once(LCD_COMMAND, X & 0x07);//Адрес по столбцам (Х)младший байт
            for (num1 = 0; num1<=8;num1++)
            {
                        for (num = 0;num<=7;num++)
                        lcd_write_once(LCD_DATA, 0xFF);//полная заливка сектора 8 раз
                        lcd_write_once(LCD_COMMAND, 0xB0 | (Y++ & 0x0F) );//адрес по секторам (Y)
            }
}

steps

Рисунок 9 – Ступеньки на дисплее

 В следующая статья будет посвящена выводу на экран текста и чисел.

You may also like...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>