/*****************************************************
Chip type           : ATmega8
Clock frequency     : 4,000000 MHz
*****************************************************/


#include <mega8.h>
#include <delay.h>
#include <spi.h>   
#include <stdlib.h>
#define RES PORTB.4
#define DC PORTB.0

void lcd_clear(void);
const char table[455] = {
     0x00, 0x00, 0x00, 0x00, 0x00 ,  // sp
     0x00, 0x00, 0x2f, 0x00, 0x00 ,   // !
     0x00, 0x07, 0x00, 0x07, 0x00 ,   // "
     0x14, 0x7f, 0x14, 0x7f, 0x14 ,   // #
     0x24, 0x2a, 0x7f, 0x2a, 0x12 ,   // $
     0xc4, 0xc8, 0x10, 0x26, 0x46 ,   // %
     0x36, 0x49, 0x55, 0x22, 0x50 ,   // &
     0x00, 0x05, 0x03, 0x00, 0x00 ,   // '
     0x00, 0x1c, 0x22, 0x41, 0x00 ,   // (
     0x00, 0x41, 0x22, 0x1c, 0x00 ,   // )
     0x14, 0x08, 0x3E, 0x08, 0x14 ,   // *
     0x08, 0x08, 0x3E, 0x08, 0x08 ,   // +
     0x00, 0x00, 0x50, 0x30, 0x00 ,   // ,
     0x10, 0x10, 0x10, 0x10, 0x10 ,   // -
     0x00, 0x60, 0x60, 0x00, 0x00 ,   // .
     0x20, 0x10, 0x08, 0x04, 0x02 ,   // /
     0x3E, 0x51, 0x49, 0x45, 0x3E ,   // 0
     0x00, 0x42, 0x7F, 0x40, 0x00 ,   // 1
     0x42, 0x61, 0x51, 0x49, 0x46 ,   // 2
     0x21, 0x41, 0x45, 0x4B, 0x31 ,   // 3
     0x18, 0x14, 0x12, 0x7F, 0x10 ,   // 4
     0x27, 0x45, 0x45, 0x45, 0x39 ,   // 5
     0x3C, 0x4A, 0x49, 0x49, 0x30 ,   // 6
     0x01, 0x71, 0x09, 0x05, 0x03 ,   // 7
     0x36, 0x49, 0x49, 0x49, 0x36 ,   // 8
     0x06, 0x49, 0x49, 0x29, 0x1E ,   // 9
     0x00, 0x36, 0x36, 0x00, 0x00 ,   // :
     0x00, 0x56, 0x36, 0x00, 0x00 ,   // ;
     0x08, 0x14, 0x22, 0x41, 0x00 ,   // <
     0x14, 0x14, 0x14, 0x14, 0x14 ,   // =
     0x00, 0x41, 0x22, 0x14, 0x08 ,   // >
     0x02, 0x01, 0x51, 0x09, 0x06 ,   // ?
     0x32, 0x49, 0x59, 0x51, 0x3E ,   // @
     0x7E, 0x11, 0x11, 0x11, 0x7E ,   // A
     0x7F, 0x49, 0x49, 0x49, 0x36 ,   // B
     0x3E, 0x41, 0x41, 0x41, 0x22 ,   // C
     0x7F, 0x41, 0x41, 0x22, 0x1C ,   // D
     0x7F, 0x49, 0x49, 0x49, 0x41 ,   // E
     0x7F, 0x09, 0x09, 0x09, 0x01 ,   // F
     0x3E, 0x41, 0x49, 0x49, 0x7A ,   // G
     0x7F, 0x08, 0x08, 0x08, 0x7F ,   // H
     0x00, 0x41, 0x7F, 0x41, 0x00 ,   // I
     0x20, 0x40, 0x41, 0x3F, 0x01 ,   // J
     0x7F, 0x08, 0x14, 0x22, 0x41 ,   // K
     0x7F, 0x40, 0x40, 0x40, 0x40 ,   // L
     0x7F, 0x02, 0x0C, 0x02, 0x7F ,   // M
     0x7F, 0x04, 0x08, 0x10, 0x7F ,   // N
     0x3E, 0x41, 0x41, 0x41, 0x3E ,   // O
     0x7F, 0x09, 0x09, 0x09, 0x06 ,   // P
     0x3E, 0x41, 0x51, 0x21, 0x5E ,   // Q
     0x7F, 0x09, 0x19, 0x29, 0x46 ,   // R
     0x46, 0x49, 0x49, 0x49, 0x31 ,   // S
     0x01, 0x01, 0x7F, 0x01, 0x01 ,   // T
     0x3F, 0x40, 0x40, 0x40, 0x3F ,   // U
     0x1F, 0x20, 0x40, 0x20, 0x1F ,   // V
     0x3F, 0x40, 0x38, 0x40, 0x3F ,   // W
     0x63, 0x14, 0x08, 0x14, 0x63 ,   // X
     0x07, 0x08, 0x70, 0x08, 0x07 ,   // Y
     0x61, 0x51, 0x49, 0x45, 0x43 ,   // Z
     0x00, 0x7F, 0x41, 0x41, 0x00 ,   // [
     0x55, 0x2A, 0x55, 0x2A, 0x55 ,   // 55
     0x00, 0x41, 0x41, 0x7F, 0x00 ,   // ]
     0x04, 0x02, 0x01, 0x02, 0x04 ,   // ^
     0x40, 0x40, 0x40, 0x40, 0x40 ,   // _
     0x00, 0x01, 0x02, 0x04, 0x00 ,   // '
     0x20, 0x54, 0x54, 0x54, 0x78 ,   // a
     0x7F, 0x48, 0x44, 0x44, 0x38 ,   // b
     0x38, 0x44, 0x44, 0x44, 0x20 ,   // c
     0x38, 0x44, 0x44, 0x48, 0x7F ,   // d
     0x38, 0x54, 0x54, 0x54, 0x18 ,   // e
     0x08, 0x7E, 0x09, 0x01, 0x02 ,   // f
     0x0C, 0x52, 0x52, 0x52, 0x3E ,   // g
     0x7F, 0x08, 0x04, 0x04, 0x78 ,   // h
     0x00, 0x44, 0x7D, 0x40, 0x00 ,   // i
     0x20, 0x40, 0x44, 0x3D, 0x00 ,   // j
     0x7F, 0x10, 0x28, 0x44, 0x00 ,   // k
     0x00, 0x41, 0x7F, 0x40, 0x00 ,   // l
     0x7C, 0x04, 0x18, 0x04, 0x78 ,   // m
     0x7C, 0x08, 0x04, 0x04, 0x78 ,   // n
     0x38, 0x44, 0x44, 0x44, 0x38 ,   // o
     0x7C, 0x14, 0x14, 0x14, 0x08 ,   // p
     0x08, 0x14, 0x14, 0x18, 0x7C ,   // q
     0x7C, 0x08, 0x04, 0x04, 0x08 ,   // r
     0x48, 0x54, 0x54, 0x54, 0x20 ,   // s
     0x04, 0x3F, 0x44, 0x40, 0x20 ,   // t
     0x3C, 0x40, 0x40, 0x20, 0x7C ,   // u
     0x1C, 0x20, 0x40, 0x20, 0x1C ,   // v
     0x3C, 0x40, 0x30, 0x40, 0x3C ,   // w
     0x44, 0x28, 0x10, 0x28, 0x44 ,   // x
     0x0C, 0x50, 0x50, 0x50, 0x3C ,   // y
     0x44, 0x64, 0x54, 0x4C, 0x44     // z   
     
     };

void port(void)
{        
#asm("cli");

DDRB=0x2D;

ACSR=0x80;
SFIOR=0x00;

#asm("sei");
}   
void writedata(char data){
DC = 1;
spi(data);
}
void writecomm(char comm){
DC = 0;
spi(comm);
}
void lcd_init(void){
RES=0;       
delay_ms(1);       
RES=1;       
delay_ms(1); 
SPCR=0x50;       
SPSR=0x01;           
writecomm(0x21); 
writecomm(0xC8);
writecomm(0x06);  
writecomm(0x13); 
writecomm(0x20); 
writecomm(0x0C);

} 
void lcd_gotoxy(char x, char y){
writecomm((0x40|y));   // Y axis 
writecomm((0x80|x));   // X axis
}
void lcd_clear(void){
unsigned int i;
lcd_gotoxy(0,0);
for(i = 505; i > 0; i--){writedata(0x00);};
}
void putchar(char character)
{
	int tablept, count, char_column;
	if ((character<0x20)||(character>0x7f)) {return;}		      
	tablept = ((5*character) - 160);					

	for (count=5;count>0;count--)							
	{
		char_column = table[tablept];
		writedata(char_column);
		tablept++;
	}
	writedata(0x00);										
}
void putstr(const char *s)
{
	while(*s) {putchar(*s++);}								
}
void main(void){
int i;
char a0[] = "NOKIA LCD";
port();
lcd_init();
lcd_clear();
lcd_gotoxy(15,0); 
putstr(a0);
delay_ms(100);
while(i<85){
lcd_gotoxy(i,3);
writedata(90);
delay_ms(100);
i++;
}
while (1)
      {
      
      };
}

