#define LCD_EN PORTC.0		//E - линия синхронизации
#define LCD_RS PORTC.1		//RS - линия "команда\данные"
#define LCD_PD PORTD            //Порт данных

#define CURSOR_ON 0		//курсор включен (1) или выключен (0)

void lcd_write(unsigned char c);
void lcd_clear(void);
void lcd_puts(const char * s);
void lcd_putch(char c);
void lcd_putsxy(unsigned char x, unsigned char y, const char * s);
void lcd_goto(unsigned char pos);   
void lcd_init(void);
void lcd_hex_byte(unsigned char val); 
void lcd_dec_byte(short val); 
char num_to_char(unsigned char val);

const unsigned char lcd_chars[]=
{//таблица с кодами русских символов
 0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,
 0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,0xAC,0xE2,0xAD,0xAE,0x62,0xAF,0xB0,0xB1,
 0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE,
 0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,
 0xA2,0xB5
};
//------------------------------------------------
void Delay(unsigned long x) {
unsigned long t;
for(t=0;t<=x;t++);
};
//------------------------------------------------
void lcd_write(unsigned char c) //запись данных в ЖКИ
{
 LCD_PD = c;
 LCD_EN = 1;
 LCD_EN = 0;
 Delay(7);		//49.4mks
}
//------------------------------------------------
void lcd_clear(void) //очистка дисплея
{
 LCD_RS = 0;
 lcd_write(0x1);
 Delay(425);				//2ms
}
//------------------------------------------------
void lcd_puts(const char * s) //вывод строки
{
 LCD_RS = 1; 
 
 while(*s) lcd_write(*s++);
}
//------------------------------------------------
void lcd_putch(unsigned char c) //вывод символа
{
 LCD_RS = 1;
 //lcd_write(c);
 if(c<127) lcd_write(c); else 
   if (c<208) lcd_write(lcd_chars[c-128]); else 
    lcd_write(lcd_chars[c-128-48]);
}
//------------------------------------------------
void lcd_goto(unsigned char pos) //установка позиции курсора
{
 //Первая строка:  0..15
 //Вторая строка: 40..55
 LCD_RS = 0;
 lcd_write(0x80+pos);
}                             
//------------------------------------------------
void lcd_putsxy(unsigned char x, unsigned char y, const char * s) 
{
 LCD_RS = 0;
 if(!y)  lcd_write(0x80+x); else  lcd_write(0xC0+x);
 LCD_RS = 1;
 while(*s) { 
  if(*s<127) lcd_write(*s); else 
   if (*s<208) lcd_write(lcd_chars[*s-128]); else 
    lcd_write(lcd_chars[*s-128-48]);
  *s++;
 }
}
//------------------------------------------------
void lcd_init(void) //инициализация ЖКИ
{
 Delay(3150);	//15.1ms
 LCD_RS = 0;	
 lcd_write(0b00110000);	
 lcd_write(0b00110000);	
 lcd_write(0b00110000);	
 lcd_write(0b00111000);		//установка режима (8бит,2строки,5x8)
 lcd_write(0b00001000);		//отключение дисплея
 lcd_clear();				//очистка дисплея
 lcd_write(0b00000110);		//установка режима курсора
 #if CURSOR_ON==1
 lcd_write(0b00001111);		//включение дисплея (мигающий курсор)
 #else 
 lcd_write(0b00001100);		//включение дисплея (без курсора)
 #endif
}
//------------------------------------------------
void lcd_hex_byte(unsigned char val) //вывод байта в формате HEX
{
 lcd_putch(num_to_char((val>>4)&0x0F));
 lcd_putch(num_to_char(val&0x0F));
}
//------------------------------------------------
void lcd_dec_byte(short val) //вывод байта в формате DEC
{
 unsigned char i=0;
 if(val>999) val=0;
 while ((val=val-100)>=0) i++;
 lcd_putch(i+'0');
 i=0;
 val+=100;
 while ((val=val-10)>=0)i++;
 lcd_putch(i+'0');
 lcd_putch(val+10+'0');
}   
//------------------------------------------------
void lcd_dec_word(long val) //вывод байта в формате DEC
{ //99 999
 unsigned char i=0;

 while ((val=val-10000)>=0) i++;
 lcd_putch(i+'0');
 i=0;
 val+=10000;

 if(val>9999) val=0;
 while ((val=val-1000)>=0) i++;
 lcd_putch(i+'0');
 i=0;
 val+=1000;

 if(val>999) val=0;
 while ((val=val-100)>=0) i++;
 lcd_putch(i+'0');
 i=0;
 val+=100;

 while ((val=val-10)>=0)i++;
 lcd_putch(i+'0');
 lcd_putch(val+10+'0');
}   
//------------------------------------------------
char num_to_char(unsigned char val) //преобразование в ASCII
{
if (val<10) return (val+'0'); else return (val-10+'A'); 
}
//------------------------------------------------
