////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
Nokia 6610 graphical colour LCD routines 
CCS compiler

TechDesign Electronics (c) September 2007. 

www.techdesign.be
info@techdesign.be


#bit cnok_sck 	=pa.1		// o --> (to lcd) 
#bit cnok_di 	=pa.2		// o --> di (to lcd)
#bit cnok_cs 	=pa.3		// o --> (to lcd) 
#bit cnok_res 	=pa.4		// o --> (to lcd) 
#bit cnok_do 	=pa.5		// i <-- do (from lcd)



*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

BYTE CONST SPRITES[240]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,	// nr.5: blue, gps pos
						0x00,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
						0x00,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
						0x00,0x0f,0xff,0x00,0x0f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
						0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xf0,0x00,0x00,0x00,0x00,

						0x0f,0x00,0xf0,0x0f,0x0f,0xff,0x0f,0x00,0xf0,0x0f,0x00,0xf0,	// nr.6: green, ok
						0x0f,0x00,0xf0,0xff,0xf0,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,
						0x0f,0x0f,0xff,0xff,0xf0,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,
						0x0f,0x00,0xf0,0x0f,0x0f,0xff,0xff,0xf0,0xf0,0x0f,0x00,0xf0,
						0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x0f,0xff,0xff,0xf0,0xf0,

						0xff,0xf0,0x0f,0xff,0xf0,0x0f,0xff,0xf0,0x0f,0xff,0xf0,0x0f,	// nr.7: white/red, roadworks
						0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,
						0xff,0xf0,0x0f,0xff,0xf0,0x0f,0xff,0xf0,0x0f,0xff,0xf0,0x0f,
						0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,
						0xff,0xf0,0x0f,0xff,0xf0,0x0f,0xff,0xf0,0x0f,0xff,0xf0,0x0f,

						0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,	// nr.8, red, danger
						0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,
						0x00,0xf0,0x0f,0xff,0xf0,0x0f,0xff,0xff,0xff,0xff,0xf0,0x0f,
						0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,
						0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f,0x00,0xf0,0x0f};

		



int8 cnokia_contrast;
int8 cnokia_xxx,cnokia_yyy;
int16 tFcolour, tBcolour;

void cnokia_write(short cnokia_dc, char cnokia_data);		// data=1	// command=0

void cnokia_init(void);
void cnokia_cls(void);

void cnokia_gotoxy(int8 cnokia_x, int8 cnokia_y);
void cnokia_pixelxy(int16 cnokia_color, int8 cnokia_xx, int8 cnokia_yy);
void cnokia_drawlinexy(int8 style, int16 cnokia_color1,int16 cnokia_color2, int16 cnokia_x1, int16 cnokia_x2, int16 cnokia_y1, int16 cnokia_y2);

void cnokia_printchar(byte cvar);
void table_to_cnokia(void);

void cnokia_printsprite(int8 sprite);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_write(short cnokia_dc, char cnokia_data)
{
int8 s;

cnok_cs=0;
cnok_sck=0;
cnok_di=cnokia_dc;
cnok_sck=1;


for (s=7;s!=255;s--){
					cnok_sck=0;
					cnok_di=bit_test(cnokia_data,s);
					cnok_sck=1;
					}

cnok_cs=1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_init(void)
{
cnok_res=0;
delay_ms(100);
cnok_res=1;
delay_ms(100);

cnokia_write(0,0x11);	// SLEEPOUT
cnokia_write(0,0x20);	// INVON

cnokia_write(0,0x3a);	// COLMOD
cnokia_write(1,0x03);	// 0x03= 12bits

cnokia_write(0,0x36);	// MADCTL
cnokia_write(1,0x08);	// mirror xy, reverse RGB

cnokia_write(0,0x25);	// SETCON

cnokia_write(1,cnokia_contrast);	// set contrast was 0x30

delay_ms(100);

cnokia_write(0,0x29);	// DISPON

//cnokia_write(0,0x23);	// DAL all pixels on
//delay_ms(1000);
//cnokia_write(0,0x22);	// DALO all pixels off

cnokia_cls();

//cnokia_write(0,0x23);	// DAL

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_cls(void)
{
int16 xe;
//char fx,fy;


cnokia_write(0,0x36);	// MADCTL
cnokia_write(1,0xa8);	// mirror xy, reverse RGB


cnokia_write(0,0x2a);	// column address CASET
cnokia_write(1,0);	// 
cnokia_write(1,131);	// 

cnokia_write(0,0x2b);	// row address PASET
cnokia_write(1,0);	// 
cnokia_write(1,131);	// 

cnokia_write(0,0x2c);	// RAMWR

// 132*132/2= 8712 pixels
for (xe=0;xe<8712;xe++){		// white 0xfff	// black 0x000
						cnokia_write(1,0xaa);
						cnokia_write(1,0xaa);
						cnokia_write(1,0xaa);
						}


cnokia_write(0,0x00);	// NOP


/*

cnokia_write(0,0x2b);	// row address PASET
cnokia_write(1,0);	// 
cnokia_write(1,131);	// 

cnokia_write(0,0x2a);	// column address CASET
cnokia_write(1,0);	// 
cnokia_write(1,131);	// 


cnokia_write(0,0x2c);	// RAMWR
*/



////
/*

cnokia_gotoxy(20,40);
printf(cnokia_printchar,"044 - TMC Receiver");




cnokia_gotoxy(1,1);
printf(cnokia_printchar,"Techdesign Electronics");



//cnokia_printchar('t');
*/
////


/*
cnokia_drawlinexy(1,0x000,0x00f,15,25,95,100);	//red
cnokia_drawlinexy(2,0x000,0x00f,15,25,100,105);	//red


cnokia_drawlinexy(1,0x000,0x0ff,25,15,85,80);	//yellow
cnokia_drawlinexy(2,0x000,0x0ff,25,15,75,70);	//yellow





cnokia_drawlinexy(2,0x000,0x0f0,2,125,10,2);	//green
cnokia_drawlinexy(2,0x000,0xa6f,125,2,110,60);	//pink
cnokia_drawlinexy(2,0x000,0x0f0,0,132,130,40);	//green
cnokia_drawlinexy(2,0x000,0xf00,90,75,120,90);	//blue
cnokia_drawlinexy(2,0x000,0xfff,30,45,0,80);	//white
cnokia_drawlinexy(2,0x000,0x0af,100,80,0,50);	//orange
cnokia_drawlinexy(2,0x000,0xf0f,0,20,70,50);	//magenta

sleep();
*/


/*
cnokia_drawlinexy(2,0x000,0xfff,0,80,100,120);	//

cnokia_drawlinexy(2,0x000,0x00f,80,0,120,100);	//

/*



cnokia_gotoxy(1,1);
tFcolour=0xfff;tBcolour=0x0cf;
printf(cnokia_printchar,"TechDesign Electronics");


cnokia_gotoxy(15,120);
cnokia_printsprite(0);

cnokia_gotoxy(25,120);
cnokia_printsprite(1);

cnokia_gotoxy(35,120);
cnokia_printsprite(2);

cnokia_gotoxy(45,120);
cnokia_printsprite(3);
*/

/*
fy=9;tBcolour=0x000;
while(fy<133){

	for(fx=1;fx<133;fx+=1){
						cnokia_gotoxy(fx,fy);
						printf(cnokia_printchar," ");
						tBcolour+=2;
							}
	fy+=8;
				}
*/

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_gotoxy(int8 cnokia_x, int8 cnokia_y)
{
//printf(" **** cnokia_x=%u ",cnokia_x);
//printf(" cnokia_y=%u **** ",cnokia_y);

cnokia_xxx=cnokia_x;
cnokia_yyy=cnokia_y;

cnokia_write(0,0x2a);	// column address CASET
cnokia_write(1,cnokia_xxx);	// 
cnokia_write(1,cnokia_xxx);	// 

cnokia_write(0,0x2b);	// row address PASET
cnokia_write(1,cnokia_yyy);	// 
cnokia_write(1,cnokia_yyy);	// 


}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_pixelxy(int16 cnokia_color, int8 cnokia_xx, int8 cnokia_yy)
{
int16 green_red, blue;

//printf(" **** cnokia_xx=%u ",cnokia_xx);
//printf(" cnokia_yy=%u **** ",cnokia_yy);

cnokia_write(0,0x36);	// MADCTL
cnokia_write(1,0x88);	// mirror y, reverse RGB


cnokia_gotoxy(cnokia_xx,cnokia_yy);
//
blue= cnokia_color&0x000f;
blue<<=4;
cnokia_color>>=4;
green_red= cnokia_color&0x00ff;

//

cnokia_write(0,0x2c);	// RAMWR

cnokia_write(1,(int8)green_red);
cnokia_write(1,(int8)blue);



cnokia_write(0,0x00);	// NOP

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_drawlinexy(int8 style, int16 cnokia_color1, int16 cnokia_color2, int16 cnokia_x1, int16 cnokia_x2, int16 cnokia_y1, int16 cnokia_y2)
{
signed int16 dy,dx;
signed int16 stepx, stepy,fraction;
char previous='-';

dy = cnokia_y2 - cnokia_y1;
dx = cnokia_x2 - cnokia_x1;

if (dy < 0) { dy = -dy;  stepy = -1; } else { stepy = 1; }
if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
dy <<= 1;							// dy is now 2*dy
dx <<= 1;							// dx is now 2*dx


//printf(" *p+* ");
cnokia_pixelxy(cnokia_color1,cnokia_x1, cnokia_y1);

if (dx > dy) {


	if(style>1){
	       if(cnokia_x2<cnokia_x1){
								//printf(" *a-* ");
								cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1-1);
								cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1-2);
								}
		else if(cnokia_x2>cnokia_x1){
								//printf(" *b-* ");
								cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1+1);
								cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1+2);
									}
		else if(cnokia_x2==cnokia_x1){
								//printf(" *c-* ");



									}


				}



    fraction = dy - (dx >> 1);	// same as 2*dy - dx
    while (cnokia_x1 != cnokia_x2) {


				        if (fraction >= 0) {
								            cnokia_y1 += stepy;
								            fraction -= dx;			// same as fraction -= 2*dx
				       						 }
				        cnokia_x1 += stepx;
				        fraction += dy;				// same as fraction -= 2*dy
						cnokia_pixelxy(cnokia_color1,cnokia_x1, cnokia_y1);
						if(style>1){
					        if(cnokia_x2<cnokia_x1){
													//printf(" *a* ");
													previous='a';
													cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1-1);
													cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1-2);
													}
							else if(cnokia_x2>cnokia_x1){
													//printf(" *b* ");
													previous='b';
													cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1+1);
													cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1+2);
														}
							else if(cnokia_x2==cnokia_x1){
													//printf(" *c* ");
													if(previous=='a'){
																	cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1-1);
																	cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1-2);
																	}
													else if(previous=='b'){
																	cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1+1);
																	cnokia_pixelxy(cnokia_color2,cnokia_x1, cnokia_y1+2);
																	}

														}

									}

   									 }
			} 
else {

	if(style>1){
		if(cnokia_y2<cnokia_y1){
								//printf(" *d-* ");
								cnokia_pixelxy(cnokia_color2, cnokia_x1+1, cnokia_y1);
								cnokia_pixelxy(cnokia_color2, cnokia_x1+2, cnokia_y1);
								}
	    else if(cnokia_y2>cnokia_y1){
								//printf(" *e-* ");
								cnokia_pixelxy(cnokia_color2, cnokia_x1-1, cnokia_y1);
								cnokia_pixelxy(cnokia_color2, cnokia_x1-2, cnokia_y1);
									}
	else if(cnokia_y2==cnokia_y1){
								//printf(" *f-* ");

									}

				}



    fraction = dx - (dy >> 1);
    while (cnokia_y1 != cnokia_y2) {


				        if (fraction >= 0) {
								            cnokia_x1 += stepx;
								            fraction -= dy;
				       						 }
				        cnokia_y1 += stepy;
				        fraction += dx;

						cnokia_pixelxy(cnokia_color1,cnokia_x1, cnokia_y1);
						if(style>1){
							if(cnokia_y2<cnokia_y1){
													//printf(" *d* ");
													previous='d';
													cnokia_pixelxy(cnokia_color2, cnokia_x1+1, cnokia_y1);
													cnokia_pixelxy(cnokia_color2, cnokia_x1+2, cnokia_y1);
													}
					        else if(cnokia_y2>cnokia_y1){
													//printf(" *e* ");
													previous='e';
													cnokia_pixelxy(cnokia_color2, cnokia_x1-1, cnokia_y1);
													cnokia_pixelxy(cnokia_color2, cnokia_x1-2, cnokia_y1);
														}
							else if(cnokia_y2==cnokia_y1){
														//printf(" *f* ");
														if(previous=='d'){
																	cnokia_pixelxy(cnokia_color2, cnokia_x1+1, cnokia_y1);
																	cnokia_pixelxy(cnokia_color2, cnokia_x1+2, cnokia_y1);
																			}
														else if(previous=='e'){
																	cnokia_pixelxy(cnokia_color2, cnokia_x1-1, cnokia_y1);
																	cnokia_pixelxy(cnokia_color2, cnokia_x1-2, cnokia_y1);
																				}
														}

									}

   									 }
		}


}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_printchar(byte cvar)					// Write 1 character to LCD 
{
cnokia_write(0,0x36);	// MADCTL
cnokia_write(1,0xa8);	// mirror xy, reverse RGB


cnokia_write(0,0x2a);	// column address CASET
cnokia_write(1,cnokia_yyy);	// 
cnokia_write(1,cnokia_yyy+7);	// 

cnokia_write(0,0x2b);	// row address PASET
cnokia_write(1,cnokia_xxx);	// 
cnokia_write(1,cnokia_xxx+5);	// 

cnokia_write(0,0x2c);	// RAMWR

charsele=cvar;
table_to_cnokia();


cnokia_xxx+=6;

cnokia_write(0,0x00);	// NOP

//cnokia_write(0,0x36);	// MADCTL
//cnokia_write(1,0x08);	// mirror xy, reverse RGB

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void table_to_cnokia(void)	// extract ascii from tables & write to LCD
{
int8 s;
int8 usb,msb,msb1,msb2,lsb;
int16 Lusb,Lmsb1,Lmsb2,Llsb;

//printf(" charsele=%x ",charsele);

//int16 tFcolour, tBcolour;

if (charsele<0x20)return;
else if (charsele>0x7f){ascii_extended_corr();}

if (charsele<0x20)return;
if (charsele>0xa6)return;

for (charrow=0;charrow<5;charrow++) {		// 5 bytes
	
if (charsele<0x50){charposi=(((charsele&0xff)-0x20)*5);chardat=TABLE7[(charposi+charrow)];}						// use TABLE7
else if (charsele<0x80){charposi=(((charsele&0xff)-0x50)*5);chardat=TABLE8[(charposi+charrow)];}				// use TABLE8							
else if (charsele<0xa7){charposi=(((charsele&0xff)-0x80)*5);chardat=TABLE9[(charposi+charrow)]; }				// use TABLE9							
		
	
	for(s=7;s!=255;s-=2){


						Lusb=((tBcolour&0x0ff0)>>4);
						Lmsb1=((tBcolour&0x000f)<<4);
						Lmsb2=((tBcolour&0x0f00)>>8);
						Llsb=(tBcolour&0x00ff);

						//usb=0xff;msb1=0xf0;msb2=0x0f;lsb=0xff;
						//if(bit_test(chardat,s)==1){usb=0xaa;msb1=0xa0;}
						//if(bit_test(chardat,s-1)==1){lsb=0xaa;msb2=0x0a;}

						if(bit_test(chardat,s)==1){Lusb=((tFcolour&0x0ff0)>>4);Lmsb1=((tFcolour&0x000f)<<4);}
						if(bit_test(chardat,s-1)==1){Llsb=(tFcolour&0x00ff);Lmsb2=((tFcolour&0x0f00)>>8);}

						usb=(int8)Lusb;	
						msb1=(int8)Lmsb1;	
						msb2=(int8)Lmsb2;
						lsb=(int8)Llsb;	
			
						cnokia_write(1,usb);				// send data to nokia	
						cnokia_write(1,(msb1|msb2));
						cnokia_write(1,lsb);


						}

									}

	//for(s=0;s!=12;s++){cnokia_write(1,0xaa);}					// 	(always blank)


	usb=(tBcolour>>4);
	msb=((tBcolour&0x0f)<<4)|(tBcolour>>8);
	lsb=tBcolour;

	for(s=0;s!=4;s++){
						cnokia_write(1,usb);				// background (blank)	
						cnokia_write(1,msb);
						cnokia_write(1,lsb);
						}

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void cnokia_printsprite(int8 sprite)					// Write 1 sprite to LCD 
{
char i;


cnokia_write(0,0x36);	// MADCTL
cnokia_write(1,0xa8);	// mirror xy, reverse RGB


cnokia_write(0,0x2a);	// column address CASET
cnokia_write(1,cnokia_yyy);	// 
cnokia_write(1,cnokia_yyy+7);	// 

cnokia_write(0,0x2b);	// row address PASET
cnokia_write(1,cnokia_xxx);	// 
cnokia_write(1,cnokia_xxx+5);	// 

cnokia_write(0,0x2c);	// RAMWR

//charsele=cvar;
//table_to_cnokia();
for(i=0;i!=60;i++){cnokia_write(1,SPRITES[(sprite*60)+i]);}

cnokia_xxx+=6;

cnokia_write(0,0x00);	// NOP

cnokia_write(0,0x36);	// MADCTL
cnokia_write(1,0x08);	// mirror xy, reverse RGB

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
