#ifndef _NOKIALCD_H_

#define _NOKIALCD_H_

/*--------------------------------------------------------------------------------------------------
                                  General purpose constants
--------------------------------------------------------------------------------------------------*/
#define FALSE                      0
#define TRUE                       1

#define LCD_X_RES                  96           //пикселей по Х
#define LCD_Y_RES                  8            // кол-во строк по Y

//  Mega8 port B pinout for LCD.
#define LCD_DC_PIN                 0x04  //  PB2
#define LCD_CE_PIN                 0x02  //  PB1
#define SPI_MOSI_PIN               0x08  //  PB3
#define LCD_RST_PIN                0x01  //  PB0
#define SPI_CLK_PIN                0x20  //  PB5



/*--------------------------------------------------------------------------------------------------
                                       Type definitions
--------------------------------------------------------------------------------------------------*/
typedef char                       bool;
typedef unsigned char              byte;
typedef unsigned int               word;

typedef enum
{
    LCD_CMD  = 0,
    LCD_DATA = 1

} LcdCmdData;

typedef enum
{
    PIXEL_OFF =  0,
    PIXEL_ON  =  1,
    PIXEL_XOR =  2

} LcdPixelMode;

typedef enum
{
    FONT_1X = 1,
    FONT_2X = 2

} LcdFontSize;

/*--------------------------------------------------------------------------------------------------
                                 Public function prototypes
--------------------------------------------------------------------------------------------------*/
void LcdInit ( void );
void ClearLcd( void );
static void LcdSend ( byte data, LcdCmdData cd );
void LcdPutLine( byte *data, byte x, byte line );
void LcdDrawBitmap( void /* unsigned char* bitmap */ );
static void Delay ( void );

//byte bitmap_buffer[];


// FASTLCD "IMAGE MODE"
//flash byte my[] = {};


/*--------------------------------------------------------------------------------------------------
                                     Character generator

             This table defines the standard ASCII characters in a 5x7 dot format.
--------------------------------------------------------------------------------------------------*/

flash char FontLookup[300][5] = 
{

0x00, 0x00, 0x00, 0x00, 0x00,// 20 space
0x00, 0x00, 0x5F, 0x00, 0x00,// 21 ! 
0x00, 0x07, 0x00, 0x07, 0x00,// 22 " 
0x14, 0x7F, 0x14, 0x7F, 0x14,// 23 # 
0x24, 0x2A, 0x7F, 0x2A, 0x12,// 24 $ 
0x23, 0x13, 0x08, 0x64, 0x62,// 25 % 
0x36, 0x49, 0x55, 0x22, 0x50,// 26 & 
0x00, 0x05, 0x03, 0x00, 0x00,// 27 '
0x00, 0x1C, 0x22, 0x41, 0x00,// 28 ( 
0x00, 0x41, 0x22, 0x1C, 0x00,// 29 )
0x14, 0x08, 0x3E, 0x08, 0x14,// 2a * 
0x08, 0x08, 0x3E, 0x08, 0x08,// 2b + 
0x00, 0x50, 0x30, 0x00, 0x00,// 2c , 
0x08, 0x08, 0x08, 0x08, 0x08,// 2d - 
0x00, 0x60, 0x60, 0x00, 0x00,// 2e . 
0x20, 0x10, 0x08, 0x04, 0x02,// 2f / 
0x3E, 0x51, 0x49, 0x45, 0x3E,// 30 0 
0x00, 0x42, 0x7F, 0x40, 0x00,// 31 1 
0x42, 0x61, 0x51, 0x49, 0x46,// 32 2 
0x21, 0x41, 0x45, 0x4B, 0x31,// 33 3 
0x18, 0x14, 0x12, 0x7F, 0x10,// 34 4
0x27, 0x45, 0x45, 0x45, 0x39,// 35 5 
0x3C, 0x4A, 0x49, 0x49, 0x30,// 36 6 
0x01, 0x71, 0x09, 0x05, 0x03,// 37 7 
0x36, 0x49, 0x49, 0x49, 0x36,// 38 8 
0x06, 0x49, 0x49, 0x29, 0x1E,// 39 9 
0x00, 0x36, 0x36, 0x00, 0x00,// 3a : 
0x00, 0x56, 0x36, 0x00, 0x00,// 3b ; 
0x08, 0x14, 0x22, 0x41, 0x00,// 3c < 
0x14, 0x14, 0x14, 0x14, 0x14,// 3d = 
0x00, 0x41, 0x22, 0x14, 0x08,// 3e > 
0x02, 0x01, 0x51, 0x09, 0x06,// 3f ? 
0x32, 0x49, 0x79, 0x41, 0x3E,// 40 @ 
0x7E, 0x11, 0x11, 0x11, 0x7E,// 41 A 
0x7F, 0x49, 0x49, 0x49, 0x36,// 42 B 
0x3E, 0x41, 0x41, 0x41, 0x22,// 43 C 
0x7F, 0x41, 0x41, 0x22, 0x1C,// 44 D 
0x7F, 0x49, 0x49, 0x49, 0x41,// 45 E 
0x7F, 0x09, 0x09, 0x09, 0x01,// 46 F 
0x3E, 0x41, 0x49, 0x49, 0x7A,// 47 G 
0x7F, 0x08, 0x08, 0x08, 0x7F,// 48 H 
0x00, 0x41, 0x7F, 0x41, 0x00,// 49 I 
0x20, 0x40, 0x41, 0x3F, 0x01,// 4a J 
0x7F, 0x08, 0x14, 0x22, 0x41,// 4b K 
0x7F, 0x40, 0x40, 0x40, 0x40,// 4c L 
0x7F, 0x02, 0x0C, 0x02, 0x7F,// 4d M 
0x7F, 0x04, 0x08, 0x10, 0x7F,// 4e N 
0x3E, 0x41, 0x41, 0x41, 0x3E,// 4f O 
0x7F, 0x09, 0x09, 0x09, 0x06,// 50 P 
0x3E, 0x41, 0x51, 0x21, 0x5E,// 51 Q 
0x7F, 0x09, 0x19, 0x29, 0x46,// 52 R 
0x46, 0x49, 0x49, 0x49, 0x31,// 53 S 
0x01, 0x01, 0x7F, 0x01, 0x01,// 54 T 
0x3F, 0x40, 0x40, 0x40, 0x3F,// 55 U 
0x1F, 0x20, 0x40, 0x20, 0x1F,// 56 V 
0x3F, 0x40, 0x38, 0x40, 0x3F,// 57 W 
0x63, 0x14, 0x08, 0x14, 0x63,// 58 X 
0x07, 0x08, 0x70, 0x08, 0x07,// 59 Y 
0x61, 0x51, 0x49, 0x45, 0x43,// 5a Z 
0x00, 0x7F, 0x41, 0x41, 0x00,// 5b [ 
0x02, 0x04, 0x08, 0x10, 0x20,// 5c Yen Currency Sign 
0x00, 0x41, 0x41, 0x7F, 0x00,// 5d ]
0x04, 0x02, 0x01, 0x02, 0x04,// 5e ^ 
0x40, 0x40, 0x40, 0x40, 0x40,// 5f _ 
0x00, 0x01, 0x02, 0x04, 0x00,// 60 ` 
0x20, 0x54, 0x54, 0x54, 0x78,// 61 a 
0x7F, 0x48, 0x44, 0x44, 0x38,// 62 b 
0x38, 0x44, 0x44, 0x44, 0x20,// 63 c 
0x38, 0x44, 0x44, 0x48, 0x7F,// 64 d 
0x38, 0x54, 0x54, 0x54, 0x18,// 65 e 
0x08, 0x7E, 0x09, 0x01, 0x02,// 66 f 
0x0C, 0x52, 0x52, 0x52, 0x3E,// 67 g 
0x7F, 0x08, 0x04, 0x04, 0x78,// 68 h 
0x00, 0x44, 0x7D, 0x40, 0x00,// 69 i 
0x20, 0x40, 0x44, 0x3D, 0x00,// 6a j 
0x7F, 0x10, 0x28, 0x44, 0x00,// 6b k 
0x00, 0x41, 0x7F, 0x40, 0x00,// 6c l 
0x7C, 0x04, 0x18, 0x04, 0x78,// 6d m 
0x7C, 0x08, 0x04, 0x04, 0x78,// 6e n 
0x38, 0x44, 0x44, 0x44, 0x38,// 6f o 
0x7C, 0x14, 0x14, 0x14, 0x08,// 70 p 
0x08, 0x14, 0x14, 0x18, 0x7C,// 71 q 
0x7C, 0x08, 0x04, 0x04, 0x08,// 72 r 
0x08, 0x54, 0x54, 0x54, 0x20,// 73 s 
0x04, 0x3F, 0x44, 0x40, 0x20,// 74 t 
0x3C, 0x40, 0x40, 0x20, 0x7C,// 75 u 
0x1C, 0x20, 0x40, 0x20, 0x1C,// 76 v 
0x3C, 0x40, 0x30, 0x40, 0x3C,// 77 w 
0x44, 0x28, 0x10, 0x28, 0x44,// 78 x 
0x0C, 0x50, 0x50, 0x50, 0x3C,// 79 y 
0x44, 0x64, 0x54, 0x4C, 0x44,// 7a z 
0x00, 0x08, 0x36, 0x41, 0x00,// 7b < 
0x00, 0x00, 0x7F, 0x00, 0x00,// 7c | 
0x00, 0x41, 0x36, 0x08, 0x00,// 7d > 
0x10, 0x08, 0x08, 0x10, 0x08,// 7e Right Arrow -> 
0x78, 0x46, 0x41, 0x46, 0x78,// 7f Left Arrow <- 
0x00, 0x00, 0x00, 0x00, 0x00,// 80
0x00, 0x00, 0x5F, 0x00, 0x00,// 81
0x00, 0x07, 0x00, 0x07, 0x00,// 82
0x14, 0x7F, 0x14, 0x7F, 0x14,// 83
0x24, 0x2A, 0x7F, 0x2A, 0x12,// 84
0x23, 0x13, 0x08, 0x64, 0x62,// 85
0x36, 0x49, 0x55, 0x22, 0x50,// 86
0x00, 0x05, 0x03, 0x00, 0x00,// 87
0x00, 0x1C, 0x22, 0x41, 0x00,// 88
0x00, 0x41, 0x22, 0x1C, 0x00,// 89
0x14, 0x08, 0x3E, 0x08, 0x14,// 8A
0x08, 0x08, 0x3E, 0x08, 0x08,// 8B
0x00, 0x50, 0x30, 0x00, 0x00,// 8C
0x08, 0x08, 0x08, 0x08, 0x08,// 8D
0x00, 0x60, 0x60, 0x00, 0x00,// 8E
0x20, 0x10, 0x08, 0x04, 0x02,// 8F
0x00, 0x00, 0x00, 0x00, 0x00,// 90
0x00, 0x00, 0x5F, 0x00, 0x00,// 91
0x00, 0x07, 0x00, 0x07, 0x00,// 92
0x14, 0x7F, 0x14, 0x7F, 0x14,// 93
0x24, 0x2A, 0x7F, 0x2A, 0x12,// 94
0x23, 0x13, 0x08, 0x64, 0x62,// 95
0x36, 0x49, 0x55, 0x22, 0x50,// 96
0x00, 0x05, 0x03, 0x00, 0x00,// 97
0x00, 0x1C, 0x22, 0x41, 0x00,// 98 
0x00, 0x41, 0x22, 0x1C, 0x00,// 99
0x14, 0x08, 0x3E, 0x08, 0x14,// 9A
0x08, 0x08, 0x3E, 0x08, 0x08,// 9B
0x00, 0x50, 0x30, 0x00, 0x00,// 9C
0x08, 0x08, 0x08, 0x08, 0x08,// 9D
0x00, 0x60, 0x60, 0x00, 0x00,// 9E
0x20, 0x10, 0x08, 0x04, 0x02,// 9F
0x00, 0x00, 0x00, 0x00, 0x00,// A0
0x00, 0x00, 0x5F, 0x00, 0x00,// A1
0x00, 0x07, 0x00, 0x07, 0x00,// A2
0x14, 0x7F, 0x14, 0x7F, 0x14,// A3
0x24, 0x2A, 0x7F, 0x2A, 0x12,// A4
0x23, 0x13, 0x08, 0x64, 0x62,// A5
0x36, 0x49, 0x55, 0x22, 0x50,// A6
0x00, 0x05, 0x03, 0x00, 0x00,// A7
0x00, 0x1C, 0x22, 0x41, 0x00,// A8
0x00, 0x41, 0x22, 0x1C, 0x00,// A9
0x14, 0x08, 0x3E, 0x08, 0x14,// AA
0x08, 0x08, 0x3E, 0x08, 0x08,// AB
0x00, 0x50, 0x30, 0x00, 0x00,// AC
0x08, 0x08, 0x08, 0x08, 0x08,// AD
0x00, 0x60, 0x60, 0x00, 0x00,// AE
0x20, 0x10, 0x08, 0x04, 0x02,// AF
0x00, 0x06, 0x09, 0x09, 0x06,
0x00, 0x42, 0x7F, 0x40, 0x00,// B1
0x42, 0x61, 0x51, 0x49, 0x46,// B2
0x21, 0x41, 0x45, 0x4B, 0x31,// B3
0x18, 0x14, 0x12, 0x7F, 0x10,// B4
0x27, 0x45, 0x45, 0x45, 0x39,// B5
0x3C, 0x4A, 0x49, 0x49, 0x30,// B6
0x01, 0x71, 0x09, 0x05, 0x03,// B7
0x36, 0x49, 0x49, 0x49, 0x36,// B8
0x06, 0x49, 0x49, 0x29, 0x1E,// B9
0x00, 0x36, 0x36, 0x00, 0x00,// BA
0x00, 0x56, 0x36, 0x00, 0x00,// BB
0x08, 0x14, 0x22, 0x41, 0x00,// BC
0x14, 0x14, 0x14, 0x14, 0x14,// BD
0x00, 0x41, 0x22, 0x14, 0x08,// BE
0x02, 0x01, 0x51, 0x09, 0x06,// BF
0x7E, 0x11, 0x11, 0x11, 0x7E,// C0 А
0x7F, 0x49, 0x49, 0x49, 0x31,// C1 Б
0x7F, 0x49, 0x49, 0x49, 0x36,// C2 В
0x7F, 0x01, 0x01, 0x01, 0x03,// C3 Г
0x60, 0x3E, 0x21, 0x21, 0x7F,// C4 Д
0x7F, 0x49, 0x49, 0x49, 0x41,// C5 Е
0x77, 0x08, 0x7F, 0x08, 0x77,// C6 Ж
0x22, 0x41, 0x49, 0x49, 0x36,// C7 З
0x7F, 0x10, 0x08, 0x04, 0x7F,// C8 И
0x7F, 0x10, 0x09, 0x04, 0x7F,// C9 И
0x7F, 0x08, 0x14, 0x22, 0x41,// CA К
0x40, 0x3E, 0x01, 0x01, 0x7F,// CB Л
0x7F, 0x02, 0x0C, 0x02, 0x7F,// CC М
0x7F, 0x08, 0x08, 0x08, 0x7F,// CD Н
0x3E, 0x41, 0x41, 0x41, 0x3E,// CE О
0x7F, 0x01, 0x01, 0x01, 0x7F,// CF П
0x7F, 0x09, 0x09, 0x09, 0x06,// D0 Р
0x3E, 0x41, 0x41, 0x41, 0x22,// D1 С
0x01, 0x01, 0x7F, 0x01, 0x01,// D2 Т
0x27, 0x48, 0x48, 0x48, 0x3F,// D3 У
0x1E, 0x21, 0x7F, 0x21, 0x1E,// D4 Ф
0x63, 0x14, 0x08, 0x14, 0x63,// D5 Х
0x3F, 0x20, 0x20, 0x3F, 0x60,// D6 Ц
0x07, 0x08, 0x08, 0x08, 0x7F,// D7 Ч
0x7F, 0x40, 0x7F, 0x40, 0x7F,// D8 Ш
0x3F, 0x20, 0x3F, 0x20, 0x7F,// D9 Щ
0x01, 0x7F, 0x48, 0x48, 0x30,// DA Ъ
0x7F, 0x48, 0x30, 0x00, 0x7F,// DB Ы
0x00, 0x7F, 0x48, 0x48, 0x30,// DC Ь
0x22, 0x41, 0x49, 0x49, 0x3E,// DD Э
0x7F, 0x08, 0x3E, 0x41, 0x3E,// DE Ю
0x46, 0x29, 0x19, 0x09, 0x7F,// DF Я
0x20, 0x54, 0x54, 0x54, 0x78,// E0 а
0x3C, 0x4A, 0x4A, 0x4A, 0x30,// E1 б
0x7C, 0x54, 0x54, 0x28, 0x00,// E2 в
0x7C, 0x04, 0x04, 0x04, 0x04,// E3 г
0x60, 0x38, 0x24, 0x24, 0x7C,// E4 д
0x38, 0x54, 0x54, 0x54, 0x18,// E5 е
0x6C, 0x10, 0x7C, 0x10, 0x6C,// E6 ж
0x00, 0x44, 0x54, 0x54, 0x28,// E7 з
0x7C, 0x20, 0x10, 0x08, 0x7C,// E8 и
0x7C, 0x21, 0x12, 0x09, 0x7C,// E9 й
0x7C, 0x10, 0x28, 0x44, 0x00,// EA к
0x40, 0x38, 0x04, 0x04, 0x7C,// EB л
0x7C, 0x08, 0x10, 0x08, 0x7C,// EC м
0x7C, 0x10, 0x10, 0x10, 0x7C,// ED н
0x38, 0x44, 0x44, 0x44, 0x38,// EE о
0x7C, 0x04, 0x04, 0x04, 0x7C,// EF п
0x7C, 0x14, 0x14, 0x14, 0x08,// F0 р
0x38, 0x44, 0x44, 0x44, 0x00,// F1 с
0x04, 0x04, 0x7C, 0x04, 0x04,// F2 т
0x0C, 0x50, 0x50, 0x50, 0x3C,// F3 у
0x08, 0x14, 0x7C, 0x14, 0x08,// F4 ф
0x44, 0x28, 0x10, 0x28, 0x44,// F5 х
0x3C, 0x20, 0x20, 0x3C, 0x60,// F6 ц
0x0C, 0x10, 0x10, 0x10, 0x7C,// F7 ч
0x7C, 0x40, 0x7C, 0x40, 0x7C,// F8 ш
0x3C, 0x20, 0x3C, 0x20, 0x7C,// F9 щ
0x04, 0x7C, 0x50, 0x50, 0x20,// FA ъ
0x7C, 0x50, 0x20, 0x00, 0x7C,// FB ы
0x00, 0x7C, 0x50, 0x50, 0x20,// FC ь
0x28, 0x44, 0x54, 0x54, 0x38,// FD э
0x7C, 0x10, 0x38, 0x44, 0x38,// FE ю
0x48, 0x54, 0x34, 0x14, 0x7C // FF я
};


#endif  //  _NOKIALCD_H_ 



static void LcdSend    ( byte data, LcdCmdData cd );
static void Delay      ( void );

/*--------------------------------------------------------------------------------------------------

Инициализация дисплея 

--------------------------------------------------------------------------------------------------*/
void LcdInit ( void )
{
    	//  Pull-up on reset pin.
    	PORTB |= LCD_RST_PIN;

    	//  Set output bits on port B.
    	DDRB |= LCD_RST_PIN | LCD_DC_PIN | LCD_CE_PIN | SPI_MOSI_PIN | SPI_CLK_PIN;

    	Delay();
    
	//  Toggle display reset pin.
    	PORTB &= ~LCD_RST_PIN;
    	
	Delay();
    	
	PORTB |= LCD_RST_PIN;
    	
	//  Enable SPI port: No interrupt, MSBit first, Master mode, CPOL->0, CPHA->0, Clk/4
    	SPCR = 0x50;
    	
	//  Disable LCD controller
    	PORTB |= LCD_CE_PIN;

    	LcdSend( 0x21, LCD_CMD );  // LCD Extended Commands.
    	LcdSend( 0xC5, LCD_CMD );  // Set LCD Vop (Contrast).
    	LcdSend( 0x06, LCD_CMD );  // Set Temp coefficent.
    	LcdSend( 0x13, LCD_CMD );  // LCD bias mode 1:48.
    	LcdSend( 0x20, LCD_CMD );  // LCD Standard Commands, Horizontal addressing mode.
    	LcdSend( 0x0C, LCD_CMD );  // LCD in normal mode.

    	ClearLcd();
}



/*--------------------------------------------------------------------------------------------------

Очистка дисплея 

--------------------------------------------------------------------------------------------------*/

void ClearLcd(void)
{
	int col, page;
	byte myPageAddr;

	for(page = 0; page < LCD_Y_RES; page++)
	{
		myPageAddr = (page | 0x40);
		LcdSend( myPageAddr, LCD_CMD );
		LcdSend( 0x80, LCD_CMD );
		for (col = 0; col < LCD_X_RES; col++)
			LcdSend( 0x00, LCD_DATA );
	}
}

/*--------------------------------------------------------------------------------------------------

Отправка байта 

--------------------------------------------------------------------------------------------------*/
static void LcdSend ( byte data, LcdCmdData cd )
{
    //  Enable display controller (active low).
    PORTB &= ~LCD_CE_PIN;

    if ( cd == LCD_DATA )
    {
        PORTB |= LCD_DC_PIN;
    }
    else
    {
        PORTB &= ~LCD_DC_PIN;
    }

    //  Send data to display controller.
    SPDR = data;

    //  Wait until Tx register empty.
    while ( (SPSR & 0x80) != 0x80 );
    

    //  Disable display controller.
    PORTB |= LCD_CE_PIN;
}

/*--------------------------------------------------------------------------------------------------

Вывести строку (строка, коорд. Х (0..84), линия (1..6)

--------------------------------------------------------------------------------------------------*/

 void LcdPutLine(byte *data, byte x, byte line)
{
	int i;
	byte myXAddr;
	byte myPageAddr;
	byte ch;
        
	myXAddr = (x-1 | 0x80);
	myPageAddr = (line-1 | 0x40);
	
	LcdSend( myXAddr, LCD_CMD );
	LcdSend( myPageAddr, LCD_CMD );

	while (*data)
	{
		for(i=0; i<5; i++)
		{
			ch = FontLookup[*data - 32][i] << 1;
			LcdSend( ch, LCD_DATA );
			if(i == 4)
			{
				LcdSend( 0x00, LCD_DATA );
			}

		}
		data++;
	}
}  




/*-----------------------------------------------------------------------

Вывести картинку

-----------------------------------------------------------------------*/
void LcdDrawBitmap( void /* unsigned char* bitmap */)   
{
        int col, page;        
	//byte myXAddr;
	byte myPageAddr;
	for(page = 0; page < LCD_Y_RES; page++)
	{
		myPageAddr = (page | 0x40);
		LcdSend( myPageAddr, LCD_CMD );
		LcdSend( 0x80, LCD_CMD );
		//for (col = 0; col < LCD_X_RES; col++)
			//LcdSend( my[page * LCD_X_RES + col], LCD_DATA);
	}
}



/*--------------------------------------------------------------------------------------------------

Delay

--------------------------------------------------------------------------------------------------*/

static void Delay ( void )
{
    int i;

    for ( i = -32000; i < 32000; i++ );
}





