Подключение дисплея от nokia1100 к STM32
В своё время уже писал, как применял этот замечательный дисплей с PIC микроконтроллерами . Сейчас попробуем его подключить к STM32.
Применение дисплея nokia1100 с stm32
На самом деле портировать код со своего раннего проекта и оформить его в библиотеку сложности не составило. Во время проверки схему тоже не изменял – взял свой старый готовый модуль из того же проекта, где подключал его к pic16f628a с гасящими резисторами на 5В логических линях контроллера, и подключил его к установленному на STM32vlDiscovery контроллеру STM32F100RB. Но по уму для STM с питанием и логическим уровнем в 3,3В подключение будет выглядеть следующим образом:
Схема разводки дисплея
Для упрощения подсветку убрал.
Распиновка дисплея
Схема подключения дисплея к контроллеру
Возможности библиотеки:
lcd1100_clear() – очистка дисплея
lcd1100_gotoxy(x, y) – установка курсора
Где: x, y – координаты курсора
lcd1100_putch(c) – вывод символа
lcd1100_putch_inv(c) – вывод инвертированного символа
c — символ в ASCII кодировке
lcd1100_puts(*s) – вывод строки
lcd1100_puts_inv(*s) – вывод инвертированной строки
*s – ссылка на строку (массив из символов)
lcd1100_test() – тестовое заполнение всего дисплея символами из ASCII таблицы
lcd1100_putch_big(col, row, c) – вывод большого символа
col – ширина символа, row – высота символа, c – символ в ASCII
lcd1100_puts_big(col, row, *s) – вывод строки из больших символов
col – ширина символа, row – высота символа, *s – ссылка на строку
Последние две функции, используя те-же ASCII символы 5х8, выводя их в 2, 4 и 8 раз больше (заложено увеличение кратное только 2x).
Таблица ASCII, или шрифт, был вручную прорисован с помощью программы – символьный генератор .
Для работы библиотеки в начале файла lcd-nokia1100.h нужно задать настройки порта и выводов для работы с дисплеем. Для приведенного примера с подключением линий SCLK к PB12, SDA к PB13, CS к PB14 и RES к PB15 инициализация будет выглядеть следующим образом:
// Конфигурация порта // используемый порт #define lcd1100_port GPIOB // используемые выводы #define lcd1100_pin_SCLK GPIO_Pin_12 #define lcd1100_pin_SDA GPIO_Pin_13 #define lcd1100_pin_CS GPIO_Pin_14 #define lcd1100_pin_RST GPIO_Pin_15 // тактирование порта #define lcd1100_RCC RCC_APB2Periph_GPIOB
Настройка рассчитана на управление подключаемым дисплеем с одного порта контроллера.
Код примера работы с дисплеем:
lcd1100_pin_init(); // инициализация выводов дисплея lcd1100_init(); // инициализация дисплея lcd1100_puts_big(2,2,”LCD”); lcd1100_gotoxy(7,0); lcd1100_puts("Nokia1100"); lcd1100_gotoxy(10,1); lcd1100_puts("+STM32"); lcd1100_gotoxy(2,3); lcd1100_puts("96x65 точек"); lcd1100_gotoxy(3,4); lcd1100_puts("8x16 символов"); lcd1100_gotoxy(2,5); lcd1100_puts("35x35 мм"); lcd1100_gotoxy(5,7); lcd1100_puts("alex-exe.ru"); while(1){}
Изменив настройки конфигурации, функцию инициализации и возможно подправив задержку, данную библиотеку можно будет применить для любого микроконтроллера.
Так же могут быть интересны следующие материалы:
Применение дисплея от nokia1100 с PIC16F628A
Генератор изображений
Символьный генератор
Другие материалы по дисплеям
И первоисточник информации по работе с дисплеем nokia1100.
Alex_EXE | 11.09.2013 | STM32 |
Игорь пишет 18.09.2013 в 02:30 #
Скачал пример. Все компилится без ошибок. Загружаю прошивку — экран не реагирует. Экран рабочий 100%, подключенный к Меге88 работает как положено. В прошивке Меги используется библиотека с такой процедурой инициализации дисплея:
CS_LCD_RESET;
RST_LCD_RESET;
_delay_ms(5); // выжидем не менее 5мс для установки генератора(менее 5 мс может неработать)
RST_LCD_SET;
nlcd_SendByte(CMD_LCD_MODE,0xE2); // *** SOFTWARE RESET
nlcd_SendByte(CMD_LCD_MODE,0x3A); // *** Use internal oscillator
nlcd_SendByte(CMD_LCD_MODE,0xEF); // *** FRAME FREQUENCY:
nlcd_SendByte(CMD_LCD_MODE,0x04); // *** 80Hz
nlcd_SendByte(CMD_LCD_MODE,0xD0); // *** 1:65 divider
nlcd_SendByte(CMD_LCD_MODE,0x20); // Запись в регистр Vop
nlcd_SendByte(CMD_LCD_MODE,0x90);
nlcd_SendByte(CMD_LCD_MODE,0xA4); // all on/normal display
nlcd_SendByte(CMD_LCD_MODE,0x2F); // Power control set(charge pump on/off)
// Определяет контрастность
nlcd_SendByte(CMD_LCD_MODE,0x40); // set start row address = 0
nlcd_SendByte(CMD_LCD_MODE,0xB0); // установить Y-адрес = 0
nlcd_SendByte(CMD_LCD_MODE,0x10); // установить X-адрес, старшие 3 бита
nlcd_SendByte(CMD_LCD_MODE,0x0); // установить X-адрес, младшие 4 бита
//nlcd_SendByte(CMD_LCD_MODE,0xC8); // mirror Y axis (about X axis)
//nlcd_SendByte(CMD_LCD_MODE,0xA1); // Инвертировать экран по горизонтали
nlcd_SendByte(CMD_LCD_MODE,0xAC); // set initial row (R0) of the display
nlcd_SendByte(CMD_LCD_MODE,0x07);
//nlcd_SendByte(CMD_LCD_MODE,0xF9); //
nlcd_SendByte(CMD_LCD_MODE,0xAF); // экран вкл/выкл
nlcd_Clear(); // clear LCD
Пробовал и такую инициализацию — никакого толку…
Alex_EXE пишет 18.09.2013 в 03:14 #
Как подключаете дисплей? Точнее как питаете?
Можете попробовать инициализацию из статьи по дисплею 2760.
Можете попробовать подкоректировать функцию задержки в библиотеки дисплея, а точнее множитель.
Игорь пишет 19.09.2013 в 01:10 #
Питаю аналогично тому, как и при подключении к Меге88 — с нею-то все работает. Тоже подозреваю, что дело в таймингах задержек в библиотеке. Пробовал менять задержки в процедуре инициализации — не помогло. На досуге поковыряю другие функции библиотеки, где используются задержки.
Игорь пишет 27.09.2013 в 01:06 #
Как и ожидалось, дело оказалось в таймингах. Увеличив в 20 раз задержки в функции lcd1100_write, удалось заставить его работать. Ну и плюс инициализация вот такая:
void lcd1100_init(void)
{
delay_lcd1100(100);
lcd1100_CS_off;
lcd1100_RST_off;
delay_lcd1100(1000);
lcd1100_RST_on;
delay_lcd1100(1);
lcd1100_write(lcd1100_CMD,0xE2);
lcd1100_write(lcd1100_CMD,0x3A);
lcd1100_write(lcd1100_CMD,0xEF);
lcd1100_write(lcd1100_CMD,0x04);
lcd1100_write(lcd1100_CMD,0xD0);
lcd1100_write(lcd1100_CMD,0x20);
lcd1100_write(lcd1100_CMD,0x90);
lcd1100_write(lcd1100_CMD,0xA4);
lcd1100_write(lcd1100_CMD,0x2F);
lcd1100_write(lcd1100_CMD,0x40);
lcd1100_write(lcd1100_CMD,0xb0);
lcd1100_write(lcd1100_CMD,0x10);
lcd1100_write(lcd1100_CMD,0x0);
lcd1100_write(lcd1100_CMD,0xac);
lcd1100_write(lcd1100_CMD,0x07);
lcd1100_write(lcd1100_CMD,0xaf);
lcd1100_clear();
lcd1100_write(lcd1100_CMD,0xa7);
delay_lcd1100(1);
lcd1100_write(lcd1100_CMD,0xa6);
delay_lcd1100(2);
}
Спасибо за статью и помощь.
Игорь пишет 27.09.2013 в 01:27 #
И еще момент — не выводятся нормально русские буквы. Вместо «96×65 точек» выводится «96×65 CPCPP», вместо «мм» — «РР». Через функцию lcd1100_test() — все буквы отображаются нормально. Как вариант — чудит Кейл? Версия — 4.7 .
Alex_EXE пишет 27.09.2013 в 02:17 #
До рабочего места добрался, но еще проверить не успел. Выздровил, но с оформлением больничного целая эпопея, завтра пойду переоформлять.
Спасибо за замечания. Когда смогу сесть спокойно — проверю.
На счет русского языка — да это кейл чудит, какие-то глюки с кодировками у него. Если и комментарии, и текст пишу в кейл, то выводит так, как у Вас, если пишу текст для дисплея в notepad++ — то в кейл он отображается кракозябрами, зато выводиться нормально. С кирилицей у него основательные проблемы, для нормального отображения комментариев файлы новых проектов отдельно перекодирую в UTF (если не путаю), но выводимый текст видать ему подавай в родной кодировке.
Игорь пишет 28.09.2013 в 02:07 #
Прицепил вместо дисплея от Nokia 1100 дисплей от Nokia 1202 — работает на «ура!». Убавил задержки в функции lcd1100_write до минимума (как в исходном коде библиотеке) — работает. Контроллер у него пошустрее, видимо, чем у 1100, да и по-контрастнее он внешне, чем 1100.
Игорь пишет 28.09.2013 в 03:19 #
Прочитав эту статью http://we.easyelectronics.ru/OlegG/ispolzovanie-usart-stm32-dlya-upravleniya-lcd-nokia-1202.html, изменил функцию инициализации для 1202:
void lcd1100_init(void)
{
delay_lcd1100(10); //100
lcd1100_CS_off;
lcd1100_RST_off;
delay_lcd1100(100); //1000
lcd1100_RST_on;
delay_lcd1100(1); //1
lcd1100_write(lcd1100_CMD,0xE2);
lcd1100_write(lcd1100_CMD,0x3D);
lcd1100_write(lcd1100_CMD,0x01);
lcd1100_write(lcd1100_CMD,0xE1);
lcd1100_write(lcd1100_CMD,0x16);
lcd1100_write(lcd1100_CMD,0xA4);
lcd1100_write(lcd1100_CMD,0x2F);
lcd1100_write(lcd1100_CMD,0xAF);
lcd1100_clear();
}
Дисплейчик хорош, ярче и контрастнее, чем 1100, только символы на нем меньшей высоты получаются, чем на 1100: у 1100 пиксель прямоугольной формы, вертикально вытянутый, а у 1202 — строго квадратный. 🙂
Alex_EXE пишет 02.10.2013 в 07:44 #
А какой у Вас дисплей 1100? Покупали с подложкой, где ещё остаются свободные контакты по бокам или чисто дисплей без довесков, как на фото, или оригинал?
Для дисплея 1202, если символы маловаты — то можете их растянуть, если готов пожертвовать разрешением.
Так же могу отметить о существовании не только 1100 и 1202, их в серии нокии очень много (3310, 2760, 1100i…) у каждого есть своя небольшая особенность, а управление идентичное, ну или почти идентичное может быть. Жаль только начинают пропадать из продажи, на мой взгляд они гораздо удобнее (для некоторых задач), дешевле и компактнее, чем графические от Winstar.
Игорь пишет 02.10.2013 в 14:51 #
Покупал 1100 как модуль, экран + железяка + динамик, в магазине «Профи», они там рублей по 40 были, уж с год назад. Сейчас 1202 даже дешевле продаются. И 3310 есть, и 2760, и 1110i. 3310 запускал на меге88, все пашет — статейка была на изиэлектрониксе, но он без подсветки, к нему только колхозить что-то. Есть и 1616, цветной, вот его было бы интересно поковырять. На изиэлектрониксе были статьи по подключению 1616 http://we.easyelectronics.ru/lcd_gfx/podklyuchenie-displeya-nokia-1616-na-primere-lpc1343.html , вот сайт автора этой статьи http://angel5a.narod.ru/lcd/lcdn1616_1.html , но к LPC1343, с использованием аппаратного SPI. Портировать это дело под софтовый SPI я как-то не осилил…
С Winstar’ом я бы даже не стал сравнивать — нокиевские куда компактнее и на порядок дешевле. Winstar издалека рассматривать только, с такими-то размерами пикселя…
Alex_EXE пишет 05.10.2013 в 00:09 #
Такой то же есть наличии, надо будет им проверить.
У винстара есть ещё один плюс — их легче доставать, если нужно в серию (в смысле, дисплеи от сотовых начинают заканчиваться, а дисплеи под серийное устройство должны быть и должны быть стандартизированы). Но это не имеет отношения к статье.
Игорь пишет 05.10.2013 в 00:50 #
Ну, под большую серию можно напрямую у китайцев заказать экран, с нужными параметрами. А нам-то куда под серию для кулацкого хозяйства. 😀 Так, для самоделок всяческих…
Serenbkii пишет 18.06.2014 в 17:16 #
Привет! А как выводить картинки?
Alex_EXE пишет 18.06.2014 в 17:46 #
Посмотрите в этой статье — Генератор изображений
Alex_EXE пишет 21.01.2015 в 18:53 #
Если честно то я не особо могу понять смысл кода и из второго сообщения, пришлите мне код на мыло.
Как вариант могу посоветовать перейти на CoCoox, она и бесплатная и кирилица нормально отображается + ещё свои плюшки есть. Только ставте предыдущею версию 1.7.7, 2 версия, как-то очень непонятно работает.
Когда ещё начинал работать в Keil то кирилицу набирал вообще из Notepad++ в виндовой кодировке.
Алекс пишет 22.01.2015 в 02:33 #
Так ты и не поймешь))) во втором сообщении тоже чушь.
Только начал с арм разбираться, среда была выбрана методом тыка. Кто ж знал. В Keil 4.74 кириллица отображается нормально. Только вот в кодировке UTF-8. А в либе декодирование из ASCII. На дисплее РРРР, ну тут один товарищ писал об этом. Исправляется даже таким чайником как я, за 20 минут, а при знании стандарта думаю все сократится до 20 секунд. В общем хотел помочь таким же разгильдяям как я сам.
Ящик я указал естественно не свой, спам замучил, твой ящик я не нашел на сайте. Это сообщение с моим реальным ящиком. Пред идущие три сообщения можешь удалять. Если интересны те несколько строк, что я намалевал в твоей либе и ты замочишься что бы их кинуть в коменты, то пиши пришлю))
Cyrill пишет 05.03.2015 в 16:18 #
а по подробнее как победить кирилицу? собрал в кейле проэкт русские буквы С и Р
Cyrill пишет 05.03.2015 в 17:43 #
и еще как выводить например состояние шим от 0 до 100 процентов ?
Alex_EXE пишет 10.03.2015 в 01:47 #
В кейле русский шрифт отображаеться в юникоде. Нужно текст писать или в шестнадцатерички, или шрифты кодировать в юникоде (тогда размер алфавита вырастет в 2 раза и данная программа этого не умеет), или русский текст писать в другом редакторе, или вынести в другой файлы, который редактируеться в другом редакторе, а в основной код вставить через #defaine.
В своё время кодировал в notepad++, а компилировал в Keil, теперь же перешел на CooCox, в нём таких проблем не наблюдал.
Юрий пишет 17.07.2015 в 15:07 #
у меня плата nucleo-f334, использовал keil 5 и cubeMX для портирования, после небольших изменений программа скомпилировалась, но на экран ничего не выводится (увеличение задержек не помогло), может дисплей виноват? На экране никакого движения, схема включения 1:1 (стабилитрон на 2,7в, резистор уменьшил до 150 Ом т.к. напряжение было 2,4в) ???
Вася пишет 05.10.2015 в 13:25 #
Доброго времени суток!
Подключил дисплей забрал вашу библиотеку увеличил задержки символы посыпались. Но вопрос в том что задом наперед((( в чем может быть заморочка??? Подскажите плиз111
Дмитрий пишет 17.03.2020 в 18:39 #
Огромное спасибо за библиотеку! С помощью нее подключил китайский дисплей HX1230 к stm32F100 VL Discovery. Сначала сделал попытку реализовать подключение через аппаратный SPI. Но как и все, уперся в проблему отсутствия аппаратной поддержки формата кадра в 9 бит.
Потом переконфигурировал библиотеку на свои GPIO и все заработало! Ура! С первого раза! Я не ожидал такого эффекта!Уже приготовился сидеть с осциллографом измерять временные задержки и курить даташит на дисплей. Огромно спасибо за сэкономленное время. Рекомендую!