unsigned char colors[]= {
0b00011111, 0b11100011, 0b11111100, 0b00000011, 0b11100000, 0b11111111, 0b00000000
};

enum color_numbers{
red,green,blue,yellow,sky,black,white
};

/*
#define red 0b00011111
#define green 0b11100011
#define blue 0b11111100
#define yellow 0b00000011
#define sky 0b11100000
#define black  0xff
#define white 0x00
*/

#define CMD    0
#define DATA   1

void send(unsigned char nokia_data, unsigned char cd);
void nokia_cs(void);

void nokia_printchar(unsigned char caracter);
void PrintByte(unsigned char bytefornokia);
void nokia_outs(unsigned char * s, unsigned char x, unsigned char y);
void nokia_senddata(unsigned char nokia_data);
void clear_screen(unsigned char fondo);

unsigned char c;
unsigned char bgcolor=red;
unsigned char fgcolor=black;


////////////////////////////////////////////////////////////////////////////////
// We need two tables for converting ASCII graphics pixels
// 5 Bytes per character.
// We use two tables because we have 96 columns x 5 bytes = 480 bytes
// And we can only have 255 bytes tables
// F1-? -> 0xFC,0x09,0x05,0x05,0xF8
// D1-? ->

const unsigned char ASCII_TABLE1 [240]={
                  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


const unsigned char ASCII_TABLE2 [250]={
                  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
                  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
                  0x48,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
                  0x78,0x46,0x41,0x46,0x78,  // 7F
                  0x7C,0x09,0x05,0x05,0x78,  // 80 -> ?
                  0x7E,0x05,0x09,0x11,0x7E   // 81 -> ?
                  };


void nokiacolorinit(void)
   {
   unsigned int16 i;
       
   output_low(SCLK);
   output_low(SDATA);
   output_low(CS);
   output_low(RESET);

   delay_ms(250);

   // LCD Hardware Reset
   output_bit(RESET,0);
   delay_ms(5);
   output_bit(RESET,1);

   output_bit(CS,1);
   output_bit(SCLK,1);
   output_bit(SDATA,1);

   send(0x01, CMD);      // LCD Software Reset
   nokia_cs();
   delay_ms(5);

   send(0xC6, CMD);      // Initial Escape
   nokia_cs();

   send(0xB9, CMD);      // Refresh set
   send(0x00, DATA);
   nokia_cs();

   send(0xB6, CMD);      // Display Control
   send(128, DATA);
   send(128, DATA);
   send(129, DATA);
   send(84, DATA);
   send(69, DATA);
   send(82, DATA);
   send(67, DATA);
   nokia_cs();

   send(0xB3, CMD);      // Gray Scale Position
   send(1, DATA);
   send(2, DATA);
   send(4, DATA);
   send(8, DATA);
   send(16, DATA);
   send(30, DATA);
   send(40, DATA);
   send(50, DATA);
   send(60, DATA);
   send(70, DATA);
   send(80, DATA);
   send(90, DATA);
   send(100, DATA);
   send(110, DATA);
   send(127, DATA);
   nokia_cs();

   send(0x2D, CMD);      // COLOUR SET  (RGBSET)

   send(0, DATA);
   send(3, DATA);
   send(5, DATA);
   send(7, DATA);
   send(9, DATA);
   send(11, DATA);
   send(13, DATA);
   send(15, DATA);

   send(0, DATA);
   send(3, DATA);
   send(5, DATA);
   send(7, DATA);
   send(9, DATA);
   send(11, DATA);
   send(13, DATA);
   send(15, DATA);

   send(0, DATA);
   send(3, DATA);
   send(9, DATA);
   send(15, DATA);

   nokia_cs();

   send(0xB5, CMD);           // Gamma Curve Set
   send(1, DATA);
   nokia_cs();

   send(0xBE, CMD);           // Power Control
   send(4, DATA);
   nokia_cs();

   send(0x11, CMD);           // Sleep out
   nokia_cs();

   send(0xB7, CMD);           // Temperature gradient set
   for(i=0; i<14; i++)   send(0, DATA);
   nokia_cs();

   send(0x03, CMD);           // Booster Voltage ON
   nokia_cs();
   delay_ms(40);

   send(0x20, CMD);           // Invert colors off
   nokia_cs();

   send(0x25, CMD);           // Write contrast
   send(63, DATA);           // was 63
   nokia_cs();

   send(0x36, CMD);           // Memory access control
   send(0b00100000, DATA);   // TOPBUTTOM, LEFTRIGHT, INVERT MODE (From top to bottom), RGB,
   //send(0b00000000, DATA);
   nokia_cs();


   send(0x3A, CMD);      // Interface pixel format
   send(0b00000010, DATA); // 8 bit mode
   nokia_cs();

   clear_screen(bgcolor);
     
   send(0x29, CMD);           // Display On
   nokia_cs();

}

void clear_screen(unsigned char fondo)
{
   unsigned int16 i;
   
   send(0x2C, CMD);           // Memory Write
   for(i=0; i<6566; i++)
   {
   nokia_senddata(fondo);             // clear screen
   }
   nokia_cs();

}

void send(unsigned char nokia_data, unsigned char cd) {

   output_bit(CS,0);

   output_bit(SCLK,0);
   if(cd == CMD)
      output_bit(SDATA,0);
   else
      output_bit(SDATA,1);
   output_bit(SCLK,1);

   for (c=8;c>0;c--)
         {
      output_bit(SCLK,0);

      output_bit(SDATA,(nokia_data&0x80));

      output_bit(SCLK,1);
      nokia_data=nokia_data<<1;
         }
}

void nokia_senddata(unsigned char nokia_data) {

   output_bit(CS,0);

   output_bit(SCLK,0);
   output_bit(SDATA,1);
   output_bit(SCLK,1);

   for (c=8;c>0;c--)
         {
      output_bit(SCLK,0);

      output_bit(SDATA,(nokia_data&0x80));

      output_bit(SCLK,1);
      nokia_data=nokia_data<<1;
         }

}


void nokia_cs(void)
{
   output_bit(CS,1);   // CS = 1
}

////////////////////////////////////////////////////////////////////////////////
// Wrote in the character LCD past
////////////////////////////////////////////////////////////////////////////////

void nokia_printchar(unsigned char caracter)
{
unsigned char char_row,charpos,chardata;

   if(caracter==0xF1) caracter=0x80;
   else if(caracter==0xD1) caracter=0x81;
   else if (caracter<0x20) return;
   else if (caracter>0x7f) return;


   for (char_row=0;char_row<5;char_row++)
   {           // They are 5 Bytes per character
                                                      // So this loop
      if (caracter<0x50)
       {
         charpos=(((caracter&0xff)-0x20)*5)+char_row;
         chardata=ASCII_TABLE1[charpos];
       }

      else if (caracter>0x4f)
       {
         charpos=(((caracter&0xff)-0x50)*5)+char_row;
         chardata=ASCII_TABLE2[charpos];
       }


      PrintByte(chardata);                    // Send character

   }

   PrintByte(0x00);                           // We send space White 1

}


void PrintByte(unsigned char bytefornokia)    // 8 pixels
{
    char caa;
   
   for (caa=8;caa>0;caa--)
   {

      if ((bytefornokia&0x01)==0)       send(bgcolor, DATA);
      else send(fgcolor, DATA);

      bytefornokia=bytefornokia>>1;
   }


}

void nokia_outs(unsigned char * s, unsigned char x, unsigned char y)
{

   send(0x2B, CMD);      // page address set
   send(y, DATA);
   send(y+7, DATA);
   nokia_cs();

   send(0x2A, CMD);      // column address set
   send(x, DATA);
   send(x+96, DATA);
   nokia_cs();

   send(0x2C, CMD);      // Memory Write

   while(*s)
   nokia_printchar(*s++);

   nokia_cs();
}




kelangan nyo lang i-specify yung pins para sa SCLK, SDATA, CS & RESET pins..

ito yung sample main code:
Code:

// Main Function
void main(void)
{
int i;
char str[50];


   nokiacolorinit();             // LCD Initialization


   bgcolor=colors[white];
   sprintf(str,"DEMO DE 3510iLCD");
   
   for(i=0; i<6; i++)            // Shows all the colors less white
   {
   fgcolor=colors[i];           // change the color of letters
   nokia_outs(str,1,2+(i*8));          // next line ( each line=8 bits )
   }


   sprintf(str,"                ");
   
   while(true)
   {
   
       for(i=0; i<7; i++)            // Shows all the colors in 2 strip
      {
      bgcolor=colors[i];           // change the background color
      nokia_outs(str,1,2+(6*8));          // next line ( each line=8 bits )
      nokia_outs(str,1,2+(7*8));          // next line ( each line=8 bits )
      delay_ms(1500);
      }
   
   
   }
}


and ito yung expected LCD display output nung sample main code:


may mga dinagdag din akong simple routines:
Code:

// maglagay ng "dot" na color "pigment" sa pixel na located sa position "x"-"y"
void dot(unsigned char pigment, unsigned char x, unsigned char y)
{
     
   send(0x2B, CMD);      // page address set
   send(y, DATA);
   nokia_cs();

   send(0x2A, CMD);      // column address set
   send(x, DATA);
   nokia_cs();

   send(0x2C, CMD);      // Memory Write
   send(pigment, DATA);
   
   nokia_cs();
}

// i-erase yung pixel (gawing kapareho ng color ng background)
void erase(unsigned char x, unsigned char y)
{
     
   send(0x2B, CMD);      // page address set
   send(y, DATA);
   nokia_cs();

   send(0x2A, CMD);      // column address set
   send(x, DATA);
   nokia_cs();

   send(0x2C, CMD);      // Memory Write
   send(bgcolor, DATA);
   
   nokia_cs();
}

// lagyan ng plain color yung block dectitated by coordinates x1, x2, y1, & y2
void color_fill(unsigned char fondo, unsigned char x1, unsigned char x2, unsigned char y1, unsigned char y2)
{
   unsigned int16 i, j;
   j=((unsigned long)(x2-x1+1)*(y2-y1+1));
   
   send(0x2A, CMD);           // column address set
   send(x1, DATA);
   send(x2, DATA);           // Each pixel 97 passes to the next column
   nokia_cs();

   send(0x2B, CMD);           // page address set
   send(y1, DATA);
   send(y2, DATA);           // Each pixel 66 passes to the next page
   nokia_cs();
   
   send(0x2C, CMD);           // Memory Write
   for(i=0; i<j; i++)
   {
   nokia_senddata(fondo);             // clear screen
   }
   nokia_cs();

}


