Как увеличить размер шрифта в библиотеке для Nokia 1100

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Здравствуйте.  Подскажите как изменить библиотеку чтобы увеличить размер шрифта с 6х8 до 10х16.

прикладываю код простого счетчика для теста библиотеки

#include <Arduino.h>
#include "driver_nokia_1100.h"
//LCD_PIN_CS 10
//LCD_PIN_Data 11
//LCD_PIN_CLK 12

void setup(){
  lcd_init();
  lcd_clear();
  lcd_gotoyx(0,0);
}
void loop(){
  int chas=0;//значение часов
  char* sl;
  for (int i = 0; i < 100; i++) {
  int temp_c=i;
  int c2=temp_c%10;// здесь мы получаем последнюю цифру
  temp_c/=10;// n=n/10 тем самым отбрасываем последнюю цифру
  int c1=temp_c%10;
  lcd_gotoyx(0,0);
  itoa (c1, sl, 10);
  lcd_string(sl);
  itoa (c2, sl, 10);
  lcd_string(sl);
  delay(500);
  //lcd_clear();
  }
}

http://yadi.sk/d/5h9ITn4A6LfCW

maksim
Offline
Зарегистрирован: 12.02.2012

Не просто. Попробую обьяснить. На данный дисплей информация выводится последованельно. Но не просто по точке слева-напрва и так несколько строк, а определенным образом - один байт соответствует вертикальному столбцу из 8 точек, то есть высота строки 8 точек и так несколько строк. По вашей ссылке - символ 6х8 это 6 байт:

static const byte ASCII[][CHAR_WIDTH] ={
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // 20
  ,{0x00, 0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
  ,{0x00, 0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
  ,{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
  ,{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
  ,{0x00, 0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
  ,{0x00, 0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
  ,{0x00, 0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
  ,{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
  ,{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
  ,{0x00, 0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
  ,{0x00, 0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
  ,{0x00, 0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
  ,{0x00, 0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
  ,{0x00, 0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
  ,{0x00, 0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
  ,{0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
  ,{0x00, 0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
  ,{0x00, 0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
  ,{0x00, 0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
  ,{0x00, 0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
  ,{0x00, 0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
  ,{0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
  ,{0x00, 0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
  ,{0x00, 0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
  ,{0x00, 0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
  ,{0x00, 0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
  ,{0x00, 0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
  ,{0x00, 0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
  ,{0x00, 0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
  ,{0x00, 0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
  ,{0x00, 0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
  ,{0x00, 0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
  ,{0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
  ,{0x00, 0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
  ,{0x00, 0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
  ,{0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
  ,{0x00, 0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
  ,{0x00, 0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
  ,{0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
  ,{0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
  ,{0x00, 0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
  ,{0x00, 0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
  ,{0x00, 0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
  ,{0x00, 0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
  ,{0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
  ,{0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
  ,{0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
  ,{0x00, 0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
  ,{0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
  ,{0x00, 0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
  ,{0x00, 0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
  ,{0x00, 0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
  ,{0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
  ,{0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
  ,{0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
  ,{0x00, 0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
  ,{0x00, 0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
  ,{0x00, 0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
  ,{0x00, 0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
  ,{0x00, 0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
  ,{0x00, 0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
  ,{0x00, 0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
  ,{0x00, 0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
  ,{0x00, 0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
  ,{0x00, 0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
  ,{0x00, 0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
  ,{0x00, 0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
  ,{0x00, 0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
  ,{0x00, 0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
  ,{0x00, 0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
  ,{0x00, 0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
  ,{0x00, 0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
  ,{0x00, 0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
  ,{0x00, 0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
  ,{0x00, 0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
  ,{0x00, 0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
  ,{0x00, 0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
  ,{0x00, 0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
  ,{0x00, 0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
  ,{0x00, 0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
  ,{0x00, 0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
  ,{0x00, 0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
  ,{0x00, 0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
  ,{0x00, 0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
  ,{0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
  ,{0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
  ,{0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
  ,{0x00, 0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
  ,{0x00, 0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
  ,{0x00, 0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
  ,{0x00, 0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
  ,{0x00, 0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
  ,{0x00, 0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
  ,{0x00, 0x10, 0x08, 0x08, 0x10, 0x08} // 7e ->
  ,{0x00, 0x78, 0x46, 0x41, 0x46, 0x78} // 7f <- 
};

Выводим эти 6 байт и получаем символ. Тут все просто. А вот для того что бы вывести символ 10х16 нужно сначала сформировать такую же таблицу только один символ будет состоять из 20 байт, а выводить прийдется сначала 10 байт верхней части символа , а затем на следующей строке под верхней частью символа 10 байт нижней части символа. В общем как-то так.

Можно попробовать библиотку GLCD.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Ну нарисовать символы не проблема. Только время

а вот с выводом действительно проблема

но все равно спасибо. буду знать куда копать

hugoboss317
Offline
Зарегистрирован: 21.03.2013

maksim пишет:
А вот для того что бы вывести символ 10х16 нужно сначала сформировать такую же таблицу только один символ будет состоять из 20 байт, а выводить прийдется сначала 10 байт верхней части символа , а затем на следующей строке под верхней частью символа 10 байт нижней части символа

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

Хотябы в общих чертах какая функция отвечает за переводпечати вправо или вниз.

maksim
Offline
Зарегистрирован: 12.02.2012

Эта lcd_gotoyx(y,x); не работает?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

работала раньше. только не абсолютные координаты дисплея, а разбитый на участки 8 строк на 16 колонок кажется или около того

hugoboss317
Offline
Зарегистрирован: 21.03.2013

нет. В библиотеке, с которой я сейчас работаю, такой функции нет. Если нужно переместится печатаю пустой символ через for.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я подумал вы про библиотеку одного индуса о которой как то уже писали

hugoboss317
Offline
Зарегистрирован: 21.03.2013

jeka_tm пишет:
я подумал вы про библиотеку одного индуса о которой как то уже писали

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

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

Функцию goto(x, y); добавить не могу как и в другой библиотеке.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Блин, четыре библиотеки и не одну до ума не могу довести. Наверное от большого ума. Прошу прашения за тафтологию:))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

какого ума? большой шрифт?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ну неужели никаких идей?? Хотябы плюньте ссылкой о формировании бибы для графических ЖКИ.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ладно, давайте может так!? Шрифт 10х16. Печатаю верхнюю часть в нулевом банке, нижнюю часть в первом банке. Ну как бы рядом с истиной только нижнюю половину по ИКСу продолжает печатать с того места где закончилась верхняя часть. Ответ буквально крутится в голове но никак не вылеЗЕт, подскажите...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Наверное у автора этой темы Как разобрать на части показания датчика DS18B20 уже есть ответ на последние вопросы ))

maksim
Offline
Зарегистрирован: 12.02.2012

Нет у него ответа.

Вопрос тут в том что нужно посмотреть либу, в которой используются команды для перемещения "курсора" и добавить в свой код. Или второй вариант, выделить память (массив байт) соответствующий размеру памяти дисплея, в нем (в массиве) полностью формировать изображение, то есть залонить массив "по нужным координатам" и весь массив выводить в дисплей.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Дело ещё в том что стал вопрос, точнее проблема с использованием Амт16 и Атм8 и если делать так как рекомендует maksim 

->>выделить память (массив байт) соответствующий размеру памяти дисплея, в нем (в массиве) полностью формировать изображение<<-

операвтивка забивается под жвак и делов нет совсем.

Я решил этот вопрос следующим образом:

Набросал шрифты 10х16 и 10х21. ( только цифры) И т.к. из видеопамяти прочесь нельзя, печатаю туда по символу прямо из програмной памяти (не загружая "ничего" в оперативку) верхний набор, затем спускаю координаты (по Y) на один банк вниз и по X на 10 назад (если шрифт 10х21) повторяю ещё раз. Затем, после вывода символа возвращаю координаты в нужный банк (который задавался функцией GotoXY (которой небыло и пришлось писать самому)) и по Х добавляю к размеру шрифта один пиксель(расстояние) 10х21 вывожу растянутым вдвое т.е. после вывода символа, точнее отправки данных в видеопамять значение Х увеличиваю на 21 пиксель.

Сейчас на дисплее с килобайтной опиративкой (Атмега168)одновревенно работает шрифт 5х8(полный) 10х16(цифры) тот же 10х16 растянутый вдвое и 10х21 растянутый вдвое. Причём замешал их таким образом что, к примеру, вывожу целые значения температуры 10х21(*2) затем точку из 10х16 затем десятые доли, затем опять символ из 10х16.

с аналогово датчика целые 10х16(*2) точка 10х16, десятые 10х16(*2)  символ 10х16.

Не знаю на сколько заполнена оперативка но глюков, пикселей и подобного нет. Чёкая корректная работа. Размер скетча 8 с копейками но там много лишнего, под Атм 8 подогнать можно.

В общем фишка в том что шрифт помещён п програмную память и выводится прям оттуда а значения координат по Х и по У протягиваю через весь цикл по всем функциям.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

выкладывайте. тоже хочу попробовать

hugoboss317
Offline
Зарегистрирован: 21.03.2013

jeka_tm, биба ещё зелёная совсем и "грязная". Давайте я подправлю, добавлю всё таки графику и выложу в нормальном виде? 

 

Хотя одна голова хорошо, а две - уже змей горыныч :)) Сейчас коментов навешаю и сверну сюда. Есть ряд проблем.У Вас голова получше работает может поможите решить.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

смотри сам. ты уже в теме как именно делать

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Вобщем смотри. Вот сама биба:



// Библиотека для LCD-экрана NOKIA 1100
 
#ifndef NOKIA_1100_LIB_H
#define NOKIA_1100_LIB_H

//******************************************************************************
// Настройка библиотеки
#define PIN_SCE 15   // 2 XCS   ->PC1
#define PIN_SDIN 16  // 4 SDA   ->PC2
#define PIN_RESET 14 // 1 XRES  ->PC0
#define PIN_SCLK 17  // 5 SCLK  ->PC3

#define LCD_C LOW // Команда
#define LCD_D HIGH // Данные
//******************************************************************************
// Прототипы функций
void LcdInit(void); ;                   //Полная инициализация
void LcdCharF(char ch);                 //вывод символа 5х8   из програмной памяти
void LcdCharF2(char ch);                //вывод символа 5х8   двойной ширены из програмной памяти
void LcdCharln(char ch);                //вывод символа 10х16 из програмной памяти
void LcdCharln2(char ch);               //вывод символа 10х16 двойной ширины из програмной памяти
void LcdCharln2X2(char ch);             //вывод символа 10х21 двойной ширины из програмной памяти
void LcdClear(void);                    //отчистка
void LcdPrintF(char *characters);       //вывод строки символов 5х8 из програмной памяти
void LcdPrintF2(char *characters);      //вывод строки символов 5х8 двойной ширены из програмной памяти
void LcdPrintln(char *characters);      //вывод строки символов 10х16 из програмной памяти
void LcdPrintln2X(char *characters);    //вывод строки символов 10х16 двойной ширины из програмной памяти
void LcdPrintln2X2(char *characters);   //вывод строки символов 10х21 двойной ширины из програмной памяти
void LcdWrite(byte dc, byte data);      //передача байта
void LcdGotoXY ( byte x, byte y );      //и так понятно
void Lcd_Inverse(unsigned char mode);   //говорит сам за себя

//******************************************************************************************
//***********************************шрифт 10x21 запмсываем в пограммную память
const unsigned char font10x21[][30]  PROGMEM={ 
{0x00, 0x00, 0x00, 0x00, 0x00} // 20
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x00, 0x00, 0x00, 0x00, 0x00} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x60, 0xD0, 0xB0, 0x60, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0xFE, 0xFD, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFD, 0xFE,
  0xFB, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFB,
  0x0F, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x0F} // 30 0
,{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFB,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F} // 31 1
,{0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFD, 0xFE,
  0xF8, 0xF4, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x05, 0x03,
  0x0F, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x00} // 32 2
,{0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFD, 0xFE,
  0x00, 0x04, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF5, 0xFB,
  0x00, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x0F}// 33 3
,{0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFE,
  0x03, 0x05, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF5, 0xFB,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F} // 34 4
,{0xFE, 0xFD, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00,
  0x03, 0x05, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF4, 0xF8,
  0x00, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x0F} // 35 5
,{0xFE, 0xFD, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00,
  0xFB, 0xF5, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF4, 0xF8,
  0x0F, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x0F} // 36 6
,{0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFD, 0xFE,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFB,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F} // 37 7
,{0xFE, 0xFD, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFD, 0xFE,
  0xFB, 0xF5, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF5, 0xFB,
  0x0F, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x0F} // 38 8
,{0xFE, 0xFD, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFD, 0xFE,
  0x03, 0x05, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0xF5, 0xFB,
  0x00, 0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x0F} // 39 9
};
//***************************************************************************
//*************************//шрифт 10х16 в програмной памяти
const unsigned char font[][20] PROGMEM={  
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20 (space)
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x06, 0x09, 0x06, 0xF0, 0xF8, 0x0C, 0x0C, 0x0C, 0x0C, 0x18,
  0x00, 0x00, 0x00, 0x07, 0x0F, 0x18, 0x18, 0x18, 0x18, 0x0C} // 27 ' значёк для термометра 'C
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x00, 0x00, 0x00, 0x00, 0x00} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x0C, 0x1A, 0x16, 0x0C, 0x00, 0x00, 0x00} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0x7E, 0x3D, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3D, 0x7E,
  0x7F, 0xBE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBE, 0x7F} // 30 0
,{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE} // 31 1
,{0x00, 0x81, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xBD, 0x7E,
  0x7F, 0xBE, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x80, 0x00} // 32 2
,{0x00, 0x81, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xBD, 0x7E,
  0x00, 0x80, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xBE, 0x7F} // 33 3
,{0x7E, 0xBC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBC, 0x7E,
  0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x3E, 0x7F} // 34 4
,{0x7E, 0xBD, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x81, 0x00,
  0x00, 0x80, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xBE, 0x7F} // 35 5
,{0x7E, 0xBD, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x81, 0x00,
  0x7F, 0xBE, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xBE, 0x7F} // 36 6
,{0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3D, 0x7E,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F} // 37 7
,{0x7E, 0xBD, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xBD, 0x7E,
  0x7F, 0xBE, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xBE, 0x7F} // 38 8
,{0x7E, 0xBD, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xBD, 0x7E,
  0x00, 0x80, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xBE, 0x7F} // 39 9
};
//***************************************************************************
//*************************//шрифт 5х8 в програмной памяти
const unsigned char FontFull[][5] PROGMEM ={
	{0x00, 0x00, 0x00, 0x00, 0x00},// (space)
	{0x00, 0x00, 0x5F, 0x00, 0x00},// !
	{0x00, 0x07, 0x00, 0x07, 0x00},// "
	{0x14, 0x7F, 0x14, 0x7F, 0x14},// #
	{0x24, 0x2A, 0x7F, 0x2A, 0x12},// $
	{0x23, 0x13, 0x08, 0x64, 0x62},// %
	{0x36, 0x49, 0x55, 0x22, 0x50},// &
	{0x00, 0x05, 0x03, 0x00, 0x00},// '
	{0x00, 0x1C, 0x22, 0x41, 0x00},// (
	{0x00, 0x41, 0x22, 0x1C, 0x00},// )
	{0x08, 0x2A, 0x1C, 0x2A, 0x08},// *
	{0x08, 0x08, 0x3E, 0x08, 0x08},// +
	{0x00, 0x50, 0x30, 0x00, 0x00},// ,
	{0x08, 0x08, 0x08, 0x08, 0x08},// -
	{0x00, 0x30, 0x30, 0x00, 0x00},// .
	{0x20, 0x10, 0x08, 0x04, 0x02},// /
	{0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
	{0x00, 0x42, 0x7F, 0x40, 0x00},// 1
	{0x42, 0x61, 0x51, 0x49, 0x46},// 2
	{0x21, 0x41, 0x45, 0x4B, 0x31},// 3
	{0x18, 0x14, 0x12, 0x7F, 0x10},// 4
	{0x27, 0x45, 0x45, 0x45, 0x39},// 5
	{0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
	{0x01, 0x71, 0x09, 0x05, 0x03},// 7
	{0x36, 0x49, 0x49, 0x49, 0x36},// 8
	{0x06, 0x49, 0x49, 0x29, 0x1E},// 9
	{0x00, 0x36, 0x36, 0x00, 0x00},// :
	{0x00, 0x56, 0x36, 0x00, 0x00},// ;
	{0x00, 0x08, 0x14, 0x22, 0x41},// <
	{0x14, 0x14, 0x14, 0x14, 0x14},// =
	{0x41, 0x22, 0x14, 0x08, 0x00},// >
	{0x02, 0x01, 0x51, 0x09, 0x06},// ?
	{0x32, 0x49, 0x79, 0x41, 0x3E},// @
	{0x7E, 0x11, 0x11, 0x11, 0x7E},// A
	{0x7F, 0x49, 0x49, 0x49, 0x36},// B
	{0x3E, 0x41, 0x41, 0x41, 0x22},// C
	{0x7F, 0x41, 0x41, 0x22, 0x1C},// D
	{0x7F, 0x49, 0x49, 0x49, 0x41},// E
	{0x7F, 0x09, 0x09, 0x01, 0x01},// F
	{0x3E, 0x41, 0x41, 0x51, 0x32},// G
	{0x7F, 0x08, 0x08, 0x08, 0x7F},// H
	{0x00, 0x41, 0x7F, 0x41, 0x00},// I
	{0x20, 0x40, 0x41, 0x3F, 0x01},// J
	{0x7F, 0x08, 0x14, 0x22, 0x41},// K
	{0x7F, 0x40, 0x40, 0x40, 0x40},// L
	{0x7F, 0x02, 0x04, 0x02, 0x7F},// M
	{0x7F, 0x04, 0x08, 0x10, 0x7F},// N
	{0x3E, 0x41, 0x41, 0x41, 0x3E},// O
	{0x7F, 0x09, 0x09, 0x09, 0x06},// P
	{0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
	{0x7F, 0x09, 0x19, 0x29, 0x46},// R
	{0x46, 0x49, 0x49, 0x49, 0x31},// S
	{0x01, 0x01, 0x7F, 0x01, 0x01},// T
	{0x3F, 0x40, 0x40, 0x40, 0x3F},// U
	{0x1F, 0x20, 0x40, 0x20, 0x1F},// V
	{0x7F, 0x20, 0x18, 0x20, 0x7F},// W
	{0x63, 0x14, 0x08, 0x14, 0x63},// X
	{0x03, 0x04, 0x78, 0x04, 0x03},// Y
	{0x61, 0x51, 0x49, 0x45, 0x43},// Z
	{0x00, 0x00, 0x7F, 0x41, 0x41},// [
	{0x02, 0x04, 0x08, 0x10, 0x20},// "\"
	{0x41, 0x41, 0x7F, 0x00, 0x00},// ]
	{0x04, 0x02, 0x01, 0x02, 0x04},// ^
	{0x40, 0x40, 0x40, 0x40, 0x40},// _
	{0x00, 0x01, 0x02, 0x04, 0x00},// `
	{0x20, 0x54, 0x54, 0x54, 0x78},// a
	{0x7F, 0x48, 0x44, 0x44, 0x38},// b
	{0x38, 0x44, 0x44, 0x44, 0x20},// c
	{0x38, 0x44, 0x44, 0x48, 0x7F},// d
	{0x38, 0x54, 0x54, 0x54, 0x18},// e
	{0x08, 0x7E, 0x09, 0x01, 0x02},// f
	{0x08, 0x14, 0x54, 0x54, 0x3C},// g
	{0x7F, 0x08, 0x04, 0x04, 0x78},// h
	{0x00, 0x44, 0x7D, 0x40, 0x00},// i
	{0x20, 0x40, 0x44, 0x3D, 0x00},// j
	{0x00, 0x7F, 0x10, 0x28, 0x44},// k
	{0x00, 0x41, 0x7F, 0x40, 0x00},// l
	{0x7C, 0x04, 0x18, 0x04, 0x78},// m
	{0x7C, 0x08, 0x04, 0x04, 0x78},// n
	{0x38, 0x44, 0x44, 0x44, 0x38},// o
	{0x7C, 0x14, 0x14, 0x14, 0x08},// p
	{0x08, 0x14, 0x14, 0x18, 0x7C},// q
	{0x7C, 0x08, 0x04, 0x04, 0x08},// r
	{0x48, 0x54, 0x54, 0x54, 0x20},// s
	{0x04, 0x3F, 0x44, 0x40, 0x20},// t
	{0x3C, 0x40, 0x40, 0x20, 0x7C},// u
	{0x1C, 0x20, 0x40, 0x20, 0x1C},// v
	{0x3C, 0x40, 0x30, 0x40, 0x3C},// w
	{0x44, 0x28, 0x10, 0x28, 0x44},// x
	{0x0C, 0x50, 0x50, 0x50, 0x3C},// y
	{0x44, 0x64, 0x54, 0x4C, 0x44},// z
	{0x00, 0x08, 0x36, 0x41, 0x00},// {
	{0x00, 0x00, 0x7F, 0x00, 0x00},// |
	{0x00, 0x41, 0x36, 0x08, 0x00},// }
	{0x02, 0x01, 0x02, 0x04, 0x02},// ~
	{0x08, 0x1C, 0x2A, 0x08, 0x08} // <-
#ifdef FULL_CHARSET
, 	// Шрифт кириллицы. Для вывода используется кодировка CP1251
	{ 0x7E, 0x11, 0x11, 0x11, 0x7E },  // А
	{ 0x7F, 0x49, 0x49, 0x49, 0x33 },  // Б
	{ 0x7F, 0x49, 0x49, 0x49, 0x36 },  // В
	{ 0x7F, 0x01, 0x01, 0x01, 0x03 },  // Г
	{ 0xE0, 0x51, 0x4F, 0x41, 0xFF },  // Д
	{ 0x7F, 0x49, 0x49, 0x49, 0x49 },  // Е
	{ 0x77, 0x08, 0x7F, 0x08, 0x77 },  // Ж
	{ 0x49, 0x49, 0x49, 0x49, 0x36 },  // З
	{ 0x7F, 0x10, 0x08, 0x04, 0x7F },  // И
	{ 0x7C, 0x21, 0x12, 0x09, 0x7C },  // Й
	{ 0x7F, 0x08, 0x14, 0x22, 0x41 },  // К
	{ 0x20, 0x41, 0x3F, 0x01, 0x7F },  // Л
	{ 0x7F, 0x02, 0x0C, 0x02, 0x7F },  // М
	{ 0x7F, 0x08, 0x08, 0x08, 0x7F },  // Н
	{ 0x3E, 0x41, 0x41, 0x41, 0x3E },  // О
	{ 0x7F, 0x01, 0x01, 0x01, 0x7F },  // П
	{ 0x7F, 0x09, 0x09, 0x09, 0x06 },  // Р
	{ 0x3E, 0x41, 0x41, 0x41, 0x22 },  // С
	{ 0x01, 0x01, 0x7F, 0x01, 0x01 },  // Т
	{ 0x27, 0x48, 0x48, 0x48, 0x3F },  // У
	{ 0x1C, 0x22, 0x7F, 0x22, 0x1C },  // Ф
	{ 0x63, 0x14, 0x08, 0x14, 0x63 },  // Х
	{ 0x7F, 0x40, 0x40, 0x40, 0xFF },  // Ц
	{ 0x07, 0x08, 0x08, 0x08, 0x7F },  // Ч
	{ 0x7F, 0x40, 0x7F, 0x40, 0x7F },  // Ш
	{ 0x7F, 0x40, 0x7F, 0x40, 0xFF },  // Щ
	{ 0x01, 0x7F, 0x48, 0x48, 0x30 },  // Ъ
	{ 0x7F, 0x48, 0x30, 0x00, 0x7F },  // Ы
	{ 0x7F, 0x48, 0x48, 0x30, 0x00 },  // Ь
	{ 0x22, 0x41, 0x49, 0x49, 0x3E },  // Э
	{ 0x7F, 0x08, 0x3E, 0x41, 0x3E },  // Ю
	{ 0x46, 0x29, 0x19, 0x09, 0x7F },  // Я
	{ 0x20, 0x54, 0x54, 0x54, 0x78 },  // а
	{ 0x3C, 0x4A, 0x4A, 0x49, 0x31 },  // б
	{ 0x7C, 0x54, 0x54, 0x28, 0x00 },  // в
	{ 0x7C, 0x04, 0x04, 0x04, 0x0C },  // г
	{ 0xE0, 0x54, 0x4C, 0x44, 0xFC },  // д
	{ 0x38, 0x54, 0x54, 0x54, 0x08 },  // е
	{ 0x6C, 0x10, 0x7C, 0x10, 0x6C },  // ж
	{ 0x44, 0x44, 0x54, 0x54, 0x28 },  // з
	{ 0x7C, 0x20, 0x10, 0x08, 0x7C },  // и
	{ 0x78, 0x42, 0x24, 0x12, 0x78 },  // й
	{ 0x7C, 0x10, 0x28, 0x44, 0x00 },  // к
	{ 0x20, 0x44, 0x3C, 0x04, 0x7C },  // л
	{ 0x7C, 0x08, 0x10, 0x08, 0x7C },  // м
	{ 0x7C, 0x10, 0x10, 0x10, 0x7C },  // н
	{ 0x38, 0x44, 0x44, 0x44, 0x38 },  // о
	{ 0x7C, 0x04, 0x04, 0x04, 0x7C },  // п
	{ 0x7C, 0x14, 0x14, 0x14, 0x08 },  // р
	{ 0x38, 0x44, 0x44, 0x44, 0x44 },  // с
	{ 0x04, 0x04, 0x7C, 0x04, 0x04 },  // т
	{ 0x0C, 0x50, 0x50, 0x50, 0x3C },  // у
	{ 0x18, 0x24, 0x7E, 0x24, 0x18 },  // ф
	{ 0x44, 0x28, 0x10, 0x28, 0x44 },  // х
	{ 0x7C, 0x40, 0x40, 0x40, 0xFC },  // ц
	{ 0x0C, 0x10, 0x10, 0x10, 0x7C },  // ч
	{ 0x7C, 0x40, 0x7C, 0x40, 0x7C },  // ш
	{ 0x7C, 0x40, 0x7C, 0x40, 0xFC },  // щ
	{ 0x04, 0x7C, 0x50, 0x50, 0x20 },  // ъ
	{ 0x7C, 0x50, 0x20, 0x00, 0x7C },  // ы
	{ 0x7C, 0x50, 0x50, 0x20, 0x00 },  // ь
	{ 0x28, 0x44, 0x54, 0x54, 0x38 },  // э
	{ 0x7C, 0x10, 0x38, 0x44, 0x38 },  // ю
	{ 0x08, 0x54, 0x34, 0x14, 0x7C }   // я

#endif  /* FULL_CHARSET */
};

#define X_RES	96		// разрешение по горизонтали
#define Y_RES	65		// разрешение по вертикали
//static unsigned char lcd_memory[X_RES-1][(Y_RES/8)+1]; //Кажется это не надо :))
static unsigned char x_curr, y_curr; 
int high = 0; //переменная нужна при изменении размера фрифта

//******************************************************************************
//вывод символа 10х21 двойной ширины из программной памяти
void LcdCharln2X2(char ch)  
{
   LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
   LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
   LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07)));
  for (int index = 0; index < 10; index++)
  {
   LcdWrite(LCD_D, pgm_read_byte(&(font10x21[ch - 32][index])));  
   LcdWrite(LCD_D, pgm_read_byte(&(font10x21[ch - 32][index])));  
  }
    y_curr+=1;
  LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
  LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
  LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07))); 
    for (int index = 10; index < 20; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font10x21[ch - 32][index])));
    LcdWrite(LCD_D, pgm_read_byte(&(font10x21[ch - 32][index])));
  }
    y_curr+=1;
  LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
  LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
  LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07))); 
    for (int index = 20; index < 30; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font10x21[ch - 32][index])));
    LcdWrite(LCD_D, pgm_read_byte(&(font10x21[ch - 32][index])));
  }
}
//******************************************************************************
// Вывод широкого символа 10x16 в текущее место из программной памяти
void LcdCharln2(char ch) 
{
   LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
   LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
   LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07)));
  for (int index = 0; index < 10; index++)
  {
   LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));  
   LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));  
  }
    y_curr+=1;
  LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
  LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
  LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07))); 
    for (int index = 10; index < 20; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));;
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));
  }
}
//******************************************************************************
// Вывод символа 5x8 в текущее место 
void LcdCharF(char ch){ 
	if (ch>127) ch=ch-64; 	// Переносим символы кирилицы в кодировке CP1251 в начало второй
						    // половины таблицы ASCII (начиная с кода 0x80) 
   LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
   LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
   LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07)));
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(FontFull[ch - 32][index])));
  }
}
//******************************************************************************
// Вывод символа 5x8 в текущее место 
void LcdCharF2(char ch){ 
	if (ch>127) ch=ch-64; 	// Переносим символы кирилицы в кодировке CP1251 в начало второй
						    // половины таблицы ASCII (начиная с кода 0x80) 
   LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
   LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
   LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07)));
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(FontFull[ch - 32][index])));
    LcdWrite(LCD_D, pgm_read_byte(&(FontFull[ch - 32][index])));
  }
}
//******************************************************************************
// Вывод символа 10x16 в текущее место  из программной памяти
void LcdCharln(char ch){ 
if(high == 1) y_curr++; 
   LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
   LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
   LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07)));
  for (int index = 0; index < 10; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));
  }
  y_curr+=1;
  LcdWrite(LCD_C,(0xB0|(y_curr&0x0F))); 
  LcdWrite(LCD_C,(0x00|(x_curr&0x0F))); 
  LcdWrite(LCD_C,(0x10|((x_curr>>4)&0x07)));
  for (int index = 10; index < 20; index++)
  {
    LcdWrite(LCD_D, pgm_read_byte(&(font[ch - 32][index])));
  }
}

//******************************************************************************
// Вывод строки символов 5x8 в текущее место из программной памяти 
void LcdPrintF(char *characters)
{
  while (*characters){
    LcdCharF(*characters++);
	x_curr+=6;
  }
}
//******************************************************************************
// Вывод строки символов 5x8 в текущее место из программной памяти 
void LcdPrintF2(char *characters)
{ 
  while (*characters){
    LcdCharF2(*characters++);
	x_curr+=11;
  }
}
//******************************************************************************
// Вывод строки символов 10x16 в текущее место из программной памяти.  
void LcdPrintln( char *characters)
{  
  while (*characters){
    LcdCharln(*characters++);
    y_curr-=1;
    x_curr+=11;
  }
  if(high == 1){y_curr--; 
  high = 0;}
}
//******************************************************************************
// Вывод строки широких символов 10x16 в текущее место из программной памяти. 
  void LcdPrintln2X(char *characters)
  {  
 while (*characters){
    LcdCharln2(*characters++);
    y_curr-=1;
    x_curr+=21;
  }
}
//******************************************************************************
// Вывод строки широких символов 10x21 (20x21) в текущее место из программной памяти. 
  void LcdPrintln2X2(char *characters){  
  unsigned char data;
  while (*characters){
    LcdCharln2X2(*characters++);
    y_curr-=2;
    x_curr+=21;
  }
  high = 1;
}
//******************************************************************************
// Передача байта (команды или данных) на LCD-контроллер
//  mode: LCD_C - передаем команду
//		  LCD_D - передаем данные
void LcdWrite(byte dc, byte data){
  
  digitalWrite(PIN_SDIN, dc); // dc is sampled with the first rising SCLK edge
  digitalWrite(PIN_SCE, LOW); // LCD enable
  digitalWrite(PIN_SCLK, HIGH); // First rising SCLK edge
  digitalWrite(PIN_SCLK, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); // SDIN is sampled at the rising edge of SCLK.
  digitalWrite(PIN_SCE, HIGH); 
}
//******************************************************************************
// Очистка экрана
void LcdClear(void){
  	LcdWrite(LCD_C,0x40); // Y = 0
	LcdWrite(LCD_C,0xB0);
	LcdWrite(LCD_C,0x10); // X = 0
	LcdWrite(LCD_C,0x00);
x_curr=0; y_curr=0;	
  for (int index = 0; index < 864 ; index++)
    LcdWrite(LCD_D, 0x00);
}
//********************************************************************************
//Инициализация экрана
void LcdInit(void){
  pinMode(PIN_SCE, OUTPUT);
  pinMode(PIN_RESET, OUTPUT);
  pinMode(PIN_SDIN, OUTPUT);
  pinMode(PIN_SCLK, OUTPUT);
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_SCE, HIGH);
  digitalWrite(PIN_SCLK, LOW);
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_RESET, HIGH);
  LcdWrite(LCD_C, 0x23); // 
  LcdWrite(LCD_C, 0x2F); // Charge pump ON //2F
  LcdWrite(LCD_C, 0x24); // Vop MSB *Don't change* *не трогать))* //24
  LcdWrite(LCD_C, 0x40); // Vop LSB *тута меняем контрастность*   //B0
  LcdWrite(LCD_C, 0xA4); // A4 = normal display mode, A5 = all pixels ON
  LcdWrite(LCD_C, 0xAF); // Display ON //AF
  LcdWrite(LCD_C, 0x3A); // *** Use internal oscillator
  LcdWrite(LCD_C, 0xEF); // *** FRAME FREQUENCY:
  LcdWrite(LCD_C, 0x04); // *** 80Hz
  LcdWrite(LCD_C, 0xD0); //Драйвер 1:65

 LcdWrite(LCD_C, 0x40);  // set start row address = 0
 LcdWrite(LCD_C, 0xB0);  // установить Y-адрес = 0
 LcdWrite(LCD_C, 0x10);  // установить X-адрес, старшие 3 бита
 LcdWrite(LCD_C, 0x0);   // установить X-адрес, младшие 4 бита
 
 LcdWrite(LCD_C, 0xAC);  // set initial row (R0) of the display
 LcdWrite(LCD_C, 0x07);
 LcdWrite(LCD_C, 0xAA);  //Горизонтальная адресация 
 LcdWrite(LCD_C, 0xA9);  //MSB on TOP ->>A8 LSB on TOP
 delay(75);
 LcdClear();
  
}
//******************************************************************************
//Установка в координаты в координаты х:0..95 у:0..64
void LcdGotoXY ( byte x, byte y )
{
	x_curr=x;
	y_curr=y/8;                                //переход от координат в пикселях к строкам
    LcdWrite(LCD_C,(0xB0|(y_curr&0x0F)));      // установка адреса по Y: 0100 yyyy         
    LcdWrite(LCD_C,(0x00|(x&0x0F)));           // установка адреса по X: 0000 xxxx - биты (x3 x2 x1 x0)
    LcdWrite(LCD_C,(0x10|((x>>4)&0x07)));      // установка адреса по X: 0010 0xxx - биты (x6 x5 x4)
}
////////////////////////////////////////////////////
//******************************************************************************
// Устанавливаем режим инверсии всего экрана. Данные на экране не изменяются, только инвертируются
//  mode: 1 -> нормальный, или 0 -> инверсный
void Lcd_Inverse(unsigned char mode)
{
	if (mode) LcdWrite(LCD_C,0xA6);
	 else LcdWrite(LCD_C,0xA7);
}
#endif

Работает почти всё:

со шрифтом 10х16 точка немного взлетевшая- это результат того что верхний шрифт 10х21 а не 10х24

основная проблемка в том что вывод происходит только по строкам (адрес банков) а не в пикселях, но координаты нужно задавать в пикселях т.е. пишем у = 12 или у = 14, напечатает в первой строке и т.д.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

в принцпе вы говорили что занимает много места. можно по задаче редактировать библиотеку символов что сильно уменьшит размер

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Так. Вроде с пикселем получилось. Задаю координаты и передаю байт в контроллер мимо видеобуфера. 

->>лучше выложи в формате библиотеки с папками.<<-

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

а пока достаточно скопировать библиотеку в буфер, открыть любой файл с расширением .h , вставить туда и сохранить как "nokia_1100_lib" и так же включаешь. Исходник будет выглядить так:



int i; //сюда надо что то вписать иначе биба даёт ошибки :((
#include "nokia_1100_lib.h"

void setup(){
  LcdInit();  //инициализация пинов дисплея 
}

void loop(void)
{
}

Хотя она уже не актуальна. Добавил пиксель. Только включаю. Добавлю выключение и инвертирование и уйду в тему библиотеки (как ты подметил). Уплотню графикой чтоб явно видеть что РАМу не перегружаю

 

axill
Offline
Зарегистрирован: 05.09.2011

тема с дисплейчиками от мобильников весьма интересна

а я вот освоил монохром от нокия 1202, но это не самое интересное, куда интересней тот, что сейчас осваиваю - цветной дисплей от нокия 1616. 161 на 129 точек, 12/16/18 битная цветность. В режиме 16 бит отсылается два байта на точку - очень удобно, нет ограничений по банкам памяти, в общем то благодаря этому может и буфер в памяти не понадобиться, да и если не ошибаюсь читать из него данные можно, еще не проверял

рекомендую, стоит в Москве 60р

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Хорошо вечером проверю что у меня получится

а насчет 1616 хотелось бы увидеть картинки и библиотеку когда сделаете. и сколько оперативки нужно для вывода на дисплей

hugoboss317
Offline
Зарегистрирован: 21.03.2013

axill, давайте фото, что там получается, и средний размер кода.

axill
Offline
Зарегистрирован: 05.09.2011

ниже фото дисплея от 1202. симпатичный монохромный дисплей. Библиотеку брал без изменений с digitalchip.ru. их там две версии с видеобуфером и без, без буфера умеет только текст. Покупал в магазине профи по 35р. К сожалению много бракованных попадается. Кстати дисплей совместим с 1100 и библиотека тоже.

ниже 1616, покупал там же по 60р, пока еще все не тестировал, но первый дисплей работает полностью. Пришлось повозиться. Имеющаяся информация о том, что дисплей совместим с 6100/6610 оказалось ошибочной. Есть буквально пара примеров на рускоязычных сайтах и один англоязычный проект. Используя их дисплей удалось запустить. При чтении даташита вяснилось, что и эти примеры кривые, вот и пишу свою библиотеку. Но дисплей очень понравился, все таки цвет для 8-ми битных МК это приятно, цена приятная, ниже чем для nokia3310/5100, да и после 1616 3310/5100 смотрится ушербно. Для многих моих устройств 1616 самое то. Что приятно - можно изображение чисто аппаратно повернуть в любую сторону

библиотека пока умеет только текст выводить и только шрифт однобайтовой высоты (ширина может быть любая). Буду делать возможность использовать любые шрифты. Сейчас просто Hello world cо шрифтом лат+русс занимает 1700 байт, бещ русского на 300 байт меньше, шрифт 5х7.

платку под дисплей сделал универсальную по схеме с digitalchip. Плата подходит как для 1202 так и для 1616. Несмотря на то, что один монохромный, а второй цветной - у них совершенно одинаковый шлейф, только напряжение подсветки разное, поэтому на плате у меня стоит микросхема max1044 умножения напряжения (1616 требует 7в подсветки). Дисплейски можно припаять или прицепить канцелярско прищепкой (только на губки наклеен толстый скотч чтобы мягче придавливало и не коротило). Платка сделана ЛУТом за полчаса без отверстий, вырезана обычными канцелярскими ножницами из тектсолита толщиной 0.5мм

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

axill
Offline
Зарегистрирован: 05.09.2011

может мне не повезло) причем так конкретно - из 10 штук два вообщен не работают, у двоих две полосы битых точек, у двух по одной полосе

а подсветка отлично светит если через 100 ом подключить к 3.3в. у 1616 требуется 7в, я ее питаю от умножителя (5в умножается + потери на диодах выходит 9.8в) через 250 ом

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я до этого вообще напрямую к 3.3 подлюкчал. теперь буду ставить резистор наверно все таки

у вас подсветка бело-голубая или розово-голубая?

axill
Offline
Зарегистрирован: 05.09.2011

вроде бело-голубая, по крайней мере явно выраженного розового нет

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

axill
Offline
Зарегистрирован: 05.09.2011

говорят эти дисплеи все китайская версия и брак не редкость, но все е надеюсь это именно в этот раз мне так не повезло)

хотя даже с учетом брака цена сопоставима с дисплеями 5100 из китая, так что не сильно расстраиваюсь

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я купил один 5100. так он сволочь и не запустился. да и пинов ему нужно больше для управления

axill
Offline
Зарегистрирован: 05.09.2011

я несколько 5100 покупал, все работают кроме одного раздавленого при пересылке

но 1202 и тем более 1616 обыгрывают 5100 и по симпаичности и по цене

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

axill пишет:

я несколько 5100 покупал, все работают кроме одного раздавленого при пересылке

но 1202 и тем более 1616 обыгрывают 5100 и по симпаичности и по цене

это точно. и паяется прямо на плату

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Давайте поточнее говорить, особенно о том, какая библиотека к чему подходит. Биба подходит не к дисплею, а к контроллеру (или контроллерам) который (-рые) управляют экранчиками. Если уж на самом экране не написано (на обратной стороне или торце) то великий и могучий гугл даст ответ. Платы то травить не лень, и гуглить не лень должно быть. Поэтому 1616 и 6100 не одно и то же.

Обычно дисплеи продаются с тремя ценами - китай, - качественная копия (китай) и оригинал. Продавец на первое не то, что гарантию не даёт а прямо говорит что может не работать. Те цены что вы называете ..... ну понятно что, и следовательно лотарея, повезёт - не повезёт.

По поводу 1616, действительно заслуживает внимания. 

axill
Offline
Зарегистрирован: 05.09.2011

попробовал u8glib библиотеку. Очень интересное решение. Можно было бы самому дописать к ней драйвер для нового дисплея (1100 или 1616). Нужно всего пару функций описать и автоматом получаешь работу с текстом и графикой и несколько десятков шрифтов разного размера (до 49 точек по высоте). Но! размер скетча не радует совсем. Попробовал на примере дисплея нокия 5100, скетч Helloq World. Даже в варианте длф AVR у меня вышло 1.2к с моей библиотекой и 6к с u8glib

может что-то не так компилирую. пробовал кто эту библиотеку?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я пробовал на контроллере ST7920.

 

 Несколько специфическая библиотека. Пока научился "рисовать" для неё шрифт, вынес весь мозг форумчанам. Были мысли "приспособить" её для вышеоговариваемых дисплейчиков, но дело в том, xто у нас с jeka_tm задача то какая!? Есть готорвые и отлично работающие библиотеки. Но для их работы нужно не менее 2-х "килограмм" оперативки при выведении текста и графики.  Я пытаюсь сотворить так, чтоб это было возможно на 1К. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

и вроде у вас получилось. правда сам никак не попробую то что у вас получилось

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Вот из переписки с разработчиком одного измерительного приборчика

Завтра вышлю тебе либу от FLEXA-2, но она под три дисплея (16х2,3310,1100).
Или тебе вырезать только под 1100 ?
За одно вышлю свои таблицы знаков - 5х5, 15х7(цифры) и стандартную 5х7, из них надергаеш что тебе нужно. Как графику выводить без буфера(рамки и т.д.) потом напишу.

так что жду его библиотеку и как он выводит графику без буфера

графики у него немного, но и оперативной в PIC16F628 всего 224 байта. так что он еще больше ограничен был в оперативке. как он отпишется выложу

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

 

axill
Offline
Зарегистрирован: 05.09.2011

на 1616 графику можно выводить без буфера (адресовать можно одну отдельную точку), правда может оказаться очень медленно. если буфер делать то памяти ни в какой ардуино не хватит - нужно два байта на кажду точку

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

axill пишет:

на 1616 графику можно выводить без буфера (адресовать можно одну отдельную точку), правда может оказаться очень медленно. если буфер делать то памяти ни в какой ардуино не хватит - нужно два байта на кажду точку

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

человек отписался. дал свою библиотеку по выводу на 1100. по выводу графики пока не отписался.

правда написано на микрос но думаю понять все равно можно

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

   CurPosLCD(6,27);
    StringLCD("\x3F\x3E\x40\x3B\x44\x43\x42"); // "JEKA TM"

если нужно будет ужиматься по памяти тоже можно так сделать

шрифты у него только цифры и + - 

http://yadi.sk/d/FbyCT5TnBVCcw

axill
Offline
Зарегистрирован: 05.09.2011

можно кучу места сэкономить если каждую букву определить как отдельный массив и переписать вывод текста как обращение к отдельным массивам точек отдельных букв. Таким образом линковщик выбросит из HEX кода все неиспользованные буквы

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

тоже вариант. надо будет попробовать как нибудь

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Зачем на всём этом заморачиваться? Перед компелированием под проэкт можно просто закоментировать ненужные символы. В этой библиотеке шрифт не помещается в программную память. Это шаг назад. Со шрифтом я вопрос решил. Как решу с графикой, нарисую ещё, разных размеров. Что там слышно по графике?

->>места сэкономить если каждую букву определить как отдельный массив и переписать вывод текста как обращение к отдельным массивам

сэкономим на шрифте, добавим код, и что получится, экономия 50 байт!?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не совсем по теме: попалась статья как можно в мегу 8 88 168 или 328 залить бутлоадер, и прошивать через USB

только разница с обычным бутлоадером ардуины в том что не нужен переходник USB-RS232, USB подключается напрямую к пинам меги. терминал конечно работать не будет (в системе кстати определится как USBASP программатор) но зато не нужно подключать пополнительных программаторов или конвертеров. уже купил несколько micro usb мама коннесторов на плату. как придут буду проверять

програмироть становится еще проще. воткнул в самодельную плату micro или mini usb кабель, предвариельно замкнув джампер, выставил в иде нужный микроконтроллер и программатор USBASP и нажал програмировать с помощью программатора.

по моему очень удобно

без ложки дегтя никак.

1. работает только на внешнем кварце 12, 15 или 16 МГц

2. бутлоадер съест 2К флеша микроконтроллера

http://www.obdev.at/products/vusb/usbasploader.html

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

hugoboss317 пишет:

Зачем на всём этом заморачиваться? Перед компелированием под проэкт можно просто закоментировать ненужные символы. В этой библиотеке шрифт не помещается в программную память. Это шаг назад. Со шрифтом я вопрос решил. Как решу с графикой, нарисую ещё, разных размеров. Что там слышно по графике?

->>места сэкономить если каждую букву определить как отдельный массив и переписать вывод текста как обращение к отдельным массивам

сэкономим на шрифте, добавим код, и что получится, экономия 50 байт!?

по графике пока ничего. закоментировать просто нельзя. сошлешься на следующий символ после закоментированного и попадешь дальше еще на один. тут немного сложнее

тут уже вопрос о уменьшении занимаемого флеша

добавим код да, но думаю выигрыш будет приличнее

я когда перерисовал свои символы (ну которые нарисованы графикой) и вместо скругленного прямугольника нарисовал все быстрыми линиями, при 3 цифрах (18 сегментов было) разница была почти 1К флеша. так что все равно попробовать как нибудь можно будет

axill
Offline
Зарегистрирован: 05.09.2011

hugoboss317 пишет:

Зачем на всём этом заморачиваться?

глобально согласен) зачем морочиться при современной стоимости МК проще взять МК с большей памятью и вообще не поднимать вопроса ни о размере скетча ни о размере оперативной памяти

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если глобально/грубо да. но вставлять в каждое устройство ардуину? когда можно воткнуть мегу8 например или тиньку. при этом плату развести под конкретную задачу, а не куча проводов

постоянное увеличение мощности микроконтроллеров процессоров памяти мощности видеокарт расслабило разработчиков, теперь мало заморачиваются надо оптимизацией, и получается железо с каждым годом мощнее, а прирост производительности программ не соответствует приросту производительности железа. лично я для себя поставил планку что большинство проектов не больше 8 меги. этого итак выше крыши, просто коды неоптимальные