В ходе изысканий по миниатюризации дозиков я наткнулся на статью на ИзиЭлектрониксе о внешнем дисплее от Nokia 2760.
Он обладает рядом уникальных плюсов:
- Монохромный – а значит требует минимум RAM для фрейм-буфера
- Разрешение 96х68px – это на 60% больше чем у Nokia 3310
- Инверсный со встроенной синей подсветкой – гламурность 5+
- Стандартизированный разъем на шлейфе – дает 100% контакт
- диагональ 1 дюйм (20x16mm) – идеальный претендент для мелких дозиков
- Цена 25р. за штуку – пожалуй, это просто уникально, более дешевого дисплея не найти.
Но на фоне плюсов был и один большой минус, это отсутствие драйвера для STM32. Вооружившись паяльником и мозгом я решил это исправить
Ну а раз уж я этот ресурс задумал как обучалку для новичков с уклоном на дозики и АРМы, то я просто обязан оформить этот “дров” в виде отдельного модуля.
Так как у меня уже есть некоторые алгоритмы прорисовки, которые я бы хотел взять из Микрона в новый проект, мне пришлость переписывать библиотеку от дисплея 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 ЖМЕМ СЮДА