Подключение дисплея от nokia1100 к STM32

В своё время уже писал, как применял этот замечательный дисплей с PIC микроконтроллерами . Сейчас попробуем его подключить к STM32.

Применение дисплея nokia1100 с 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.

21 комментарий »

Alex_EXE | 11.09.2013 | STM32 | 15 378 просмотров

21 комментарий на « Подключение дисплея от nokia1100 к STM32»

  1. Игорь пишет 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

    Пробовал и такую инициализацию — никакого толку…

  2. Alex_EXE пишет 18.09.2013 в 03:14 #

    Как подключаете дисплей? Точнее как питаете?
    Можете попробовать инициализацию из статьи по дисплею 2760.
    Можете попробовать подкоректировать функцию задержки в библиотеки дисплея, а точнее множитель.

  3. Игорь пишет 19.09.2013 в 01:10 #

    Питаю аналогично тому, как и при подключении к Меге88 — с нею-то все работает. Тоже подозреваю, что дело в таймингах задержек в библиотеке. Пробовал менять задержки в процедуре инициализации — не помогло. На досуге поковыряю другие функции библиотеки, где используются задержки.

  4. Игорь пишет 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);
    }

    Спасибо за статью и помощь.

  5. Игорь пишет 27.09.2013 в 01:27 #

    И еще момент — не выводятся нормально русские буквы. Вместо «96×65 точек» выводится «96×65 CPCPP», вместо «мм» — «РР». Через функцию lcd1100_test() — все буквы отображаются нормально. Как вариант — чудит Кейл? Версия — 4.7 .

  6. Alex_EXE пишет 27.09.2013 в 02:17 #

    До рабочего места добрался, но еще проверить не успел. Выздровил, но с оформлением больничного целая эпопея, завтра пойду переоформлять.
    Спасибо за замечания. Когда смогу сесть спокойно — проверю.
    На счет русского языка — да это кейл чудит, какие-то глюки с кодировками у него. Если и комментарии, и текст пишу в кейл, то выводит так, как у Вас, если пишу текст для дисплея в notepad++ — то в кейл он отображается кракозябрами, зато выводиться нормально. С кирилицей у него основательные проблемы, для нормального отображения комментариев файлы новых проектов отдельно перекодирую в UTF (если не путаю), но выводимый текст видать ему подавай в родной кодировке.

  7. Игорь пишет 28.09.2013 в 02:07 #

    Прицепил вместо дисплея от Nokia 1100 дисплей от Nokia 1202 — работает на «ура!». Убавил задержки в функции lcd1100_write до минимума (как в исходном коде библиотеке) — работает. Контроллер у него пошустрее, видимо, чем у 1100, да и по-контрастнее он внешне, чем 1100.

  8. Игорь пишет 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 — строго квадратный. 🙂

  9. Alex_EXE пишет 02.10.2013 в 07:44 #

    А какой у Вас дисплей 1100? Покупали с подложкой, где ещё остаются свободные контакты по бокам или чисто дисплей без довесков, как на фото, или оригинал?
    Для дисплея 1202, если символы маловаты — то можете их растянуть, если готов пожертвовать разрешением.
    Так же могу отметить о существовании не только 1100 и 1202, их в серии нокии очень много (3310, 2760, 1100i…) у каждого есть своя небольшая особенность, а управление идентичное, ну или почти идентичное может быть. Жаль только начинают пропадать из продажи, на мой взгляд они гораздо удобнее (для некоторых задач), дешевле и компактнее, чем графические от Winstar.

  10. Игорь пишет 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 издалека рассматривать только, с такими-то размерами пикселя…

  11. Alex_EXE пишет 05.10.2013 в 00:09 #

    Такой то же есть наличии, надо будет им проверить.

    У винстара есть ещё один плюс — их легче доставать, если нужно в серию (в смысле, дисплеи от сотовых начинают заканчиваться, а дисплеи под серийное устройство должны быть и должны быть стандартизированы). Но это не имеет отношения к статье.

  12. Игорь пишет 05.10.2013 в 00:50 #

    Ну, под большую серию можно напрямую у китайцев заказать экран, с нужными параметрами. А нам-то куда под серию для кулацкого хозяйства. 😀 Так, для самоделок всяческих…

  13. Serenbkii пишет 18.06.2014 в 17:16 #

    Привет! А как выводить картинки?

  14. Alex_EXE пишет 18.06.2014 в 17:46 #

    Посмотрите в этой статье — Генератор изображений

  15. Alex_EXE пишет 21.01.2015 в 18:53 #

    Если честно то я не особо могу понять смысл кода и из второго сообщения, пришлите мне код на мыло.

    Как вариант могу посоветовать перейти на CoCoox, она и бесплатная и кирилица нормально отображается + ещё свои плюшки есть. Только ставте предыдущею версию 1.7.7, 2 версия, как-то очень непонятно работает.
    Когда ещё начинал работать в Keil то кирилицу набирал вообще из Notepad++ в виндовой кодировке.

  16. Алекс пишет 22.01.2015 в 02:33 #

    Так ты и не поймешь))) во втором сообщении тоже чушь.
    Только начал с арм разбираться, среда была выбрана методом тыка. Кто ж знал. В Keil 4.74 кириллица отображается нормально. Только вот в кодировке UTF-8. А в либе декодирование из ASCII. На дисплее РРРР, ну тут один товарищ писал об этом. Исправляется даже таким чайником как я, за 20 минут, а при знании стандарта думаю все сократится до 20 секунд. В общем хотел помочь таким же разгильдяям как я сам.
    Ящик я указал естественно не свой, спам замучил, твой ящик я не нашел на сайте. Это сообщение с моим реальным ящиком. Пред идущие три сообщения можешь удалять. Если интересны те несколько строк, что я намалевал в твоей либе и ты замочишься что бы их кинуть в коменты, то пиши пришлю))

  17. Cyrill пишет 05.03.2015 в 16:18 #

    а по подробнее как победить кирилицу? собрал в кейле проэкт русские буквы С и Р

  18. Cyrill пишет 05.03.2015 в 17:43 #

    и еще как выводить например состояние шим от 0 до 100 процентов ?

  19. Alex_EXE пишет 10.03.2015 в 01:47 #

    В кейле русский шрифт отображаеться в юникоде. Нужно текст писать или в шестнадцатерички, или шрифты кодировать в юникоде (тогда размер алфавита вырастет в 2 раза и данная программа этого не умеет), или русский текст писать в другом редакторе, или вынести в другой файлы, который редактируеться в другом редакторе, а в основной код вставить через #defaine.
    В своё время кодировал в notepad++, а компилировал в Keil, теперь же перешел на CooCox, в нём таких проблем не наблюдал.

  20. Юрий пишет 17.07.2015 в 15:07 #

    у меня плата nucleo-f334, использовал keil 5 и cubeMX для портирования, после небольших изменений программа скомпилировалась, но на экран ничего не выводится (увеличение задержек не помогло), может дисплей виноват? На экране никакого движения, схема включения 1:1 (стабилитрон на 2,7в, резистор уменьшил до 150 Ом т.к. напряжение было 2,4в) ???

  21. Вася пишет 05.10.2015 в 13:25 #

    Доброго времени суток!

    Подключил дисплей забрал вашу библиотеку увеличил задержки символы посыпались. Но вопрос в том что задом наперед((( в чем может быть заморочка??? Подскажите плиз111

Комментарии RSS

Оставьте отзыв