Описание функций графической библиотеки для LCD-экрана от Nokia 1100

Решил сделать небольшое описание функций библиотеки или моя попытка как-то написать документацию к библиотеке.

Описание функций графической библиотеки для LCD-экрана от Nokia 1100

void nlcd_Init(void);
Инициализация контроллера PCF8814, очистка экрана, инициализация библиотеки.

void nlcd_Clear(void);
Очистка экрана. Очищает экран (и видеобуфер) и устанавливает текущие координаты в нулевые координаты (левый верхний угол).

void nlcd_SendByte(char mode,unsigned char c);
Отправляет байт в контроллер PCF8814. Если передаются данные, то они также сохраняются в видеобуфере.
Параметры:
mode:
— CMD_LCD_MODE — передается команда контроллеру
— DATA_LCD_MODE — передаются данные
с: передаваемый байт

void nlcd_Putc(unsigned char c);
Выводит знак с кодом C в текущее место

void nlcd_Print(char * message);
Выводит строку символов из оперативной памяти, начиная с текущего знакоместа.

void nlcd_PrintF(unsigned char * message);
Выводит строку символов из программной памяти, начиная с текущего знакоместа.

void nlcd_GotoXY(char x,char y);
Устанавливает текущие координаты. Отсчет идет в знакоместах 5×8.
Параметры:
x: 0..15 — координата по оси X
y: 0..7 — координата по оси Y

void nlcd_Inverse(unsigned char mode);
Устанавливает режим инверсии для всего экрана.
Параметры:
mode:
— INV_MODE_ON — инверсия включена
— INV_MODE_OFF — инверсия выключена

void nlcd_Pixel (unsigned char x,unsigned char y, unsigned char pixel_mode);
Выводит пиксель в указанные координаты.
Параметры:
x: 0..95 — координата по оси X
y: 0..64 — координата по оси Y
Отсчет ведется от верхнего левого угла.
pixel_mode:
— PIXEL_ON — пиксель устанавливается
— PIXEL_OFF — пиксель сбрасывается (стирается)
— PIXEL_INV — пиксель инвертируется

void nlcd_Line (unsigned char x1,unsigned char y1, unsigned char x2,unsigned char y2, unsigned char pixel_mode);
Рисует линию. Линия рисуется из точки с координатами x1, y1 в точку с координатами x2,y2.
Параметры:
x1, x2: 0..95
y1,y2: 0..64
pixel_mode: такой же как и в функции nlcd_Pixel.

void nlcd_Circle(unsigned char x, unsigned char y, unsigned char radius, unsigned char fill, unsigned char pixel_mode);
Рисует закрашенную или нет окружность с координатами центра x, y и радиусом radius.
Параметры:
x: 0..95
y: 0..64
fill:
— FILL_ON — заливка выполняется
— FILL_OFF — заливка не выполняется
pixel_mode: такой же как и в функции nlcd_Pixel.

void nlcd_Rect (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char fill, unsigned char pixel_mode);
Рисует прямоугольник. Пары значений x1, y1 и x2, y2 задают координаты противоположных углов по диагонали. Прямоугольник может иметь заливку.
Параметры:
x1, x2: 0..95
y1, y2: 0..64
fill: такой же как и в функции nlcd_Circle
pixel_mode: такой же как и в функции nlcd_Pixel.

 

Скачать

AVR GCC

Файлы графического варианта библиотеки (версия 2.1):


CodeVision AVR

Адаптация библиотеки для компилятора CodeVision AVR: ujin, за что ему громаднейшее спасибо!

Еще одна адаптация первого варианта библиотеки для CodeVision от ujin


Arduino

Библиотеку на платформу Ардуино портировал igorok107, за что ему громаднейшее спасибо!


Дополнительно

VSM-модели экранов Nokia для Proteus

symbol generate.zip — генератор символов шрифта для библиотеки
image_generate.zip — генератор картинок для библиотеки

56 комментариев на “Описание функций графической библиотеки для LCD-экрана от Nokia 1100”

  1. спасибо за столь хорошо описанную библиотеку!

  2. Уважаемый автор, а для cvavr у Вас не завалялось библиотеки?

    • К сожалению, у меня с CVAVR не сложилось… 🙁
      Но я думаю эту либу можно переделать для CVAVR с минимальными изменениями.

  3. И еще вопрос, с экраном Nokia 3310 работать будет?

    • Нет, с 3310 работать не будет. Там немного другой контроллер экрана и другая система команд.

  4. ув. Chiper, выложите пожалуйста сюда рабочий для компиляции проект под среду AVRStudio (у меня версия 4.19), никак не получается скомпилировать свой проект…

    • А в чем у вас возникает проблема?

      • появляется единственная ошибка:
        Interrupts/Exception caught (code = 0xc00000fd, addr = 0x4227d3)
        и HEX файл не генерится..
        Я взял ваши библиотеки и собрал из них проект с расширением APS, названия хедеров брал те же, в окне «AVR-GCC» файл nokia1100_lcd_lib.c создавал в Other Files, хедеры — в Header Files.
        Как бы мне сюда выложить свой APS проект, может посмотрите почему не компилирует?

        • Шлите архив мне на почту. Попробую помочь.

          •  какой ваш емаил-то?

            • xsidmail [гаф-гаф] почтагугла.com

              [задумчиво]… надо бы сделать возможность пользователям добавлять файлы на сайт…[/задумчиво]

              • отослал, как всё получится вышлите мне проект тоже на емаил,
                спасибо большое!

              • Вечером посмотрю. Где бы еще Студию 4.19 взять…

              • Так и не получил письма. Может в спам улетело? У меня нигде его нет.

              • Все, нашел. Действительно в спам попало… Хз почему так гугл подумал…

        • Вы просто файл nokia1110_lcd_lib.c в проекте добавили не в ту секцию. Надо его добавлять в Source Files, а вы его добавили в Other Files.

          • ага, я ещё вчера так додумался сделать — всё заработало. 🙂
            В протеусе по крайней мере работает норм..соберу на макетке, отпишусь, спасибо за помощь!

  5. Chiper, скажите пожалуйста,  можно ли инвертировать не весь экран, а строку?
    Спасибо

    • В библиотеке в том виде котором она сейчас, нельзя (я думал про это, но потом отказался). Существует 2 решения:

      — переписать процедуру вывода символа, введя, к примеру, дополнительный параметр, который будет задавать режим вывода, как в процедуре nlcd_Pixel
      — не переделывать библиотеку, а там где нужна инверсия строки, сначало вывесли текст, а потом поверх нарисовать закрашенный прямоугольник с параметром pixel_mode — PIXEL_INV

      Как поступить — решать вам. Результат будет одинаков.

      • Если получится попробую добавить еще одну функцию вывода, а если нет-буду рисовать прямоугольники:)

        • Та а че думать то… Процедура вывода символа может выглядеть примерно так:

          //******************************************************************************
          // Вывод символа на LCD-экран NOKIA 1100 в текущее место
          //  c: код символа
          void nlcd_Putc(unsigned char c, unsigned char pixel_mode)
          {
          	unsigned char datas;
          	
          	if (c>127) c=c-64; 	// Переносим символы кирилицы в кодировке CP1251 в начало второй
          						// половины таблицы ASCII (начиная с кода 0x80)
          	
          	for ( unsigned char i = 0; i < 5; i++ )
          	{
          		datas = pgm_read_byte(&(nlcd_Font[c-32][i]));
          		switch(pixel_mode)
          		{
          			case PIXEL_INV:
          				datas=datas xor $FF;			// Инвертируем выводимый байт
          				break;
          		}
          		nlcd_SendByte(DATA_LCD_MODE,datas);
              }
          	nlcd_SendByte(DATA_LCD_MODE,0x00); // Зазор между символами по горизонтали в 1 пиксель
          }
          

          Естественно, надо в остальной библиотеке поменять вызовы на этот вариант, с указанием pixel_mode.

          • Вылезает ошибка

             In file included from test.c:6:c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c: In function ‘nlcd_Putc’:c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c:173: error: expected ‘;’ before ‘xor’c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c:173: error: stray ‘$’ in program

            • Замени xor на символ ^.

              •  [code] In file included from test.c:6:
                c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c: In function ‘nlcd_Putc’:
                c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c:173: error: stray ‘$’ in program
                c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c:173: error: ‘FF’ undeclared (first use in this function)
                c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c:173: error: (Each undeclared identifier is reported only once
                c:/winavr-20100110/lib/gcc/../../avr/include/avr/nokia1100_lcd_lib_graph.c:173: error: for each function it appears in.)[/code]

            • еще $FF надо заменить на 0xFF. Блин, запарился с разными стандартами написания шестнадцатеричных чисел…

  6. Александр

    Подскажите совсем начинающему, как перейти на кодировку UTF8?
    Работаю под Linux.
    Или, если не трудно, сделайте соответствующую библиотеку.

  7. Виталий

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

    • То, что отзеркалено — смотри процедуру инициализации, в ней все дело. Там и задается режим работы.

  8. Виталий

    Спасибо разобрался. Еще хотел спросить, как свои символы выводить ? Если можно пример кода какого либо не стандартного символа.

    • Генерируете символ с помощью программы http://digitalchip.ru/uploads/proj_files/nokia1100_v2/symbol%20generate.zip и выводите его. Посмотрите как выводится символ в файле nokia1100_lcd_lib.c, изображение которого берется из nokia1100_lcd_font.h. Процедура void nlcd_Putc(unsigned char c), а в ней цикл:
      for ( unsigned char i = 0; i < 5; i++ ) nlcd_SendByte(DATA_LCD_MODE,pgm_read_byte(&(nlcd_Font[c-32][i])));

      • Виталий

        Не совсем понял, в програмирование только вникаю, начал с ардуины. Сгенерировал 5 чисел в HEX, куда их вставить, и в стоке Lcd.Putc(unsigned char c); что такое С ? Запутался в 3 березах. А сайту форум нужен наверное, для таких как я со своими вопросами.

        • Что то типа примера:
          //Гдето вне процедуры main()
          const unsigned char mySym[5] PROGMEM ={0x022, 0x33, 0x44, 0x55, 0x66}; // Твои сгенерированные HEX

          ...

          //Процедура вывода твоих сгенерированных символов
          nlcd_GotoXY(1,1);
          for ( unsigned char i = 0; i < 5; i++ ) nlcd_SendByte(DATA_LCD_MODE,pgm_read_byte(&(mySym[i])));

          Как-то так...

          • А сайту форум нужен наверное, для таких как я со своими вопросами.

            Я думал уже об этом, но пока на сайте не такая уж большая активность, что б делать форум. А смысла в «мертвом» форуме нет. Хотя я о форуме уже задумывался…

          • Виталий

            Сделал вот так
            #include <PCF8814.h> 
             
            PCF8814 Lcd(13,11,10,9); // LCD sets SPI SCLK: 7 pin, SDA: 8 pin, CS: 9 pin. RESET: 6 pin
            const unsigned char mySym[5] PROGMEM ={0xFF, 0xF9, 0xF9, 0xFF, 0x3C};
            char i;
            void setup() { 
              Lcd.Init();
            }
             
            void loop() {
              Lcd.Clear();
              Lcd.GotoXY(1,1);
              for ( unsigned char i = 0; i < 5; i++ );
              Lcd.SendByte(DATA_LCD_MODE,pgm_read_byte(&(mySym[i])));
              delay (2000);
            }
            выводит одну строку из символа, что не так ?
            Но по идее можно же это все заменить срочкой
            Lcd.Putc(unsigned char c);
            только как не пойму.

  9. Виталий

    Еще бы узнать как вывести содержимое переменной на дисплей , если там например трехзначное число ?

    • Ну… Тут уж каждый использует те методы, которые ему больше подходят. Кто-то использует библиотечные функции printf, sprintf, snprintf и fprintf, кто-то пишет свои функции. Все зависит от задачи и требований к ресурсам и скорости работы.

      Вот пример функции преобразования целочисленного числа в строку:

      char* itoa(int value, char* result, int base)
      {
          // check that the base if valid
          if (base < 2 || base > 36) { *result = '\0'; return result; }
         
          char* ptr = result, *ptr1 = result, tmp_char;
          int tmp_value;
         
          do{
              tmp_value = value;
              value /= base;
              *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
          } while ( value );
         
          // Apply negative sign
          if (tmp_value < 0) *ptr++ = '-';
          *ptr-- = '\0';
          while(ptr1 < ptr){
              tmp_char = *ptr;
              *ptr--= *ptr1;
              *ptr1++ = tmp_char;
          }
          return result;
      }
  10. Скачал библиотеку для среды ардуино, так и не понял какие куда пины втыкать для Arduino Mega 2560 R3 кто говорит что пины переназначены кто говорит что их нужно переназначить. Мучаюсь третий день.
    Дисплей от Nokia 1112, подскажите какие пины куда втыкать.

    • По умолчанию, библиотека работает на аппаратном SPI, соответственно и сигналы подключаются к линиям SPI. Можно в файле PCF8814.h включить софтовый режим, для этого необходимо раскомментировать строку: #define SOFT_SPI
      Инициализация осуществляется строчкой: PCF8814 Lcd(13,11,10,6); в которой и задаются пины для подключения. // LCD sets SPI SCLK: 13 pin, SDA: 11 pin, CS: 10 pin. RESET: 9 pin

  11. День или вечер добрый. Достался мне тут дисплейчик от нокии 1280(он же 1202). Как я понял этот дисплейчик работает на контроллере STE2007. Ваша библиотека корректно будет работать с этим дисплеем или надо будет переделывать? Прошу прощения если вопрос покажется вам банальным.

  12. Товарищи! Как впилить библиотеку без граф интерфейса в codevision?
    сломал всю голову уже!

  13. Раскомментировал #define FULL_CHARSET
    на lcd nokia 1202 отображается две английские буквы вместо одной русской буквы.
    в чем проблема?
    nlcd_GotoXY(0,0);
    nlcd_Print(«А»);
    дисплей выводит PP

  14. DJ_URAN — с библиотекой есть примерчик как фтыкать эту библу а также описаны основные моменты чтоб заработало всё….
    Vov- может проблема с русской кодировкой в среде в которой вы пишите программу?

  15. здравствуйте опять же с разрешения ув тов чипера, могу выложить адаптированную графическую библиотеку под кодвижен,конечно же если всё это актуально.(сам на 100 не уверен но кодвижен всё компилирует без сообщений об ошибках.тестово проверил работу в проте — при прогоне программы текст выводился «зеркально» в функции инициализации экранчика есть закоменченые команды отзеркаливания по х и у, при раскоменте дисплейчик стал выводить техт как положено, добавлю это всё только в проте как на реальном экранчике пока нет возможности проверить.Если нада то приложу и примерчик для прота,так же о чем упоминал чипер,что библиотека требовательна к озу мк и компилиться будет не на все мк ,условно компилятор кодвижена сожрал и показал расход в 1374 байтов из них 780 это видеоозу для лцд.то есть на мегу8 проект компилируется с выводом ошибки о нехватки озу.

  16. подкиньте пожалуйста текстовое меню
    хочется устройство сделать с меню ,а времени и ума катострофически мало на меню.
    Буду очень признателен!.

    • видел на хабре статью с исходниками…название статьи «Реализация многоуровневого меню для Arduino с дисплеем»

  17. а где версия 1.1 (только текст) ?

  18. русский{
    -хорошо, это я скачал 2.2 библиотеку графических функций и copilar и записать Arduino не показывает мне ничего, ни один из примеров не является книжный магазин за другой книжный магазин, чтобы Arduino записанные в моменты моменты Это показывает мне, какой пример должен был писать на экране, и помещается на работу с другой библиотекой; правда заключается в том, что я хочу использовать эту библиотеку функций очень хорошо сделаны, и хотелось бы, чтобы помочь мне в этой проблеме.

    -Спасибо.
    }

    English{
    -Good, it turns out that I downloaded the library 2.2 of the graphic functions and copying and recording in the arduino does not show me anything, none of the examples that the library has, after I record another library to the Arduino, for moments of instants me Shows what the examples had to write on the screen, and set to work with the other library; The truth is that I want to use this library its functions are very well done and I would love to help me in this inconvenience.

    -Thank you.
    }

    Español Latino{
    -buenas, resulta que he descargado la librería 2.2 la de las funciones gráficas y al copilar y grabar en el arduino no me muestra nada, ninguno de los ejemplos que tiene la librería, luego de que grabo otra librería al arduino, por momentos de instantes me muestra lo que los ejemplo tenia que escribir en la pantalla, y se coloca en marcha a trabajar con la otra librería; la verdad es que quiero usar esta librería sus funciones están muy bien hechas y me encantaría que me ayudaran en este inconveniente.

    -gracias.
    }

  19. Cyberdemon

    разобрался уже

Добавить комментарий

Поля, помеченные знаком звездочка (*) обязательны для заполнения.