Применение дисплея от nokia1100

Дисплей – удобное средство вывода разнообразной информации. На них можно не только выводит различную необходимую информацию, но и визуализировать процессы работы приборов. Большую пользу они могут принести на стадии отладки или диагностики устройства. Но стоимость специализированных дисплеев зачастую велика, а возможностей семисегментных индикаторов и знакогенерирующих дисплеев может не хватать, здесь на помощь, приходя маленькие компактные дисплеи от сотовых телефонов.

Дисплей от Nokia 1100

Дисплей от Nokia 1100

В этой статье расскажу о том, как подключить к микроконтроллеру и использовать в текстовом режиме дисплей от сотового телефона nokia 1100.

В ранних статьях уже рассматривался дисплей от nokia 3310. По сравнению с ним у этого дисплея есть небольшой недостаток – меньший размер (35×35 мм), но есть свои плюсы.

Плюсы дисплея:

  • Маленький дисплей с относительно большим разрешением 96х65 (символами размера 5х8 можно заполнить 8 строк по 16 знаков)
  • Встроенная подсветка
  • 4 линии управления
  • Дешевый – 40 рублей

Минусы дисплея:

  • Маленький размер
  • 3,3 В линии связи и питание (при использование 5В)

Как уже упомянул в плюсах – для подключения к контроллеру достаточно 4-х линий (SCLK, SDA, CS, Reset), что существенно экономит выводы МК.

Распиновка

Распиновка

Из упомянутых минусов (при работе от 5В) это 3,3В питание и логические уровни, поэтому была разработана небольшая плата переходник.

Сопряжении с МК

Для подключения к контроллеру, с питанием от 5В, предлагаю следующий вариант:

Схема сопряжения

Схема сопряжения

С цепи стабилизации, выполненной на стабилитроне, одновременно запитан сам дисплей и его подсветка. Связь с дисплеем используется только односторонняя, поэтому делители напряжений на линиях управления состоят из резисторов по 4,7кОма. Такой вариант включения считаю не идеальным, но рабочим.

Печатка

Печатка

Плата сопряжения

Плата сопряжения

Подключение к PIC16F628A

Дисплей был подключен к микроконтроллеру PIC16F628A следующим способом

Дисплей от Nokia 1100

Схема подключения к PIC16F628A

Как видно на схеме, выводы сопрягаются следующим образом: RES – RB4, CS – RB5, SDA – RB6, SCLK – RB7.

Прошивка

Как было сказана в начале статьи, работа с дисплеем реализована только в текстовом режиме. За основы были взяты наработки, полученные при работе с экраном от nokia 3310.

Для рабы с дисплеем доступны следующие функции:

  • lcd_init() – инициализация дисплея
  • lcd_clear() – очистка дисплея
  • lcd_test() – функция проверки дисплея (заполняет весь экран символами)
  • lcd_putch(char) – функция вывода символа размером 5х8
  • lcd_puts(const char *s) – вывод строки при помощи функции lcd_putch(char)
  • lcd_gotoxy(int X, int Y) – переход к символу расположенному в Y строке, на X позиции

Из предыдущего проекта так же перекочевала таблица символов, содержащая английский и русский алфавиты, цифры и специальные символы, т.е. почти вся ASCII во всей своей красе:

ASCII

ASCII

ещё 31 строчная буква Великого и Могучего, к сожалению, не влезли.

Для работы понадобятся следующие дефайны:

#define SetBit(x,y) (x|=(1< <y))
#define ClrBit(x,y) (x&=~(1<<y))

#define SCLK_on 	SetBit(PORTB,7)
#define SDA_on 		SetBit(PORTB,6)
#define CS_on 		SetBit(PORTB,5)
#define RST_on 		SetBit(PORTB,4)
#define SCLK_off 	ClrBit(PORTB,7)
#define SDA_off 	ClrBit(PORTB,6)
#define CS_off 		ClrBit(PORTB,5)
#define RST_off 	ClrBit(PORTB,4)

#define lcd_CMD		0
#define lcd_DATA	1

которые сопоставляют выводы контроллера с выводами дисплея.

Пример вывода текста по середине экрана будет выглядеть следующим образом:

lcd_gotoxy(2, 3);
lcd_puts("Hello, World");

Hello, World

Hello, World

Относительно большие размеры дисплея 96х65 точек, позволяют выводить до 128 символов, размера 5х8, одновременно, в 8 строчках по 16 букв:

Текстовые возможности дисплея

Текстовые возможности дисплея

К сожалению, проект получился очень весомым и занял 77,8% памяти микроконтроллера PIC16F628A, а это целых – 1593 байта. Но не забывайте, что большую часть занимает массив шрифта – lcd_fonts, который вмешает 159 5-ти байтных символа, а это 795 байт. Для облегчения проекта можно исключить русскую или английскую кодировку.

Для демонстрации возможностей дисплея была написана небольшая демка, содержащая 4 сменяющееся кадра: информация о проекте (первая фотография), возможности дисплея (последняя картинка), частично влезавшая таблица ASCII, выводимая функцией lcd_test() (4 фото) и наконец простой пример работы – «Привет, Мир» (предпоследний скрин экрана).

Скачать исходник, прошивку и печатку в SP5

При написании статьи использовались материалы с сайта www.sunbizhosting.com

Используемый компилятор – Hi-Tech 9.70

32 комментария на « Применение дисплея от nokia1100»

  1. Павел пишет 05.12.2011 в 02:42 #

    Недавно обнаружил, что некоторые LCDшки не ‘заводятся’ если программно передергивать при старе Reset, и прекрасно работают если его повесить на +, а сбросить контроллер LCD программно командой(если не путаю, то 0xE2). Это касается и 1110 и 1110i. Причина мне до конца не ясна — но факт на лицо.

  2. андрей пишет 21.12.2011 в 11:58 #

    а почему после прошивки он выводит слова с права на лево ?

  3. lan пишет 21.12.2011 в 12:30 #

    >а почему после прошивки он выводит слова с права на лево ?
    Чтоб отразить дисплей по оси Y,
    в строке 266 файла прошивки поменять
    lcd_write(lcd_CMD,0xC8);
    на
    lcd_write(lcd_CMD,0xC0);

  4. андрей пишет 21.12.2011 в 23:27 #

    спасибо большое =)

  5. Валерий пишет 16.02.2012 в 19:30 #

    Здравствуйте. Спасибо за статью, для ознакомления очень полезна. Собрал схему, только что-то у меня контрастность слабая. Подскажите как добавить. Спасибо

  6. Alex_EXE пишет 19.02.2012 в 14:30 #

    Попробуйте понизить напряжение, подаваемое на дисплей. В моём варианте включения напряжение проседает на светодиоде и все работает хорошо.

  7. Вадим пишет 11.04.2012 в 20:15 #

    А что делать если постоянно пустой дисплей (пробовал 2 шт.оригинал и китайский)?, распайка верно, проц. рабочий, кварц тоже генерит, схема включения как в статье…

  8. Вадим пишет 12.04.2012 в 19:14 #

    Два 1100 (оригинал и катай) отказались работать, а вот 1110(i) заработал, спасибо за статью.

  9. Alex_EXE пишет 17.04.2012 в 10:16 #

    Спасибо за замечании, проверю.

  10. pawel пишет 08.07.2012 в 12:36 #

    а на lsd от самсунга можно что то сделать???
    а то воляються у меня два дисплея

  11. Alex_EXE пишет 20.07.2012 в 00:51 #

    Сделать можно, в интернете наверно можно найти схемы подключения, но я с ними дела не имел.

  12. atac13 пишет 09.12.2012 в 23:26 #

    собрал специацельно для проверки 1100,такая же байда как у чела раньше,
    1100 не заработал!
    1110i — РАБОТАЕТ (только зеркально)
    1202 ——РАБОТАЕТ (тоже зеракльно)

    ну хоть остальные проверил…
    спасибо за статью.

  13. Alex_EXE пишет 10.12.2012 в 20:17 #

    Можете попробовать инициализацию из статьи про дисплей 2760.

  14. jeka_tm пишет 05.03.2013 в 22:18 #

    Попытался портировать на PIC16F877A. В протеусе работает, а в реале нет. Дисплей пробовал 1100 и 1202. Оба точно рабочие, предварительно проверил на всякий случай на других платах и с пиками и авр.
    http://yadi.sk/d/owIb_drN34Kdd
    здесь кинул исходник и скриншоты из протеуса.
    и еще компилятор ругается
    Warning [750] F:\BK300 PIC16F877A\Asm\1100\LCD 1100.c; 294. constant operand to || or &&
    Warning [765] F:\BK300 PIC16F877A\Asm\1100\LCD 1100.c; 294. degenerate unsigned comparison

  15. jeka_tm пишет 05.03.2013 в 23:42 #

    забыл сказать. кварц 4 мгц
    http://i.ebayimg.com/t/PIC-Development-Board-Kit-Microchip-PIC16F877A-/00/s/NDA4WDYwMA==/$(KGrHqZ,!loFCCP8tLUwBQt)Y8Fqh!~~60_3.JPG

  16. jeka_tm пишет 20.03.2013 в 12:43 #

    void main()
    {
    low_init();
    lcd_init();
    while(1==1)
    {
    lcd_gotoxy(1,1);
    lcd_puts("Кнопка нажата?"); // как сюда вставить переменную

    }
    }

    или может нужна для этого еще одна функция

  17. Alex_EXE пишет 21.03.2013 в 00:59 #

    Туда — никак, только вывод текста.
    Могу предложить функцию для вывода чисел от -9999 до 9999.
    void lcd_int(int c)
    {
    unsigned char temp;
    if(c<0)
    {
    lcd_putch('-');
    }
    else
    {
    lcd_putch(' ');
    }
    c=c%10000;
    temp=c/100;
    lcd_putch(temp/10+'0');
    lcd_putch(temp%10+'0');
    c=c%100;
    temp=c;
    lcd_putch(temp/10+'0');
    lcd_putch(temp%10+'0');
    }

  18. jeka_tm пишет 21.03.2013 в 20:43 #

    спасибо буду пробовать

  19. jeka_tm пишет 21.03.2013 в 21:19 #

    похоже моих знаний не хватает использовать данный код. вставил функцию. но как к ней обратиться

    void lcd_int(int c)
    {
    unsigned char temp;
    if(c<0)
    {
    lcd_putch(‘-’); //компилятор ругается на ‘ и ’, может нужны "
    }
    else
    {
    lcd_putch(‘ ‘);
    }
    c=c%10000;
    temp=c/100;
    lcd_putch(temp/10+’0′);
    lcd_putch(temp%10+’0′);
    c=c%100;
    temp=c;
    lcd_putch(temp/10+’0′);
    lcd_putch(temp%10+’0′);
    }

    void main()
    {
    low_init();
    lcd_init();
    while(1==1)
    {
    lcd_gotoxy(2,0);
    lcd_puts("величина = " + с); //может так
    delay1000(3000);
    lcd_clear();

    }
    }

  20. igorok107 пишет 01.11.2013 в 14:03 #

    1110i сначала не заработал, но поковырявшись выяснил, что причиной, почему он не показывал вывод — это поднятый SCLK после передачи байта. добавил в конец функции lcd_write() SCLK_off; и всё заработало.

  21. atac13 пишет 23.12.2013 в 17:33 #

    atac13 пишет 09.12.2012 в 23:26 #

    собрал специацельно для проверки 1100,такая же байда как у чела раньше,
    1100 не заработал!
    1110i — РАБОТАЕТ (только зеркально)
    1202 ——РАБОТАЕТ (тоже зеракльно)

    ну хоть остальные проверил…
    спасибо за статью.

    Alex_EXE пишет 10.12.2012 в 20:17 #

    Можете попробовать инициализацию из статьи про дисплей 2760.

    доброго времени суток! запоздал я что то на год…..работы навалилось…
    пожалуйста если Вам не сложно скинте файл (HEX) для прошивки с этой инициализацией (для дисплея 2760),
    прошить то я могу ,а вот куда вставлять эту инициализацию ….
    Просто пришло время проверить 1100 с помощью вашей схемки (сам дисплеё 100% рабочий проверял на устройстве) а вот ещё тогда ,год назад не захотел светиться в вашей схеме для проверки.
    счас хочу попробовать победить!!!

  22. Виктор пишет 29.12.2013 в 12:32 #

    Подключение дисплея к микроконтроллеру это что-то.
    Фантастика, все так просто делается. Очень нравится.

  23. Chettus пишет 31.03.2014 в 22:57 #

    Аппаратный SPI никто не пробовал подключать… с изысками для 9-го бита?

  24. Shad пишет 08.05.2014 в 03:39 #

    На мк AVR использую аппаратный spi, все прекрасно работает (причем ощутимо быстрее чем при использовании полностью программной реализации).
    Первый бит передаю программно (как здесь в исходниках) предварительно отключив аппаратный spi, далее включаю аппаратный spi и передаю оставшиеся 8 бит с помощью него.

  25. Chettus пишет 24.05.2014 в 17:51 #

    А USART ни кто не пользовал в качестве 9-bit SPI?

    И ещё вопрос, подскажите где можно узнать поподробнее как работает декодирование символа?
    (unsigned char lcd_symbol_decode(unsigned char c)
    ) Я не могу понять как работает эта функция и почему например вместо «А» она не декодирует например «,»? Или это заложено в возможности компилятора?

  26. Alex_EXE пишет 31.05.2014 в 00:45 #

    По первому вопросу не подскажу.
    По второму вопросу: в ASCII есть цифры, латиница, кирилица, знаки и куча служебных и редко используемых символов. Так же в микроконтроллерах, тем более 8-ми битных, ограниченное количество памяти и что бы её сэкономить были исключены из выводимой таблицы не отображаемые символы, но что бы сохранить соответствие с ASCII символами было введено смещение по основным группам символам, чем и занимается функция lcd_symbol_decode.

  27. Chettus пишет 10.06.2014 в 00:32 #

    Попытался использовать аппаратный SPI, команда/данные выводил вручную, остальное — аппаратным способом. Дисплей так и не запустился. Микроконтроллер PIC16F887.
    Автор, по Вашим ощущениям — дисплей от 1100 слишком медленный или мне так показалось?
    Я, даже используя программный SPI, был вынужден уменьшать тактовую частоту МК — дисплей просто ен запускался на более высоких частотах.

  28. Chettus пишет 18.06.2014 в 13:22 #

    Не выходит у меня запустить 1100 аппаратным способом на PIC16F887. Видимо причина где то в протоколе.
    По даташиту на драйвер допускается 6,5 МГц на SCLK. Или у китайцев свои параметры.

  29. Alex_EXE пишет 18.06.2014 в 17:50 #

    Данный дисплей на высоких частотах не гонял.
    Возможно несколько причин:
    *В конфигурации дисплея нужно сказать ему, что он высокоскоростной
    *Неправильно настроен SPI
    *или 6.5МГц это только для оригинальных дисплеев

  30. Роман пишет 18.09.2014 в 23:12 #

    У кого не запустился код для 1100 — пробуйте инициализацию от Nokia 2760, у меня заработало!
    CS_LCD_RESET;
    RST_LCD_RESET;
    delay_ms(20);
    RST_LCD_SET;
    delay_ms(2);
    nlcd_SendByte(CMD_LCD_MODE,0xE2);
    delay_ms(10);
    nlcd_SendByte(CMD_LCD_MODE,0xAF);
    nlcd_SendByte(CMD_LCD_MODE,0xA4);
    nlcd_SendByte(CMD_LCD_MODE,0x2F);
    nlcd_SendByte(CMD_LCD_MODE,0xB0);
    nlcd_SendByte(CMD_LCD_MODE,0x10);
    nlcd_SendByte(CMD_LCD_MODE,0x00);
    nlcd_Clear();
    delay_ms(10);
    nlcd_SendByte(CMD_LCD_MODE,0xA6);
    delay_ms(10);

  31. maksi пишет 11.01.2019 в 03:50 #

    Пытаюсь разобраться с выводом символов на дисплей как у вас на фото, чтобы контакты подключения дисплея были СНИЗУ.
    При выводе символов буквы отображаются справа налево (зеркально).
    Подскажите, пожалуйста, за счет какой функции их можно развернуть слева направо, а контакты дисплея оставались снизу?

  32. Alex_EXE пишет 11.01.2019 в 04:50 #

    Сейчас точно не помню, как с ним работать, проверять не начем под рукой.
    Обратите внимание в функции инициализации lcd_init на строки 0xC8 и 0xA1. Попробуйте их поочередно закомментировать. Они, вроде, отвечают за инверсию по осям Y, X.

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

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