/*
 * siemensMC60.c
 *
 *  Created on: 20.05.2014
 *      Author: komp
 */
#include "main.h"
#include "pin_repository.h"
#include "string.h"
#include "siemensMC60.h"
#include "engine_configuration.h"

#define CMD 	0
#define DAT 	1


#define GREEN       0x1C
#define DARK_GREEN  0x15
#define RED         0xE0
#define BLUE        0x1F
#define DARK_BLUE   0x03
#define YELLOW      0xFC
#define ORANGE      0xEC
#define VIOLET      0xE3
#define WHITE       0xFF
#define BLACK       0x00
#define GREY        0x6D




#define LCD_CS_PIN 10
#define LCD_CS_PORT GPIOE
#define LCD_RESET_PIN 12
#define LCD_RESET_PORT GPIOE
#define LCD_RS_PIN 14
#define LCD_RS_PORT GPIOE
#define LCD_CLK_PIN 10
#define LCD_CLK_PORT GPIOB
#define LCD_DATA_PIN 12
#define LCD_DATA_PORT GPIOB













void lcdMC_reset(void)
{
 palClearPad(LCD_CS_PORT, LCD_CS_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palClearPad(LCD_RESET_PORT, LCD_RESET_PIN);
 chThdSleepMilliseconds(100);
 palSetPad(LCD_RESET_PORT, LCD_RESET_PIN);
 chThdSleepMilliseconds(500);
 palSetPad(LCD_CS_PORT, LCD_CS_PIN);
 chThdSleepMicroseconds(15);
 palClearPad(LCD_CS_PORT, LCD_CS_PIN);
}

void Send_to_lcd(unsigned char RS, unsigned char data)
{
 //unsigned char count;
	palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
	palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);

 palSetPad(LCD_CS_PORT, LCD_CS_PIN);
 if (RS == 1) palSetPad(LCD_RS_PORT, LCD_RS_PIN);
 if (RS == 0) palClearPad(LCD_RS_PORT, LCD_RS_PIN);

 palClearPad(LCD_CS_PORT, LCD_CS_PIN);


 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 128) == 128)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 64) == 64)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 32) == 32)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 16) ==16)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 8) == 8)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 4) == 4)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 2) == 2)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
 if ((data & 1) == 1)  palSetPad(LCD_DATA_PORT, LCD_DATA_PIN);
 palSetPad(LCD_CLK_PORT, LCD_CLK_PIN);
 palClearPad(LCD_CLK_PORT, LCD_CLK_PIN);


 palClearPad(LCD_DATA_PORT, LCD_DATA_PIN);
}

void LCDmc60_init(void)
{
	mySetPadMode("lcd CS", LCD_CS_PORT, LCD_CS_PIN, PAL_MODE_OUTPUT_PUSHPULL);
	mySetPadMode("lcd RST", LCD_RESET_PORT, LCD_RESET_PIN, PAL_MODE_OUTPUT_PUSHPULL);
	mySetPadMode("lcd RS", LCD_RS_PORT, LCD_RS_PIN, PAL_MODE_OUTPUT_PUSHPULL);
	mySetPadMode("lcd CLK", LCD_CLK_PORT, LCD_CLK_PIN, PAL_MODE_OUTPUT_PUSHPULL);
	mySetPadMode("lcd DAT", LCD_DATA_PORT, LCD_DATA_PIN, PAL_MODE_OUTPUT_PUSHPULL);
 lcdMC_reset ();
 Send_to_lcd(CMD,0x01); //reset sw
 chThdSleepMilliseconds(50);
 Send_to_lcd(CMD,0xc6); //initial escape
 chThdSleepMilliseconds(40);
 Send_to_lcd(CMD,0xb9); //Refresh set
 Send_to_lcd(DAT,0x00);
 Send_to_lcd(CMD,0xb6); //Display control
 Send_to_lcd(DAT,0x80); //
 Send_to_lcd(DAT,0x04); //
 Send_to_lcd(DAT,0x8a); //
 Send_to_lcd(DAT,0x54); //
 Send_to_lcd(DAT,0x45); //
 Send_to_lcd(DAT,0x52); //
 Send_to_lcd(DAT,0x43); //
 Send_to_lcd(CMD,0xb3); //Gray scale position set 0
 Send_to_lcd(DAT,0x02); //
 Send_to_lcd(DAT,0x0a); //
 Send_to_lcd(DAT,0x15); //
 Send_to_lcd(DAT,0x1f); //
 Send_to_lcd(DAT,0x28); //
 Send_to_lcd(DAT,0x30); //
 Send_to_lcd(DAT,0x37); //
 Send_to_lcd(DAT,0x3f); //
 Send_to_lcd(DAT,0x47); //
 Send_to_lcd(DAT,0x4c); //
 Send_to_lcd(DAT,0x54); //
 Send_to_lcd(DAT,0x65); //
 Send_to_lcd(DAT,0x75); //
 Send_to_lcd(DAT,0x80); //
 Send_to_lcd(DAT,0x85); //
 Send_to_lcd(CMD,0xb5); //Gamma curve
 Send_to_lcd(DAT,0x01); //
 Send_to_lcd(CMD,0xb7); //Temperature gradient
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(CMD,0xbd); //Common driver output select
 Send_to_lcd(DAT,0x00); //
 /*
 Send_to_lcd(CMD,0x33); //Vertical scrolling definition - Ãðàíèöû âåðòèêàëüíîé ïðîêðóòêè
 Send_to_lcd(DAT,0x00); //×èñëî ëèíèé, èñïîëüçóåìûõ â êà÷åñòâå âåðõíåé ôèêñèðîâàííîé îáëàñòè äèñïëåÿ (max - 0x53)
 Send_to_lcd(DAT,0x53); //Îïðåäåëÿåì îáëàñòü ïðîêðóòêè
 Send_to_lcd(DAT,0x00); //×èñëî ëèíèé, èñïîëüçóåìûõ â êà÷åñòâå íèæíåé ôèêñèðîâàííîé îáëàñòè äèñïëåÿ
 Send_to_lcd(CMD,0x37); //Vertical scrolling start adress
 Send_to_lcd(DAT,0x00);
*/
 Send_to_lcd(CMD,0x36); //Memory access control - Ìåòîä äîñòóïà ê äèñïëåéíîé ïàìÿòè (óñòàíîâêà íóëåâîãî àäðåñà ñòðàíèöû è ñòîëáöà, íàïðàâëåíèå çàïèñè â ïàìÿòü äèñïëåÿ)
 Send_to_lcd(DAT,0x48); //6-é áèò, óñòàíîâëåííûé â "1" äåëàåò àäðåñàöèþ ñòîëáöà - ñëåâà-íàïðàâî, à 3-é áèò â "1" - ïîðÿäîê RGB (à â äàòàøèòå - îøèáêà!!!)
 Send_to_lcd(CMD,0x2d); //Colour set
 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x03); //
 Send_to_lcd(DAT,0x05); //
 Send_to_lcd(DAT,0x07); //
 Send_to_lcd(DAT,0x09); //
 Send_to_lcd(DAT,0x0b); //
 Send_to_lcd(DAT,0x0d); //
 Send_to_lcd(DAT,0x0f); //

 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x03); //
 Send_to_lcd(DAT,0x05); //
 Send_to_lcd(DAT,0x07); //
 Send_to_lcd(DAT,0x09); //
 Send_to_lcd(DAT,0x0b); //
 Send_to_lcd(DAT,0x0d); //
 Send_to_lcd(DAT,0x0f); //

 Send_to_lcd(DAT,0x00); //
 Send_to_lcd(DAT,0x05); //
 Send_to_lcd(DAT,0x0b); //
 Send_to_lcd(DAT,0x0f); //
 Send_to_lcd(CMD,0xba); //Voltage control
 Send_to_lcd(DAT,0x2f); //
 Send_to_lcd(DAT,0x03); //
 Send_to_lcd(CMD,0x25); //Óñòàíîâêà êîíòðàñòà
 Send_to_lcd(DAT,0x61); //
 Send_to_lcd(CMD,0xbe); //Power control
 Send_to_lcd(DAT,0x58); //

 Send_to_lcd(CMD,0x3a); //Èíôîðìàöèÿ î âûâîäå ïèêñåëÿ
 Send_to_lcd(DAT,0x02); //8-ìè áèòíûé öâåò
 Send_to_lcd(CMD,0x03); //Booster voltage ON
 chThdSleepMilliseconds(40);
 Send_to_lcd(CMD,0x11); //Âûõîä èç ñïÿùåãî ðåæèìà
 chThdSleepMilliseconds(20);		//Ïåðåä âêëþ÷åíèåì æäåì 20 ìèëëèñåêóíä
 Send_to_lcd(CMD,0x29); //Âêëþ÷åíèå äèñïëåÿ
}

void SetArea(char x1, char x2, char y1, char y2) {
 Send_to_lcd( CMD, 0x2A );
 Send_to_lcd( DAT, x1 );
 Send_to_lcd( DAT, x2 );

 Send_to_lcd( CMD, 0x2B );
 Send_to_lcd( DAT, y1+1 );
 Send_to_lcd( DAT, y2+1 );

 Send_to_lcd( CMD, 0x2C );
}


void Put_Pixel(char x, char y, unsigned int color) {

 SetArea(x,x,y,y);
 Send_to_lcd(DAT,color);
}


/*


void Send_Symbol(unsigned char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
{
 unsigned char temp_symbol, a, b, zw, zh, mask;
 char m, n;
 m=x;
 n=y;
 if (symbol>127) symbol-=64;    //Óáèðàåì îòñóòñòâóþùóþ ÷àñòü òàáëèöû ASCII
 for ( a = 0; a < 5; a++) //Ïåðåáèðàþ 5 áàéò, ñîñòàâëÿþùèõ ñèìâîë
 {
  temp_symbol = font_5x8[symbol-32][a];
  zw = 0;
  while(zw != zoom_width) //Âûâîä áàéòà âûïîëíÿåòñÿ zw ðàç
  {
   switch(rot)
   {
    case 0: case 180: n=y; break;
    case 90: case 270: m=x; break;
   }
   mask=0x01;
   for ( b = 0; b < 8; b++ ) //Öèêë ïåðåáèðàíèÿ 8 áèò áàéòà
   {
    zh = 0; //â zoom_height ðàç óâåëè÷èòñÿ âûñîòà ñèìâîëà
    while(zh != zoom_height) //Âûâîä ïèêñåëÿ âûïîëíÿåòñÿ z ðàç
    {
     switch(rot)
     {
      case 0: case 180:
      if (temp_symbol&mask)
      {
       Put_Pixel (m+zw, n+zh, t_color);
      }
      else
      {
       Put_Pixel (m+zw, n+zh, b_color);
      }
      break;
      case 90: case 270:
      if (temp_symbol&mask)
      {
       Put_Pixel (m+zh, n+zw, t_color);
      }
      else
      {
       Put_Pixel (m+zh, n+zw, b_color);
      }
      break; //Ïîëó÷èòü àäðåñ íà÷àëüíîãî ïèêñåëÿ ïî îñè y äëÿ âûâîäà î÷åðåäíîãî áàéòà
     }
     zh++;
    }
    mask<<=1; //Ñìåùàþ ñîäåðæèìîå mask íà 1 áèò âëåâî;
    switch(rot)
    {
     case 0: case 180: n=n+zoom_height; break;
     case 90: case 270: m=m+zoom_height; break;
    }
   }
   zw++;
  }
  switch(rot)
  {
   case 0: case 180: m=m+zoom_width; break;
   case 90: case 270: n=n+zoom_width; break;
  }
 }
}



void LCD_Putchar(char symbol, char x, char y, int t_color, int b_color, char zoom_width, char zoom_height, int rot)
{
    unsigned char m;
    if(zoom_width == 0)   zoom_width = 1;
    if(zoom_height == 0)  zoom_height = 1;
    switch (rot)
    {
        case 0:  //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ëåâûé âåðõíèé óãîë äèñïëåÿ
        Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
        break;
        //================================
        case 90:
        m=y+3; y=x; x=m;
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0x08); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ïðàâûé âåðõíèé óãîë äèñïëåÿ
        Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0x48);
        break;
        //================================
        case 180:
        x+=3; y+=2;
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0x88); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ïðàâûé íèæíèé óãîë äèñïëåÿ
        Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0x48);
        break;
        //================================
        case 270:
        m=y; y=x+2; x=m;
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0xC8); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ëåâûé íèæíèé óãîë äèñïëåÿ
        Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0x48);
        break;
        //================================
        default:
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0x48); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ëåâûé âåðõíèé óãîë äèñïëåÿ
        Send_Symbol( symbol, x, y, t_color, b_color, zoom_width, zoom_height, rot);
        Send_to_lcd(CMD, 0x36);
        Send_to_lcd(DAT, 0x48);
        //=================================
    };
}



void LCD_Puts(char *str, int x, int y,  int t_color, int b_color, char zoom_width, char zoom_height, int rot)
{
 unsigned char i=0;

 if(zoom_width == 0)   zoom_width = 1;
 if(zoom_height == 0)  zoom_height = 1;

 while (str[i]) //x è y - àäðåñ ïèêñåëÿ íà÷àëüíîé ïîçèöèè; ñ óâåëè÷åíèåì ïåðåìåííîé i àäðåñ âûâîäà î÷åðåäíîãî ñèìâîëà ñìåùàåòñÿ íà i*6 (÷åì îðãàíèçóþòñÿ ñòîëáöû äèñïëåÿ)
 {
  LCD_Putchar(str[i], x+(i*6*zoom_width), y, t_color, b_color, zoom_width, zoom_height, rot);
  i++;
 }
}


void Send_Symbol_Shadow(unsigned char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot)
{
 unsigned char temp_symbol, a, b, zw, zh, mask;
 char m, n;
 m=x;
 n=y;
 if (symbol>127) symbol-=64;    //Óáèðàåì îòñóòñòâóþùóþ ÷àñòü òàáëèöû ASCII
 for ( a = 0; a < 5; a++) //Ïåðåáèðàþ 5 áàéò, ñîñòàâëÿþùèõ ñèìâîë
 {
  temp_symbol = font_5x8[symbol-32][a];
  zw = 0;
  while(zw != zoom_width) //Âûâîä áàéòà âûïîëíÿåòñÿ zw ðàç
  {
   switch(rot)
   {
    case 0: case 180: n=y; break;
    case 90: case 270: m=x; break;
   }
   mask=0x01;
   for ( b = 0; b < 8; b++ ) //Öèêë ïåðåáèðàíèÿ 8 áèò áàéòà
   {
    zh = 0; //â zoom_height ðàç óâåëè÷èòñÿ âûñîòà ñèìâîëà
    while(zh != zoom_height) //Âûâîä ïèêñåëÿ âûïîëíÿåòñÿ z ðàç
    {
     switch(rot)
     {
      case 0: case 180:
      if (temp_symbol&mask)
      {
       Put_Pixel (m+zw, n+zh, t_color);
      }
      break;
      case 90: case 270:
      if (temp_symbol&mask)
      {
       Put_Pixel (m+zh, n+zw, t_color);
      }
      break; //Ïîëó÷èòü àäðåñ íà÷àëüíîãî ïèêñåëÿ ïî îñè y äëÿ âûâîäà î÷åðåäíîãî áàéòà
     }
     zh++;
    }
    mask<<=1; //Ñìåùàþ ñîäåðæèìîå mask íà 1 áèò âëåâî;
    switch(rot)
    {
     case 0: case 180: n=n+zoom_height; break;
     case 90: case 270: m=m+zoom_height; break;
    }
   }
   zw++;
  }
  switch(rot)
  {
   case 0: case 180: m=m+zoom_width; break;
   case 90: case 270: n=n+zoom_width; break;
  }
 }
}


void LCD_Putchar_Shadow(char symbol, char x, char y, int t_color, char zoom_width, char zoom_height, int rot)
{
 unsigned char m;
 if(zoom_width == 0)   zoom_width = 1;
 if(zoom_height == 0)  zoom_height = 1;
 switch (rot)
 {
  case 0:  //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ëåâûé âåðõíèé óãîë äèñïëåÿ
  Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot);
  break;
  //================================
  case 90:
  m=y+3; y=x; x=m;
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0x08); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ïðàâûé âåðõíèé óãîë äèñïëåÿ
  Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot);
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0x48);
  break;
  //================================
  case 180:
  x+=3; y+=2;
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0x88); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ïðàâûé íèæíèé óãîë äèñïëåÿ
  Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot);
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0x48);
  break;
  //================================
  case 270:
  m=y; y=x+2; x=m;
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0xC8); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ëåâûé íèæíèé óãîë äèñïëåÿ
  Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot);
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0x48);
  break;
  //================================
  default:
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0x48); //Íà÷àëüíûé àäðåñ îñåé Õ è Ó - ëåâûé âåðõíèé óãîë äèñïëåÿ
  Send_Symbol_Shadow( symbol, x, y, t_color, zoom_width, zoom_height, rot);
  Send_to_lcd(CMD, 0x36);
  Send_to_lcd(DAT, 0x48);
  //=================================
 };
}


void LCD_Puts_Shadow(char *str, int x, int y,  int t_color, char zoom_width, char zoom_height, int rot)
{
 unsigned char i=0;

 if(zoom_width == 0)   zoom_width = 1;
 if(zoom_height == 0)  zoom_height = 1;

 while (str[i]) //x è y - àäðåñ ïèêñåëÿ íà÷àëüíîé ïîçèöèè; ñ óâåëè÷åíèåì ïåðåìåííîé i àäðåñ âûâîäà î÷åðåäíîãî ñèìâîëà ñìåùàåòñÿ íà i*6 (÷åì îðãàíèçóþòñÿ ñòîëáöû äèñïëåÿ)
 {
  LCD_Putchar_Shadow(str[i], x+(i*6*zoom_width), y, t_color, zoom_width, zoom_height, rot);
  i++;
 }
}
*/

void LCD_FillScreen(unsigned int color)
{
 unsigned int x;
 SetArea( 0, 100, 0, 80 );   //Îáëàñòü âñåãî ýêðàíà
 for (x = 0; x < 8080; x++)
 {

  Send_to_lcd( DAT, color ); //Äàííûå - çàäàžì öâåò ïèêñåëÿ

 }
}


void LCD_DrawLine(char x1, char y1, char x2, char y2, int color)
{
 short  x, y, d, dx, dy, i, i1, i2, kx, ky;
 signed char flag;

 dx = x2 - x1;
 dy = y2 - y1;
 if (dx == 0 && dy == 0) Put_Pixel(x1, y1, color);  //Òî÷êà
 else      //Ëèíèÿ
 {
  kx = 1;
  ky = 1;
  if( dx < 0 )
  {
   dx = -dx;
   kx = -1;
  }
  else
  if(dx == 0) kx = 0;
  if(dy < 0)
  {
   dy = -dy;
   ky = -1;
  }
  if(dx < dy)
  {
   flag = 0;
   d = dx;
   dx = dy;
   dy = d;
  }
  else flag = 1;
  i1 = dy + dy;
  d = i1 - dx;
  i2 = d - dx;
  x = x1;
  y = y1;

  for(i=0; i < dx; i++)
  {
   Put_Pixel(x, y, color);
   if(flag) x += kx;
   else y += ky;
   if( d < 0 ) d += i1;
   else
   {
    d += i2;
    if(flag) y += ky;
    else x += kx;
   }
  }
  Put_Pixel(x, y, color);
 }
}


void LCD_DrawRect(char x1, char y1, char width, char height, char size, int color)
{
 unsigned int i;
 char x2=x1+(width-1), y2=y1+(height-1); //Êîíå÷íûå ðàçìåðû ðàìêè ïî îñÿì õ è ó
 for( i=1; i<=size; i++)   // size - òîëùèíà ðàìêè
 {
  LCD_DrawLine(x1, y1, x1, y2, color);
  LCD_DrawLine(x2, y1, x2, y2, color);
  LCD_DrawLine(x1, y1, x2, y1, color);
  LCD_DrawLine(x1, y2, x2, y2, color);
  x1++; // Óâåëè÷èâàþ òîëùèíó ðàìêè, åñëè ýòî çàäàíî
  y1++;
  x2--;
  y2--;
 }
}


void LCD_FillRect(char x1, char y1, char width, char height, int color)
{
 unsigned int x, y;

 SetArea( x1, x1+(width-1), y1, y1+(height-1) );
 y = width * height;	        //Êîëè÷åñòâî ïèêñåëåé â ïðÿìîóãîëüíèêå
 for (x = 0; x < y; x++)
 {

  Send_to_lcd( DAT, color ); Send_to_lcd( DAT, color ); //Äàííûå - çàäàžì öâåò ïèêñåëÿ

 }
}


void LCD_DrawCircle(char xcenter, char ycenter, char rad, int color)
{
 signed int tswitch, x1=0, y1;
 char d;

 d = ycenter - xcenter;
 y1 = rad;
 tswitch = 3 - 2 * rad;
 while (x1 <= y1)
 {
  Put_Pixel(xcenter + x1, ycenter + y1, color);
  Put_Pixel(xcenter + x1, ycenter - y1, color);
  Put_Pixel(xcenter - x1, ycenter + y1, color);
  Put_Pixel(xcenter - x1, ycenter - y1, color);
  Put_Pixel(ycenter + y1 - d, ycenter + x1, color);
  Put_Pixel(ycenter + y1 - d, ycenter - x1, color);
  Put_Pixel(ycenter - y1 - d, ycenter + x1, color);
  Put_Pixel(ycenter - y1 - d, ycenter - x1, color);

  if (tswitch < 0) tswitch += (4 * x1 + 6);
  else
  {
   tswitch += (4 * (x1 - y1) + 10);
   y1--;
  }
  x1++;
 }
}


void LCD_FillCircle(char xcenter, char ycenter, char rad, int color)
{
 signed int x1=0, y1, tswitch;
 y1 = rad;
 tswitch = 1 - rad;

 do
 {
  LCD_DrawLine(xcenter-x1, ycenter+y1, xcenter+x1, ycenter+y1, color);
  LCD_DrawLine(xcenter-x1, ycenter-y1, xcenter+x1, ycenter-y1, color);
  LCD_DrawLine(xcenter-y1, ycenter+x1, xcenter+y1, ycenter+x1, color);
  LCD_DrawLine(xcenter-y1, ycenter-x1, xcenter+y1, ycenter-x1, color);

  if(tswitch < 0)
  tswitch+= 3 + 2*x1++;
  else
  tswitch+= 5 + 2*(x1++ - y1--);
 } while(x1 <= y1);
}


//===============================================================

