/**
 * Модуль написан maktep@yandex.ru
 * Все пожелания и предложения шлите на почту.
 * Приветствуются оптимизации и упрощения кода.
 *
 * В ФЬЮЗ БИТАХ ПРОСТАВЬТЕ _НЕТ_ДЖТАГА_ !!!
 * ОН НЕ НУЖЕН. если не проставите - полная работоспособность
 * порта Ц не гарантирована.
 *
 * Для ЖКИ МЭЛТ МТ-12864 v5
 * Схема подключения ЖКИ к микросхеме:
 * Порт С - это Порт DB0-DB7 на ЖКИ (соответственно)
 * Порт Д - это служебные биты
 * Порт Д бит 0,1 - не используются
 * Порт Д бит 2 - Е1 (первый кристалл)
 * Порт Д бит 3 - Е2 (второй кристалл)
 * Порт Д бит 4 - RES (0 - сброс модуля,1-работа)
 * Порт Д бит 5 - А0 (0 - команда/1данные)
 * Порт Д бит 6 - RD/WR (1чтение/0запись)
 * Порт Д бит 7 - Е (такт)
 *
 * Более подробную информацию про ЖКИ вы можете найти на melt.aha.ru
 * http://melt.aha.ru/files/file135.zip
 *
 * Схема включения
 * http://www.roboforum.ru/viewtopic.htm?p=28554#28554
 *
 * Надеюсь народ будет мне благодарен за мой труд... :-)
 * Шлите пожелания мне на маил :) - это приятно.
 */

#ifndef LCD_CONTROL_PORT
  #define LCD_CONTROL_PORT PORTD
#endif
#ifndef LCD_DATA_PORT
  #define LCD_DATA_PORT    PORTC
#endif

#ifndef RES_BIT  // если уж взялись отходить от дефолта, то определяй полностью :)
  #define RES_BIT  4
  #define A0_BIT   5
  #define RDWR_BIT 6
  #define E_BIT    7
  #define E1_BIT   2
  #define E2_BIT   3
#endif

// void Set_A0(char e)
#define Set_A0(e) if (e)  LCD_CONTROL_PORT |=  (1<<A0_BIT); \
                  else    LCD_CONTROL_PORT &= ~(1<<A0_BIT);

// void Set_RDWR(char e)
#define Set_RDWR(e) if (e)  LCD_CONTROL_PORT |=  (1<<RDWR_BIT); \
                    else    LCD_CONTROL_PORT &= ~(1<<RDWR_BIT);

//void Set_E(char e)
#define Set_E(e) if (e)  LCD_CONTROL_PORT |=  (1<<E_BIT); \
                 else    LCD_CONTROL_PORT &= ~(1<<E_BIT); \
                 delay_us(2);

//void Set_E1(char e)
#define Set_E1(e) if (e)  LCD_CONTROL_PORT |=  (1<<E1_BIT); \
                  else    LCD_CONTROL_PORT &= ~(1<<E1_BIT); //\
                  //delay_us(10);

//void Set_E2(char e)
#define Set_E2(e) if (e)  LCD_CONTROL_PORT |=  (1<<E2_BIT); \
                  else    LCD_CONTROL_PORT &= ~(1<<E2_BIT); //\
                  //delay_us(10);

//void Set_RES(char e)
#define Set_RES(e) if (e)  LCD_CONTROL_PORT |=  (1<<RES_BIT); \
                   else    LCD_CONTROL_PORT &= ~(1<<RES_BIT);


//MEMORY for screen drawing
//или виртуальный экран :)
char MEMO[2][8][64];


void Set_E_(char p)
{
  if (curr_E!=p){
    if (p==1){
    //enable E1
      Set_E1(1);
      Set_E2(0);
      curr_E=p;
    };
    if (p==2){
    //enable E2
      Set_E1(0);
      Set_E2(1);
      curr_E=p;
    };

    if (p==0){
    //Disable both
      Set_E1(0);
      Set_E2(0);
    };

    //virtual enable E1/E2
    if (p==4) curr_E=1;
    if (p==5) curr_E=2;

    //enable last E (E1/E2)
    if (p==3)
    {
      if (curr_E==1){
        Set_E1(1);
        Set_E2(0);
        curr_E=p;
      };
      if (curr_E==2){
        Set_E1(0);
        Set_E2(1);
        curr_E=p;
    };
  }
};


}

void Set_Start_Line(char line)
{ // display_start_line
  Set_E(0);
  Set_E_(3);
  Set_RDWR(0);
  Set_A0(0);
  Set_E(1);
  LCD_DATA_PORT = 0xC0 | line;
  Set_E(0);
  LCD_DATA_PORT = 0;
}

void Set_Page(char page)
{
  Set_E(0);
  if(page > 7) page = 7;
  Set_E_(3);
  Set_RDWR(0);
  Set_A0(0);
  Set_E(1);
  LCD_DATA_PORT = 0xB8 | page;
  Set_E(0);
  LCD_DATA_PORT = 0;
}

void Set_Address(char address)
{
  Set_E(0);
  if (address > 63) address = 63;
  Set_E_(3);
  Set_RDWR(0);
  Set_A0(0);
  Set_E(1);
  LCD_DATA_PORT = 0x40 | address;
  Set_E(0);
  LCD_DATA_PORT = 0;
}

void Write_Data(char data)
{
  Set_E(0);
  Set_E_(3);
  Set_RDWR(0);
  Set_A0(1);
  Set_E(1);
  LCD_DATA_PORT = data;
  Set_E(0);
  LCD_DATA_PORT = 0;
}

void Display_ON(char p)
{
//E1 = 1
  Set_E(0);
  Set_RDWR(0);
  Set_A0(0);
  Set_E_(1);
  Set_E(1);
  
  if (p) LCD_DATA_PORT = 0x3F;
    else LCD_DATA_PORT = 0x3E;
  Set_E(0);
//E2 = 1
  Set_E(0);
  Set_RDWR(0);
  Set_A0(0);
  Set_E_(2);
  Set_E(1);       
  
  if (p) LCD_DATA_PORT = 0x3F;
    else LCD_DATA_PORT = 0x3E;
}

void lcd_init()
{
  Set_RES(0);
  delay_us(30);
  Set_RES(1);
  delay_us(10);
  Display_ON(1);
}

void _putpixel(char x,char y,char c)
{
//установка/стирание пиксела
  char page, scr, ost, address;
  address = 0x3F & x;
  page = y >> 3;
  ost = y & 0x07;
  scr = x >> 6;
  if (c)
    MEMO[scr][page][address] |= 1 << ost; // _BV(ost)
  else 
    MEMO[scr][page][address] &= ~(1<<ost); // ~_BV(ost)
} 



void putpixel(unsigned char x,char y)
{
//установка пиксела
  char page;
  char scr;
  char ost;
  char address;
  address = 0x3F & x;
  page = y >> 3;
  ost = y & 0x07;
  scr = x >> 6;
  MEMO[scr][page][address] |= 1 << ost; // _BV(ost)
}

//смещение послебуковское =)
char sm;
#define sm0 6
#define sm1 8
/**
 * ппц ну ты даеш... :) ябы вынес это в отдельный файл :)
 * кстати чаще фонты держат в виде битмапа
 * тогда знакогенератор 8*5 умещается в пол килобайта,
 * и работает быстрее, если выводить в линию.
 * хотя немног сложнее пропорциональные шрифты сделать, но не на много.
 */
//русские символы. А вот английских то нема!!! ;)
void write_rus(int x, int y, char char1){
  switch (char1){
    case 'а' :{
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+5,y+3);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'б' :{
      putpixel(x+3,y+0);
      putpixel(x+4,y+0);
      putpixel(x+2,y+1);
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'в' :{
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'г' :{
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+1,y+4);
      putpixel(x+1,y+5);
      putpixel(x+1,y+6);
      putpixel(x+1,y+7);
      sm+=sm0;
      break;
    }
    case 'д' :{
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+1,y+5);
      putpixel(x+4,y+5);
      putpixel(x+1,y+6);
      putpixel(x+4,y+6);
      putpixel(x+0,y+7);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+5,y+7);
      putpixel(x+0,y+8);
      putpixel(x+5,y+8);
      sm+=sm0;
      break;
    }
    case 'е' :{
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'ж' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+7,y+2);
      putpixel(x+2,y+3);
      putpixel(x+4,y+3);
      putpixel(x+6,y+3);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);
      putpixel(x+2,y+5);
      putpixel(x+4,y+5);
      putpixel(x+6,y+5);
      putpixel(x+2,y+6);
      putpixel(x+4,y+6);
      putpixel(x+6,y+6);
      putpixel(x+1,y+7);
      putpixel(x+4,y+7);
      putpixel(x+7,y+7);
      sm+=sm0;
      break;
    }
    case 'з' :{
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'и' :{
      putpixel(x+1,y+2);
      putpixel(x+5,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+3,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+2,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'й' :{
      putpixel(x+2,y+0);
      putpixel(x+4,y+0);
      putpixel(x+3,y+1);
      putpixel(x+1,y+2);
      putpixel(x+5,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+3,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+2,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'к' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+3,y+3);
      putpixel(x+1,y+4);
      putpixel(x+2,y+4);
      putpixel(x+1,y+5);
      putpixel(x+3,y+5);
      putpixel(x+1,y+6);
      putpixel(x+4,y+6);
      putpixel(x+1,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'л' :{
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+5,y+2);
      putpixel(x+2,y+3);
      putpixel(x+5,y+3);
      putpixel(x+2,y+4);
      putpixel(x+5,y+4);
      putpixel(x+2,y+5);
      putpixel(x+5,y+5);
      putpixel(x+2,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'м' :{
      putpixel(x+1,y+2);
      putpixel(x+7,y+2);
      putpixel(x+1,y+3);
      putpixel(x+2,y+3);
      putpixel(x+6,y+3);
      putpixel(x+7,y+3);
      putpixel(x+1,y+4);
      putpixel(x+3,y+4);
      putpixel(x+5,y+4);
      putpixel(x+7,y+4);
      putpixel(x+1,y+5);
      putpixel(x+4,y+5);
      putpixel(x+7,y+5);
      putpixel(x+1,y+6);
      putpixel(x+4,y+6);
      putpixel(x+7,y+6);
      putpixel(x+1,y+7);
      putpixel(x+7,y+7);
      sm+=sm1;
      break;
    }
    case 'н' :{
      putpixel(x+1,y+2);
      putpixel(x+5,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'о' :{
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'п' :{
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+5,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'р' :{
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+5,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+1,y+8);
      sm+=sm0;
      break;
    }
    case 'с' :{
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+1,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'т' :{
      putpixel(x+0,y+2);
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+2,y+3);
      putpixel(x+2,y+4);
      putpixel(x+2,y+5);
      putpixel(x+2,y+6);
      putpixel(x+2,y+7);
      sm+=sm0-1;
      break;
    }
    case 'у' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+1,y+5);
      putpixel(x+4,y+5);
      putpixel(x+2,y+6);
      putpixel(x+3,y+6);
      putpixel(x+4,y+6);
      putpixel(x+4,y+7);
      putpixel(x+4,y+8);
      sm+=sm0;
      break;
    }
    case 'ф' :{
      putpixel(x+4,y+1);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+5,y+2);
      putpixel(x+6,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+7,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+7,y+4);
      putpixel(x+1,y+5);
      putpixel(x+4,y+5);
      putpixel(x+7,y+5);
      putpixel(x+2,y+6);
      putpixel(x+3,y+6);
      putpixel(x+4,y+6);
      putpixel(x+5,y+6);
      putpixel(x+6,y+6);
      putpixel(x+4,y+7);
      putpixel(x+4,y+8);
      sm+=sm0;
      break;
    }
    case 'х' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+2,y+5);
      putpixel(x+3,y+5);
      putpixel(x+1,y+6);
      putpixel(x+4,y+6);
      putpixel(x+1,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'ц' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+1,y+5);
      putpixel(x+4,y+5);
      putpixel(x+1,y+6);
      putpixel(x+4,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+5,y+7);
      putpixel(x+5,y+8);
      sm+=sm0;
      break;
    }
    case 'ч' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+2,y+5);
      putpixel(x+3,y+5);
      putpixel(x+4,y+5);
      putpixel(x+4,y+6);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'ш' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+7,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+7,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+7,y+4);
      putpixel(x+1,y+5);
      putpixel(x+4,y+5);
      putpixel(x+7,y+5);
      putpixel(x+1,y+6);
      putpixel(x+4,y+6);
      putpixel(x+7,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+5,y+7);
      putpixel(x+6,y+7);
      putpixel(x+7,y+7);
      sm+=sm1;
      break;
    }
    case 'щ' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+7,y+2);
      putpixel(x+1,y+3);
      putpixel(x+4,y+3);
      putpixel(x+7,y+3);
      putpixel(x+1,y+4);
      putpixel(x+4,y+4);
      putpixel(x+7,y+4);
      putpixel(x+1,y+5);
      putpixel(x+4,y+5);
      putpixel(x+7,y+5);
      putpixel(x+1,y+6);
      putpixel(x+4,y+6);
      putpixel(x+7,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+5,y+7);
      putpixel(x+6,y+7);
      putpixel(x+7,y+7);
      putpixel(x+8,y+8);
      sm+=sm1;
      break;
    }
    case 'ъ' :{
      putpixel(x+0,y+2);
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+0,y+3);
      putpixel(x+2,y+3);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);
      putpixel(x+2,y+5);
      putpixel(x+6,y+5);
      putpixel(x+2,y+6);
      putpixel(x+6,y+6);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    case 'ы' :{
      putpixel(x+1,y+2);
      putpixel(x+7,y+2);
      putpixel(x+1,y+3);
      putpixel(x+7,y+3);
      putpixel(x+1,y+4);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+7,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+7,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+7,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      putpixel(x+7,y+7);
      sm+=sm1;
      break;
    }
    case 'ь' :{
      putpixel(x+1,y+2);
      putpixel(x+1,y+3);
      putpixel(x+1,y+4);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+1,y+5);
      putpixel(x+5,y+5);
      putpixel(x+1,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      putpixel(x+4,y+7);
      sm+=sm0;
      break;
    }
    case 'э' :{
      putpixel(x+1,y+2);
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+0,y+3);
      putpixel(x+4,y+3);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+4,y+5);
      putpixel(x+0,y+6);
      putpixel(x+4,y+6);
      putpixel(x+1,y+7);
      putpixel(x+2,y+7);
      putpixel(x+3,y+7);
      sm+=sm0;
      break;
    }
    case 'ю' :{
      putpixel(x+1,y+2);
      putpixel(x+4,y+2);
      putpixel(x+5,y+2);
      putpixel(x+6,y+2);
      putpixel(x+1,y+3);
      putpixel(x+3,y+3);
      putpixel(x+7,y+3);
      putpixel(x+1,y+4);
      putpixel(x+2,y+4);
      putpixel(x+3,y+4);
      putpixel(x+7,y+4);
      putpixel(x+1,y+5);
      putpixel(x+3,y+5);
      putpixel(x+7,y+5);
      putpixel(x+1,y+6);
      putpixel(x+3,y+6);
      putpixel(x+7,y+6);
      putpixel(x+1,y+7);
      putpixel(x+4,y+7);
      putpixel(x+5,y+7);
      putpixel(x+6,y+7);
      sm+=sm1;
      break;
    }
    case 'я' :{
      putpixel(x+2,y+2);
      putpixel(x+3,y+2);
      putpixel(x+4,y+2);
      putpixel(x+5,y+2);
      putpixel(x+1,y+3);
      putpixel(x+5,y+3);
      putpixel(x+1,y+4);
      putpixel(x+5,y+4);
      putpixel(x+2,y+5);
      putpixel(x+3,y+5);
      putpixel(x+4,y+5);
      putpixel(x+5,y+5);
      putpixel(x+2,y+6);
      putpixel(x+5,y+6);
      putpixel(x+1,y+7);
      putpixel(x+5,y+7);
      sm+=sm0;
      break;
    }
    
    case ' ' :{
      sm+=sm0;
      break;
    }
    
    case '-' :{         
      putpixel(x+2,y+4);    
      putpixel(x+3,y+4);
      putpixel(x+4,y+4);
      putpixel(x+5,y+4);    
      sm+=sm0+1;
      break;
    }
  }
}


//Печать строки              
void printf_lcd(char x, char y, flash char *p) // char p[] !!! странно что это у тебя работает, поправил
{
  sm = 0;

  while (*p++) // страшно выглядит? но это эффективней. :)
  {
    write_rus(x + sm, y, *p);
  }
}



void ReDraw()
{ // А ну ка загони ка в память!!!
  char sc, page, address;
  for (sc = 0; sc < 2; sc++){
  Set_E_(4 + sc);
    for (page = 0; page < 8; page++){
      Set_Page(page);
      Set_Address(0);
      address = 0;
      while(address<64){
        Write_Data(MEMO[sc][page][address]);
        address++;
      };
    };
  };
}

void primer(){
  //включаем порт Ц на выход вместо ДЖтага!!!
  MCUCSR = 0x80;
  MCUCSR = 0x80;

  lcd_init();

  printf_lcd(1,1,"мактеп -");
  printf_lcd(1,10,"отец электроники"); // улыбнуло :)
  printf_lcd(1,20,"отец электроники");
  printf_lcd(1,30,"отец электроники");
  printf_lcd(1,40,"отец электроники");
  printf_lcd(1,50,"отец электроники");
  ReDraw();
}

// EOF
