Author Topic: SBC65EC and Nokia 3310 SPI LCD display  (Read 8973 times)

OmarZ

  • Hero Member
  • *****
  • Posts: 243
    • View Profile
SBC65EC and Nokia 3310 SPI LCD display
« on: July 24, 2006, 02:06:15 PM »
Hi.
I will start new project and i will add to my SBC65EC with PIC18F6627 a Nokia 3310 LCD display.This display has got an internal driver and interface is SPI.
I have already some detail documentation and also sample code, but maybe i will need some help, if somebody can be interested....

Regards

ziggurat29

  • Full Member
  • ***
  • Posts: 14
    • View Profile
Re: SBC65EC and Nokia 3310 SPI LCD display
« Reply #1 on: July 24, 2006, 07:23:22 PM »
I wonder if the supply voltage is a problem?  Isn't that a 3.3 V device?

OmarZ

  • Hero Member
  • *****
  • Posts: 243
    • View Profile
Re: SBC65EC and Nokia 3310 SPI LCD display
« Reply #2 on: July 24, 2006, 10:49:50 PM »
yes, but i think it's really a minor problem....

OmarZ

  • Hero Member
  • *****
  • Posts: 243
    • View Profile
Re: SBC65EC and Nokia 3310 SPI LCD display
« Reply #3 on: July 27, 2006, 12:22:36 PM »
Do you know where i can find c code for PIC 18F that read data from PS/2 mouse?
Thank you

Regards

ziggurat29

  • Full Member
  • ***
  • Posts: 14
    • View Profile
Re: SBC65EC and Nokia 3310 SPI LCD display
« Reply #4 on: July 28, 2006, 05:46:53 PM »
No, but I did find this reference to both the electrical characteristics and the protocol:

http://www.computer-engineering.org/ps2protocol/

Possibly you could implement an interrupt handler on the clock and sample the data in the handler, assembling the data and storing in a global 'current coordinate' storage location?

It's amusing to reflect that back in the day, mouse devices were an early design win for the PIC.  In those days there were no serial ports on-chip -- you had to implement a the UART in software!  Yikes!
« Last Edit: July 28, 2006, 06:56:01 PM by ziggurat29 »

OmarZ

  • Hero Member
  • *****
  • Posts: 243
    • View Profile
Re: SBC65EC and Nokia 3310 SPI LCD display
« Reply #5 on: July 29, 2006, 03:15:27 AM »
Thank you for PS/2 info.

About Nokia LCD i will start from this code that is for boostc.
I hope that the porting for MCC18 compiler will not be so difficult  :roll:.
I someone is interested....

Regards

OmarZ

  • Hero Member
  • *****
  • Posts: 243
    • View Profile
Re: SBC65EC and Nokia 3310 SPI LCD display
« Reply #6 on: July 29, 2006, 04:22:24 PM »
I found also this one and maybe it looks better....
Anyway LCD can work also with 5 V DC power supply.

Code: [Select]
#define nok_sclk  PIN_D4
#define nok_sda   PIN_D3
#define nok_dc    PIN_D2
#define nok_cs    PIN_D1
#define nok_res   PIN_D0

char char_row,charsel,charpos,chardata;       // for nokia_3310 lcd
int16 ddram;
char plot_value;
int32 plot_value32;
int32 plot_umsb,plot_lmsb,plot_ulsb,plot_llsb;

BYTE const TABLE5[240]=            {0x00,0x00,0x00,0x00,0x00,   // 20 space          ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes
  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
};   


BYTE const TABLE6[240]=            {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
};


//

void    nokia_init(void);
void    nokia_write_command(char bytefornokia_command);
void    nokia_write_data(char bytefornokia_data);
void    nokia_write_dorc(char bytefornokia);
void    nokia_gotoxy(int8 xnokia, int8 ynokia);
void    nokia_erase_y(int8 ynokia);
void    nokia_erase_x(int8 xnokia);
void    nokia_printchar(int8 cvar);
void    nokia_clean_ddram(void);
void    table_to_nokialcd(void);
void    nokia_plot(int8 xnokia,int8 plot_value8);
void    nokia_write_data_inv(char bytefornokia_data_inv);
void    nokia_clear_screen(void);
void    nokia_clear_xy(int8 xnokia, int8 ynokia);
void    nokia_print_uparrow(void);
void    nokia_print_downarrow(void);
void    nokia_print_leftarrow(void);
void    nokia_print_rightarrow(void);
void    nokia_print_degree(void);
void    nokia_print_lowbatdegree(void);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_init(void)
{
  output_high(nok_dc);            // bytes are stored in the display data ram, address counter, incremented automatically
  output_high(nok_cs);            // chip disabled

  output_low(nok_res);            // reset chip during 250ms
  delay_ms(10);         // works with less.....
  output_high(nok_res);

  nokia_write_command(0x21);   // set extins extended instruction set
  nokia_write_command(0xc2);   // Vop  v1: 0xc8 (for 3V)// v2: 0xa0 (for 3V) // v3: 0xc2 (2v6-5v)   ********************************************************************************************************************
  nokia_write_command(0x13);   // bias
  nokia_write_command(0x20);   // horizontal mode from left to right, X axe are incremented automatically , 0x22 for vertical addressing ,back on normal instruction set too
  nokia_write_command(0x09);   // all on

  nokia_clean_ddram();      // reset DDRAM, otherwise the lcd is blurred with random pixels

  nokia_write_command(0x08);   // mod control blank change (all off)

  nokia_write_command(0x0c);   // mod control normal change

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_clean_ddram(void)
{
  nokia_gotoxy(0,0);         // 84*6=504      clear LCD
  for (ddram=504;ddram>0;ddram--){nokia_write_data(0x00);}

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void nokia_write_command(char bytefornokia_command)
{

  output_low(nok_dc);   // byte is a command it is read with the eight SCLK pulse
  output_low(nok_cs);   // chip enabled
  nokia_write_dorc(bytefornokia_command);
  output_high(nok_cs);   // chip disabled

}
/////////////////////////////////////////////////////////////////////////////////
void nokia_write_data(char bytefornokia_data)
{

  output_high(nok_dc);
  output_low(nok_cs);   // chip enabled
  nokia_write_dorc(bytefornokia_data);
  output_high(nok_cs);   // chip disabled

}
//////////////////////////////////////////////////////////////////////////////////
void nokia_write_dorc(char bytefornokia)         // serial write data or command subroutine
{
  char caa;
  for (caa=8;caa>0;caa--) {
    output_low(nok_sclk);
    // delay_us(2);
    if ((bytefornokia&0x80)==0){output_low(nok_sda);}
    else {output_high(nok_sda);}
    output_high(nok_sclk);
    bytefornokia=bytefornokia<<1;
  }
}
//////////////////////////////////////////////////////////////////////////////////
void nokia_gotoxy(int8 xnokia, int8 ynokia)      // Nokia LCD 3310 Position cursor
{
  nokia_write_command(0x40|(ynokia&0x07));   // Y axe initialisation: 0100 0yyy

  nokia_write_command(0x80|(xnokia&0x7f));   // X axe initialisation: 1xxx xxxx
}
//////////////////////////////////////////////////////////////////////////////////
void nokia_erase_y(int8 ynokia)
{
  nokia_gotoxy(0,ynokia);
  printf(nokia_printchar,"              ");
}
//////////////////////////////////////////////////////////////////////////////////
void nokia_erase_x(int8 xnokia)
{
  char column;

  for (column=0;column!=6;column++){
    nokia_gotoxy(xnokia,column);
    nokia_write_data(0x00);
    nokia_write_data(0x00);
    nokia_write_data(0x00);
    nokia_write_data(0x00);
    nokia_write_data(0x00);
    nokia_write_data(0x00);

  }
}
//////////////////////////////////////////////////////////////////////////////////

void nokia_printchar(int8 cvar)               // Write 1 character to LCD
{
  charsel=cvar;
  table_to_nokialcd();
}
//////////////////////////////////////////////////////////////////////////////////
void table_to_nokialcd(void)   // extract ascii from tables & write to LCD
{
  if (charsel<0x20)return;
  if (charsel>0x7f)return;

  for (char_row=0;char_row<5;char_row++) {      // 5 bytes

    if (charsel<0x50){charpos=(((charsel&0xff)-0x20)*5);chardata=TABLE5[(charpos+char_row)];}            // use TABLE5
    else if (charsel>0x4f){charpos=(((charsel&0xff)-0x50)*5);chardata=TABLE6[(charpos+char_row)];}            // use TABLE6


    nokia_write_data(chardata);      // send data to nokia
  }

  nokia_write_data(0x00);      //    1 byte (always blank)

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void nokia_plot(int8 xnokia,int8 plot_value8)
{
  char i;

  plot_value32=0;
  // plot_value32|=1;         // unremark this if you want dotgraph instead of bargraph

  for (i=0;i!=plot_value8;i++){

    plot_value32|=1;         // remark this if you want dotgraph instead of bargraph
    plot_value32<<=1;
  }

  plot_value32|=2;            // bottom line is always filled

  plot_llsb=(plot_value32&0xff);
  plot_ulsb=((plot_value32>>8)&0xff);
  plot_lmsb=((plot_value32>>16)&0xff);
  plot_umsb=((plot_value32>>24)&0xff);

  nokia_gotoxy(xnokia,1);
  nokia_write_data_inv(plot_umsb);

  nokia_gotoxy(xnokia,2);
  nokia_write_data_inv(plot_lmsb);

  nokia_gotoxy(xnokia,3);
  nokia_write_data_inv(plot_ulsb);

  nokia_gotoxy(xnokia,4);
  nokia_write_data_inv(plot_llsb);

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void nokia_write_data_inv(char bytefornokia_data_inv)
{
  char caa;

  output_high(nok_dc);
  output_low(nok_cs);   // chip enabled

  for (caa=8;caa>0;caa--) {
    output_low(nok_sclk);
    delay_us(2);
    if ((bytefornokia_data_inv&0x01)==0){output_low(nok_sda);}
    else {output_high(nok_sda);}
    output_high(nok_sclk);
    bytefornokia_data_inv=bytefornokia_data_inv>>1;
  }

  output_high(nok_cs);   // chip disabled
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void nokia_clear_screen(void)
{
  nokia_erase_y(0);
  nokia_erase_y(1);
  nokia_erase_y(2);
  nokia_erase_y(3);
  nokia_erase_y(4);
  nokia_erase_y(5);

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void nokia_clear_xy(int8 xnokia, int8 ynokia)
{

  nokia_gotoxy(xnokia,ynokia);
  nokia_printchar(" ");


}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_print_uparrow(void)
{
  nokia_write_data(0x04);
  nokia_write_data(0x02);
  nokia_write_data(0x7f);
  nokia_write_data(0x02);
  nokia_write_data(0x04);
  nokia_write_data(0x00);
}
//
void nokia_print_downarrow(void)
{
  nokia_write_data(0x10);
  nokia_write_data(0x20);
  nokia_write_data(0x7f);
  nokia_write_data(0x20);
  nokia_write_data(0x10);
  nokia_write_data(0x00);
}
//
void nokia_print_leftarrow(void)
{
  nokia_write_data(0x08);
  nokia_write_data(0x1c);
  nokia_write_data(0x2a);
  nokia_write_data(0x08);
  nokia_write_data(0x08);
  nokia_write_data(0xf8);
}
//
void nokia_print_rightarrow(void)
{
  nokia_write_data(0x08);
  nokia_write_data(0x08);
  nokia_write_data(0x2a);
  nokia_write_data(0x1c);
  nokia_write_data(0x08);
  nokia_write_data(0x00);
}
//
void nokia_print_degree(void)
{
  nokia_write_data(0x00);
  nokia_write_data(0x06);
  nokia_write_data(0x09);
  nokia_write_data(0x09);
  nokia_write_data(0x06);
  nokia_write_data(0x00);

  // nokia_printchar("  ");
}
//
void nokia_print_lowbatdegree(void)
{
  nokia_write_data(0x00);
  nokia_write_data(0x06);
  nokia_write_data(0x0f);
  nokia_write_data(0x0f);
  nokia_write_data(0x06);
  nokia_write_data(0x00);

  // nokia_printchar("  ");
}
« Last Edit: July 29, 2006, 04:23:55 PM by OmarZ »

Tatsster73

  • Jr. Member
  • **
  • Posts: 9
  • http://russian-brides-best.com/ - all russian women
    • View Profile
    • women ru
SBC65EC and Nokia 3310 SPI LCD display
« Reply #7 on: November 15, 2009, 10:30:53 PM »
great to see one being brought back from the dead.  looks great.  how long have you been working on it ? 

cheers