#include <mega8.h>
#include <delay.h>
#include <spi.h>
#include "lcd_init.h"
#include <string.h>

 #define DISP_W       132
 #define DISP_H       176 
 
 #define CHAR_H       14
 #define CHAR_W       8

//  RS = high  Command 
//  RS = low  Data 
 
#define RS PORTB.0
#define CS PORTB.2
#define RESET PORTB.4

#define sky 0x54fb
#define black 0x0000
#define white 0xFFFF
#define green 0x07E0
#define blue 0x001F
#define red 0xF800
#define yellow 0xDEE0
#define orange 0xAB00
#define pink 0xF97F
#define brown 0x8200
#define grey 0x8410
#define violet 0x91D4

unsigned int bgcolor=0x0000;

void m8_init_port(void)
{

// MK  - LCD            DDRB   |     PORTB
// PB0 - RS             1      |      1
// PB1 - //             0      |      0
// PB2 - CS             1      |      1
// PB3 - DAT (MOSI)     1      |      0
// PB4 - Reset          1      |      1
// PB5 - CLK            1      |      0
// PB6 - //             0      |      0
// PB7 - //             0      |      0
//                             |
// HEX                  3D     |      15
//

PORTB=0x15;
DDRB=0x3D;

/*
PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;
*/

PORTD=0x70;
DDRD=0x00;

// init SPI
SPCR=0x50;
SPSR=0x01;
}

void lcd_write8(char dat)
{
  spi(dat);
}
// запись двух байт
void lcd_write(unsigned int dat)
{
  lcd_write8(dat>>8);
  lcd_write8 (dat);
}
// пишем в память дисплея данные (2 байта)
void lcd_d(unsigned int data)
{ 
  CS=0;
  RS=0;
  lcd_write(data);
  CS=1;
} 
// отсылаем команды (2 байта)
void lcd_c(unsigned int command)
{ 
  CS=0;
  RS=1;
  lcd_write(command);
  CS=1;
}

void fill_screen(unsigned int color)
{
 unsigned int i;   
  lcd_c(0xEF90);
  lcd_c(0x0500);
  lcd_c(0x0600);
  lcd_c(0x0700);
  for (i=0; i<DISP_W*DISP_H; i++)
    lcd_d(color);     //DISP_W 132  DISP_H 176      
} 

void lcd_init(void)
{
int i;
   
  //RS=1 Command
  RESET=0;      //RS=0 DATA 
  CS=0;
  
  delay_ms(5);
  
  RS=1;
  RESET=1;
  
  delay_ms(50);
  for (i=0;i<12;i++) lcd_c(INIT1[i])
  ;
  delay_ms(7);
  for (i=0;i<20;i++) lcd_c(INIT2[i]);
  
  delay_ms(50);
  for (i=0;i<1;i++) lcd_c(INIT3[i]);
  
  delay_ms(5);
  
  fill_screen(bgcolor); // очищаем экран от мусора
  
  CS=1;
  
} 
           

void put_char(char x, char y, char c, unsigned int color)
{
  char h,ch,p,mask,tt;
  //char m=1;
 // DISP_READY=0;
  x=DISP_H - CHAR_H - x;
    lcd_c(0xEF90); 
    lcd_c(0x0504);
    lcd_c(0x0800+y);
    lcd_c(0x0A00+x);
    lcd_c(0x0900+y+CHAR_H-1);
    lcd_c(0x0B00+x+CHAR_W-1);
  for (h=CHAR_H; h>0; h--) // every column of the character
  {
      for(tt=0;tt<1;tt++)
        {  
        ch=ascii_tab[c][CHAR_H-h];
        mask=0x01;
        for (p=0; p<CHAR_W; p++)  // write the pixels
          {
          if (ch&mask)
            {
            lcd_d(color);
            //if(m==2) lcd_d(color);                 
            }
           else
            {
            lcd_d(bgcolor);
            //if(m==2) lcd_d(bgcolor); 
            }
          mask=mask*2;
          }
        }  
  }
    
}

void put_string(unsigned char x, unsigned char y, char *str, unsigned int color)
{
unsigned char  j=0;
  while (j<strlen(str))
   {
   put_char(x+j*CHAR_W,y,str[j],color);   //  0 deg. rotated str[j]
   j++;
   }
} 

/*
void put_dot(int x, int y,long int color)
 {
  send_cmd(0xEF90);
  send_cmd(0x0500);
  send_cmd(0x0800+x);
  send_cmd(0x0A00+y);
  send_data(color);
  
 } 
*/ 

void lcd_poweroff (void)
{
  lcd_c(0xEF00); lcd_c(0x7E04); lcd_c(0xEFB0); lcd_c(0x5A48); 
  lcd_c(0xEF00); lcd_c(0x7F01); lcd_c(0xEFB0); lcd_c(0x64FF);
  lcd_c(0x6500); lcd_c(0xEF00); lcd_c(0x7F01); lcd_c(0xE262);
  lcd_c(0xE202); lcd_c(0xEFB0); lcd_c(0xBC02); lcd_c(0xEF00);
  lcd_c(0x7F01); lcd_c(0xE200); lcd_c(0x8000); lcd_c(0xE204);
  lcd_c(0xE200); lcd_c(0xE100); lcd_c(0xEFB0); lcd_c(0xBC00);
  lcd_c(0xEF00); lcd_c(0x7F01);
}

void ColorZone(int x1, int y1, int x2, int y2,long int color)
{
  int i;
  lcd_c(0xEF90);

 // if(m_bRotate)
 // {
 //   lcd_c(0x0500);
 // }
 // else
 // {
  lcd_c(0x0500);
 // }
  lcd_c(0x0800+x1);
  lcd_c(0x0900+x2);
  lcd_c(0x0A00+y1);
  lcd_c(0x0B00+y2);

  for(i=0; i<(x2-x1+1)*(y2-y1+1); i++)
  {
    lcd_d(color);
  }
 }


