Драйвер для внешнего дисплея Nokia 2760 для STM32

В ходе изысканий по миниатюризации дозиков я наткнулся на статью на ИзиЭлектрониксе о внешнем дисплее от Nokia 2760.

Он обладает рядом уникальных плюсов:

  • Монохромный – а значит требует минимум RAM для фрейм-буфера
  • Разрешение 96х68px – это на 60% больше чем у Nokia 3310
  • Инверсный со встроенной синей подсветкой – гламурность 5+ smile
  • Стандартизированный разъем на шлейфе – дает 100% контакт
  • диагональ 1 дюйм (20x16mm) – идеальный претендент для мелких дозиков
  • Цена 25р. за штуку – пожалуй, это просто уникально, более дешевого дисплея не найти.

 

Но на фоне плюсов был и один большой минус, это отсутствие драйвера для STM32. Вооружившись паяльником и мозгом я решил это исправить smile

Ну а раз уж я этот ресурс задумал как обучалку для новичков с уклоном на дозики и АРМы, то я просто обязан оформить этот “дров” в виде отдельного модуля.

Так как у меня уже есть некоторые алгоритмы прорисовки, которые я бы хотел взять из Микрона в новый проект, мне пришлость   переписывать библиотеку от дисплея 3310, которую тов. Aheir любезно выложил на Радиокоте, и портировать ее с AVR на STM32.

Однако в процессе изучения дисплея выяснился небольшой нюанс: на подсветку надо подавать не менее 5.7 вольта. А так как STM32 питается от 3х вольт и в схеме устройства, для которого я применяю этот дисплей, нет этого напряжения, его пришлось “сделать”.

Для этого я применил инвертор ADM8828ARTZ. Между прочим, штука сама по себе очень интересная. Чип выпускается в компактном корпусе SOT-23-6 и из внешней обвязки требует всего 2 мелких тантала по 10мкФ на 6.3 вольта. Когда на вход подается +3 вольта с выхода снимается -3 вольта. Конечно из за того, что не применяются индуктивности, не рекомендуется снимать с выхода более 25 мА. Помимо всего прочего, у него есть ножка, которая переводит его в режим сна со сверхнизким потреблением в 20 нА.

На данной схеме указано подключение дисплея и подсветки к МК. Как видно, никаких особых нюансов нет, все просто, как 5 копеек.

Ножки, задействованные у МК, подобраны таким образом, чтобы разводка платы была максимально простой.

Для подключения дисплея используется стандартный разъем Hirose DF23C-10DS-0.5V, именно он применяется в этих сотовых. Он легко паяется обычным паяльником, несмотря на шаг 0.5 мм. Легко доставаем в ремонтных мастерских и магазинах с детальками.

На данной схеме применен брутальный МК в QFN корпусе, но вы можете использовать любой STM32, т.к. драйвер описанный здесь, будет без проблем работать со всей линейкой МК.

Питание подсветки включено между +3 и -3 вольта, в результате на нее подается необходимые 6 вольт. Когда ADM8828 “запрещен”, питание -3 с подсветки снимается и она погасает.

В принципе все просто.

Работа с дисплеем сводится к подключению библиотек: delay.h и ext2760.h

Первая реализует функцию задержки delay_ms(кол-во_милисекунд); вторая же, это и есть наш драйвер дисплея.

Если изменять ножки МК, и которым подключен дисплей, то надо просто изменить в ней нумерацию и имена портов в #define и в функции init_lcd_port()

Ниже приведены реализованные там функции и их назначение:

  • void LcdSend (unsigned char data, unsigned char cmd); //Отправка данных в дисплей массивами по 8 пикселей или отправка команды управления
  • void LcdUpdate (void); //Запись фейм-буфера в дисплей
  • void LcdClear (void); //Очистка фрейм-буфера и дисплея
  • void LcdInit ( void ); //Инициализация дисплея
  • void LcdPixel (unsigned char x, unsigned char y, unsigned char mode); //Отрисовка пикселя в фрейм буфере по координатам (x, y), mode это режим установки Off, On or Xor(погасить,зажечь,инвертировать цвет)
  • void LcdLine (int x1, int y1, int x2, int y2, unsigned char mode); //отрисовка линии от координаты x1,y1 до x2,y2 c указанием режима отрисовки, см.выше.
  • void clean_lcd_buf (void); //очистка текстового буфера
  • void LcdString (unsigned char x, unsigned char y); //Отрисовка в фреймбуфере строки по заданным координатам.
  • void LcdStringBold (unsigned char x, unsigned char y); //Печатает большую и жирную строку
  • void LcdChrBig (int ch); //Печатает символ на текущем месте, большой
  • void LcdStringBig (unsigned char x, unsigned char y); //Печатает большую строку
  • void LcdStringInv (unsigned char x, unsigned char y); // печатает строку в инверсном шрифте

Суть работы библиотеки в том, чтобы в заранее выделенной области памяти МК (фрейм-буфер) нарисовать строку,  фигуру или группу строк. т.е. как бы отрисовать на виртуальном дисплее то что нам необходимо. А затем с помощью команды LcdUpdate все данные из фрейм буфера переносятся в дисплей.

 

Рассмотрим кусок кода из примера:

 init_lcd_port(); // Инициализируем порт
 LcdInit(); // Инициализируем дисплей
 LcdClear(); // Очищаем фрейм буфер и дисплей
 GPIOB->BRR = GPIO_BRR_BR7; // Включаем подсветку

 while(1){
     counter++; //инкрементируем счетчик
     LcdPixel(x_cor,y_cor,PIXEL_XOR); // инвертируем пиксель по координатам X,Y.

     sprintf (lcd_buf, "X:%5i",x_cor); // Пишем в буфер текущюю X координату
     LcdStringBold(1,3); // Выводим ЖИРНО содержание буфера на строку 3

     sprintf (lcd_buf, "Y:%5i",y_cor); // Пишем в буфер текущюю X координату
     LcdStringBold(1,5); // Выводим ЖИРНО содержание буфера на строку 5

     sprintf (lcd_buf, "Счетчик: %5i",counter); // Пишем в буфер значение счетчика
     LcdString(1,8); // // Выводим обычным текстом содержание буфера на строку 8
     LcdUpdate(); // записываем данные из сформированного фрейм-буфера на дисплей

     x_cor++;
     if(x_cor>(96-1)) //если достигли конца строки
     {
         x_cor=0;y_cor++; // Переход на новую строку
     }
     if(y_cor>12) //если отрисовали уже 13 строк
     {
         x_cor=0;y_cor=0; // Начинаем сначала
     }
 }

Результат выполнения этого кода продемонстрирован на видео

http://www.youtube.com/watch?v=UiS6GoFrTWo

 

Тут приведен исходный код драйвера с блэкджеком и шлюхами с демонстрационной программой проектом в IAR версии 6.30.8 и текущей версией CMSIS ЖМЕМ СЮДА