#include <mega8.h>
#include <delay.h>
#define LCD_EN PORTC.4
#define LCD_RS PORTC.5 
//#define LCD_DATA  PORTD
#define CURSOR_ON 1 
//----------------------------------------------------------------------------------
flash unsigned char *t="1234567890";
void lcd_write (unsigned char c);
void lcd_putch(unsigned char c);
void lcd_puts(flash char *s);
void lcd_goto (unsigned char pos);
void lcd_putsxy (unsigned char x,unsigned char y,flash char *s); 
void lcd_clear(void);
void lcd_hex_byte(unsigned char val); 
void lcd_dec_byte(short val);
void LCD_DATA (unsigned char d);
char num_to_char(unsigned char val);
void lcd_init(void);
flash unsigned char lcd_chars[]=
{//PUSSIAN SIM
 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 LCD_DATA (unsigned char d){
 PORTC.0=d & 0b00000001;
 PORTC.1=d & 0b00000010;
 PORTD.2=d & 0b00000100;
 PORTD.3=d & 0b00001000;
 PORTD.4=d & 0b00010000;
 PORTD.5=d & 0b00100000;
 PORTD.6=d & 0b01000000;
 PORTD.7=d & 0b10000000; 
}
//+++++++++++++++++++++++++
void lcd_write(unsigned char c){
//if(LCD_RS==1)LCD_DATA(0x0);
//else LCD_DATA(0x0);
delay_ms(1);
LCD_EN=1;
delay_ms(1);
LCD_DATA(c);
delay_ms(2);
LCD_EN=0;
delay_ms(2);
}
//+++++++++++++++++++++++++
void lcd_clear(void){
LCD_RS=0;
lcd_write(0b00000001);
LCD_RS=1;
}
//+++++++++++++++++++++++++
void lcd_init(void){
LCD_RS=0;
delay_ms(35);
lcd_write(00110000);
delay_ms(5);
lcd_write(00110000);
delay_ms(1);
lcd_write(00110000);
delay_ms(1);
lcd_write(0b00111000);//8bit,2str,5x8
delay_ms(1);
lcd_write(0b00001000);//display OFF
delay_ms(1);
lcd_write(0b00000001);//clear
delay_ms(2);
 #if CURSOR_ON==1
 lcd_write(0b00001111);//blinking of cursor 
 #else
 lcd_write(0b00001100);//cursor OFF
 #endif 
 LCD_RS=1;   
  
}
//+++++++++++++++++++++++++
void lcd_puts(flash char *s){
 LCD_RS=1;
 while(*s)lcd_write(*s++);
} 
//+++++++++++++++++++++++++
void lcd_putch(unsigned char c){
 LCD_RS=1;
 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_putsxy(unsigned char x,unsigned char y,flash 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_goto(unsigned char pos){
 //1 stroka 0..15
 //2 stroka 40..55
 LCD_RS=0;
 lcd_write(0x80+pos);
}
//++++++++++++++++++++++++++++
void lcd_hex_byte(unsigned char val){
 lcd_putch(num_to_char((val>>4)&0x0F));
 lcd_putch(num_to_char(val&0x0F));
} 
//++++++++++++++++++++++++++++
void lcd_dec_byte(short val){
 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');
}
//++++++++++++++++++++++++++++
char num_to_char(unsigned char val){
 if(val<10)return(val+'0');else return(val-10+'A');
}

//-----------------------------------------------------------------------------------
void main (void){
PORTD=0x0;
DDRD=0xFF;

PORTC=0x0;
DDRC=0xFF;

PORTB=0x1;
DDRB=0xFF;
 
lcd_init(); 

lcd_clear();
lcd_puts(t);
lcd_putsxy(5,1,"ULTER");
while(1){
//delay_ms(400);
//PORTB.0=0;
//delay_ms(400);
//PORTB.0=1;
};
}