Применение дисплея от nokia1100
Дисплей – удобное средство вывода разнообразной информации. На них можно не только выводит различную необходимую информацию, но и визуализировать процессы работы приборов. Большую пользу они могут принести на стадии отладки или диагностики устройства. Но стоимость специализированных дисплеев зачастую велика, а возможностей семисегментных индикаторов и знакогенерирующих дисплеев может не хватать, здесь на помощь, приходя маленькие компактные дисплеи от сотовых телефонов.
Дисплей от 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
Как видно на схеме, выводы сопрягаются следующим образом: 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
ещё 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
Относительно большие размеры дисплея 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
Alex_EXE | 05.10.2011 | Микроконтроллеры |
Павел пишет 05.12.2011 в 02:42 #
Недавно обнаружил, что некоторые LCDшки не ‘заводятся’ если программно передергивать при старе Reset, и прекрасно работают если его повесить на +, а сбросить контроллер LCD программно командой(если не путаю, то 0xE2). Это касается и 1110 и 1110i. Причина мне до конца не ясна — но факт на лицо.
андрей пишет 21.12.2011 в 11:58 #
а почему после прошивки он выводит слова с права на лево ?
lan пишет 21.12.2011 в 12:30 #
>а почему после прошивки он выводит слова с права на лево ?
Чтоб отразить дисплей по оси Y,
в строке 266 файла прошивки поменять
lcd_write(lcd_CMD,0xC8);
на
lcd_write(lcd_CMD,0xC0);
андрей пишет 21.12.2011 в 23:27 #
спасибо большое =)
Валерий пишет 16.02.2012 в 19:30 #
Здравствуйте. Спасибо за статью, для ознакомления очень полезна. Собрал схему, только что-то у меня контрастность слабая. Подскажите как добавить. Спасибо
Alex_EXE пишет 19.02.2012 в 14:30 #
Попробуйте понизить напряжение, подаваемое на дисплей. В моём варианте включения напряжение проседает на светодиоде и все работает хорошо.
Вадим пишет 11.04.2012 в 20:15 #
А что делать если постоянно пустой дисплей (пробовал 2 шт.оригинал и китайский)?, распайка верно, проц. рабочий, кварц тоже генерит, схема включения как в статье…
Вадим пишет 12.04.2012 в 19:14 #
Два 1100 (оригинал и катай) отказались работать, а вот 1110(i) заработал, спасибо за статью.
Alex_EXE пишет 17.04.2012 в 10:16 #
Спасибо за замечании, проверю.
pawel пишет 08.07.2012 в 12:36 #
а на lsd от самсунга можно что то сделать???
а то воляються у меня два дисплея
Alex_EXE пишет 20.07.2012 в 00:51 #
Сделать можно, в интернете наверно можно найти схемы подключения, но я с ними дела не имел.
atac13 пишет 09.12.2012 в 23:26 #
собрал специацельно для проверки 1100,такая же байда как у чела раньше,
1100 не заработал!
1110i — РАБОТАЕТ (только зеркально)
1202 ——РАБОТАЕТ (тоже зеракльно)
ну хоть остальные проверил…
спасибо за статью.
Alex_EXE пишет 10.12.2012 в 20:17 #
Можете попробовать инициализацию из статьи про дисплей 2760.
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
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
jeka_tm пишет 20.03.2013 в 12:43 #
void main()
{
low_init();
lcd_init();
while(1==1)
{
lcd_gotoxy(1,1);
lcd_puts("Кнопка нажата?"); // как сюда вставить переменную
}
}
или может нужна для этого еще одна функция
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');
}
jeka_tm пишет 21.03.2013 в 20:43 #
спасибо буду пробовать
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();
}
}
igorok107 пишет 01.11.2013 в 14:03 #
1110i сначала не заработал, но поковырявшись выяснил, что причиной, почему он не показывал вывод — это поднятый SCLK после передачи байта. добавил в конец функции lcd_write() SCLK_off; и всё заработало.
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% рабочий проверял на устройстве) а вот ещё тогда ,год назад не захотел светиться в вашей схеме для проверки.
счас хочу попробовать победить!!!
Виктор пишет 29.12.2013 в 12:32 #
Подключение дисплея к микроконтроллеру это что-то.
Фантастика, все так просто делается. Очень нравится.
Chettus пишет 31.03.2014 в 22:57 #
Аппаратный SPI никто не пробовал подключать… с изысками для 9-го бита?
Shad пишет 08.05.2014 в 03:39 #
На мк AVR использую аппаратный spi, все прекрасно работает (причем ощутимо быстрее чем при использовании полностью программной реализации).
Первый бит передаю программно (как здесь в исходниках) предварительно отключив аппаратный spi, далее включаю аппаратный spi и передаю оставшиеся 8 бит с помощью него.
Chettus пишет 24.05.2014 в 17:51 #
А USART ни кто не пользовал в качестве 9-bit SPI?
И ещё вопрос, подскажите где можно узнать поподробнее как работает декодирование символа?
(unsigned char lcd_symbol_decode(unsigned char c)
) Я не могу понять как работает эта функция и почему например вместо «А» она не декодирует например «,»? Или это заложено в возможности компилятора?
Alex_EXE пишет 31.05.2014 в 00:45 #
По первому вопросу не подскажу.
По второму вопросу: в ASCII есть цифры, латиница, кирилица, знаки и куча служебных и редко используемых символов. Так же в микроконтроллерах, тем более 8-ми битных, ограниченное количество памяти и что бы её сэкономить были исключены из выводимой таблицы не отображаемые символы, но что бы сохранить соответствие с ASCII символами было введено смещение по основным группам символам, чем и занимается функция lcd_symbol_decode.
Chettus пишет 10.06.2014 в 00:32 #
Попытался использовать аппаратный SPI, команда/данные выводил вручную, остальное — аппаратным способом. Дисплей так и не запустился. Микроконтроллер PIC16F887.
Автор, по Вашим ощущениям — дисплей от 1100 слишком медленный или мне так показалось?
Я, даже используя программный SPI, был вынужден уменьшать тактовую частоту МК — дисплей просто ен запускался на более высоких частотах.
Chettus пишет 18.06.2014 в 13:22 #
Не выходит у меня запустить 1100 аппаратным способом на PIC16F887. Видимо причина где то в протоколе.
По даташиту на драйвер допускается 6,5 МГц на SCLK. Или у китайцев свои параметры.
Alex_EXE пишет 18.06.2014 в 17:50 #
Данный дисплей на высоких частотах не гонял.
Возможно несколько причин:
*В конфигурации дисплея нужно сказать ему, что он высокоскоростной
*Неправильно настроен SPI
*или 6.5МГц это только для оригинальных дисплеев
Роман пишет 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);
maksi пишет 11.01.2019 в 03:50 #
Пытаюсь разобраться с выводом символов на дисплей как у вас на фото, чтобы контакты подключения дисплея были СНИЗУ.
При выводе символов буквы отображаются справа налево (зеркально).
Подскажите, пожалуйста, за счет какой функции их можно развернуть слева направо, а контакты дисплея оставались снизу?
Alex_EXE пишет 11.01.2019 в 04:50 #
Сейчас точно не помню, как с ним работать, проверять не начем под рукой.
Обратите внимание в функции инициализации lcd_init на строки 0xC8 и 0xA1. Попробуйте их поочередно закомментировать. Они, вроде, отвечают за инверсию по осям Y, X.