Graphic LCD 96x64 w/ SED1565 Controller

Status
Not open for further replies.
as for the arrow you:

You either have a extra character in the beginning of your font table or you are minus-ing the wrong amount from it.

To place code here just put the code in these brackets

[ code] CODE here [ /code]

remove the spaces within the brackets. You will then see it like:
Code:
Code Here

or you can upload a ZIP or C or H file.

To upload you have to be in Advanced Mode [Go Advanced] button on the bottom right of quick reply
 
Last edited:
thanks, atomsofttech.

here goes the code

Code:
//#include <htc.h>
//#include "delay.h"
#include <LPC210x.h>
//#include "always.h"

#define GETBIT(var,bit) (((var)>>(bit))&1) 			/* read bit from var */
#define SETBIT(var,bit) ((var)|=(1L<<(bit)))		/* set bit from var to 1 */
#define CLRBIT(var,bit) ((var)&=(~(1L<<(bit))))		/* clear bit from var (set it to 0) */

#define uint unsigned int
#define byte unsigned char
//#define delay_ms() DelayMs()

/////////////////////////////////////////////////////////////////////////////////
// Description : This firmware for Nokia 7110 (SED1565 controller) 96*65 TEST  //
// Hardware : PIC16F875 , LCD NOKIA7110                                        //
// Firmware : Rev 0.1                                                          //
// Date : 6/14/2009                                                           //
// by : Hello world                                                            //
// Compiler : PICC-Lite 9.6L1 / TIDE                                                                  //
/////////////////////////////////////////////////////////////////////////////////

//#include <16F877.h>
//#fuses HS,NOPUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
//#use   delay(clock=20000000,RESTART_WDT)
//#byte  lcdport = 6  // (PORTB address value 6 for PIC16F628 device)


// hardware configuration
//                              PIC SIDE         LCD SIDE
/*#bit  nok_sda  = lcdport.0  // RB0 pin-19        pin-13 Serial data
#bit  nok_sclk = lcdport.1  // RB1 pin-20        pin-05 Serial clock
#bit  nok_dc   = lcdport.2  // RB2 pin-21        pin-04 Data or Command mode
#bit  nok_cs   = lcdport.3  // RB3 pin-22        pin-02 LCD Chip select
#bit  nok_res  = lcdport.4  // RB4 pin-23        pin-14 LCD Reset

#zero_ram
*/
// hardware configuration
// change this section if your pin connection is different

#define lcd_res 	0			//lcd_res connected to p0.0, pin13
#define lcd_sda 	1			//lcd_sda connected to p0.1, pin14
#define lcd_led		2			//led backlight connected to p0.2, pin18
#define lcd_sclk 	3			//lcd_sclk connected to p0.3, pin21
#define lcd_dc 		4			//lcd_dc connected to p0.4, pin22
#define lcd_cs 		5			//lcd_cs connected to p0.5, pin23

// end hardware configuration

// display attributes
#define NORMAL		0x00	// normal black on green
#define UNDERLINE	0x80	
#define STRIKE		0x10
#define OVERLINE	0x01
#define REVERSE		0xff	//green on black


#define negative_lcd    lcd_write_command(lcd_reverse)
#define normal_lcd      lcd_write_command(lcd_normal)

/**********************************************************
               LCD Commands
**********************************************************/
#define pow_ctrl					0x20	// (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
#define v5_ratio					0x22	//(17) V5 resistor ratio, from 0b00100000 to 0b00100111. need to add some ratio
#define start_line				0x40	// start line - set the display line start address.
#define elec_vol					0x81	// (18) electronic volume mode
#define adc_normal 				0xA0	// (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
#define adc_reverse				0xA1
#define lcd_bias_1_over_9	0xA2	// (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
#define lcd_bias_1_over_7	0xA3
#define lcd_all_off				0xA4	//turn all pixels off
#define lcd_all_on				0xA5	//lcd all points on - turn on all pixels. 0xA4: normal display.
#define lcd_normal 				0xA6 	// 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
#define lcd_reverse				0xA7
#define lcd_off						0xAE	//
#define lcd_on						0xAF	// lcd on - display on. 0xAE: display off.
#define comm_normal 			0xC0	// (15) common output normal (0xC8 reverse)
#define comm_reverse 			0xC8
#define lcd_nop						0xE3	// nop (command for no-operation, 0b11100011.

#define lcd_1st_col				0x12	//first  displayable column. datasheet didn't mention this. WEIRD!

/**********************************************************
               Global Variable
**********************************************************/
char page;
char x,y;
//char char_row;
//char charpos;
//char chardata;


/**********************************************************
               Function Prototype
**********************************************************/
void lcd_write_dorc(char byteforlcd);
void lcd_write_command(char byteforlcd_command);
void lcd_write_data(char byteforlcd_data);
void lcd_gotoxy(char lcd_row, char lcd_col);	//go to lcd_row / 0-8; and lcd_col / 0-95
//void lcd_pixel(char x, char y);	// not used.
void lcd_chr(char charsel, char attribute);
void lcd_str(const char *str, char attribute);
void lcd_reset(void);
void lcd_cls(void);
void lcd_init(void);
void mcu_init(void);
void DelayUs(int);
void DelayMs(int);


/********************************************************
              ASCII table for 5x7 dots font
********************************************************/

const char  Char_Table [] = {
                  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 \
                  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 &brvbar;

                  //7e,43,40,43,7e //&Uuml;
                  //7e,43,42,43,7e //&Ouml;
                  //1e,21,21,71,21 //&Ccedil;
                  //3c,42,53,53,72 //&ETH;

/********************************************************
              lcd clear LCD function
********************************************************/
void lcd_cls(void) {
   for (page=0; page<9; page++)              // 9 page, fill display RAM with 0s.
      {
         lcd_write_command(0xB0 | page);   // page address ie:0xB0,0xB1,...,0xB7
         lcd_write_command(0x11);          // 0x11, most  4 bit column address command 0001 0011
         lcd_write_command(0x01);          // 0x02, least 4 bit column address command 0000 0011
         for (x=96; x>0; x--)              // 96 column
            lcd_write_data(0x00);
      }
}

/**********************************************************
               Reset LCD Function
**********************************************************/
void lcd_reset(void) {
   IOSET = 1<<lcd_cs;			//select the lcd
   DelayMs(10);
   IOCLR = 1<<lcd_res;		//lcd_res low to reset the display. the lcd going into default state.
   DelayMs(10);						//give the lcd time to reset.
   IOSET = 1<<lcd_res;		//pulling the lcd out of reset.
   DelayMs(100);
}

/**********************************************************
               Initial LCD Function
**********************************************************/
void lcd_init(void) {
   lcd_reset();
   // the following initialization sequence per datasheet. All needs to be done in 5ms. (X) where X is the command on pg 8-56 of datasheet

   lcd_write_command(lcd_normal); // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
   lcd_write_command(lcd_bias_1_over_7); // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
   lcd_write_command(adc_reverse); // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
   lcd_write_command(comm_normal); // (15) common output normal (0xC8 reverse)
   lcd_write_command(v5_ratio+2); // (17) V5 resistor ratio, from 0b00100000 to 0b00100111
   lcd_write_command(elec_vol); // (18) electronic volume mode
   lcd_write_command(pow_ctrl+0x0E); // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
   //this concludes the mandatory initialization, as specified on pg 8-56 of the datasheet
   
   lcd_write_command(0x2F); // power control set value, from 0b00101000 to 0b00101111. see pg 8-52 of datasheet.
   lcd_write_command(lcd_nop); // nop (command for no-operation, 0b11100011.
//   lcd_write_command(0x2f); // start line - set the display line start address.
   lcd_write_command(lcd_on); // lcd on - display on. 0xAE: display off.
   lcd_write_command(lcd_all_on); // lcd all points on - turn on all pixels. 0xA4: normal display.
   DelayMs(50);
   lcd_write_command(lcd_off); // lcd off - turn display off.

   lcd_cls();

   lcd_write_command(lcd_on); // lcd on
   lcd_write_command(lcd_all_off); // lcd normal display mode


}

/**********************************************************
               sent 8 bit data to LCD by series
**********************************************************/
void lcd_write_dorc(char byteforlcd) { // same lcdai 3310
 
  char caa;
   for (caa=8;caa>0;caa--)
   {
      IOCLR=1<<lcd_sclk;	//data sent on the rising edge of sclk line
      DelayUs(2);
      if ((byteforlcd&0x80)==0)	// tramission starts from D7, D6, .., D1, D0. if D7 is 0, send 0. 
         {IOCLR=1<<lcd_sda;}
      else
         {IOSET=1<<lcd_sda;}
         
      IOSET=1<<lcd_sclk;	//clock out the data
      byteforlcd=byteforlcd<<1;	//shift left the next bit.
   }
 
}

/**********************************************************
              Sent Command to LCD Function
**********************************************************/
void lcd_write_command(char byteforlcd_command) {
   IOCLR=1<<lcd_dc;   // dc=0 signals lcd command mode. A0 in the datasheet. dc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_command);	//send the command.
   IOSET=1<<lcd_cs;   // chip disabled
}

/**********************************************************
               Sent Data to LCD Function
**********************************************************/
void lcd_write_data(char byteforlcd_data) {
   IOSET=1<<lcd_dc;   // display data mode. A0 in the datasheet. dorc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_data);	//send the data.
   IOSET=1<<lcd_cs;   // chip disabled
}

/**********************************************************
               goto xy position on LCD Function
**********************************************************/
void lcd_gotoxy(char lcd_row, char lcd_col) {	//lcy_row: 0 - 8 (8th column has only 1 line / D0, lcd_col: 0 - 15.
   char col_addr;
   lcd_write_command(0xB0 + lcd_row);       	// page address set. pg 8-48 in the datasheet.
   col_addr = lcd_1st_col+(lcd_col*6);					// each font has five columns + 1 blank column. xaddr: 0 - 95 on nokia 7110. no offset.
	 //lcd_1st_col=0x12: the first column of display starts here. Weird! the datasheet didn't mention it.
   lcd_write_command(0x10 | (col_addr>>4));        // column address 4 most bit set
   lcd_write_command(0x0f & col_addr);             // column address 4 least bit set
}

/**********************************************************
           Convert bitmap to charractor Function
**********************************************************/
void lcd_chr(char charsel, char attribute) {
	char char_row, char_data;
	int char_pos;

   if (charsel < 0x20) return;
   if (charsel > 0x7f) return;	//check for illegal characters

   for (char_row = 0; char_row < 5; char_row++) // 5 bytes
      {
         char_pos=charsel-0x20;
         char_data=Char_Table[char_pos*5+char_row];
//         lcd_write_data(~char_data);            // send font data to lcd, white char on black background
				 	if(attribute == REVERSE)
				 		lcd_write_data(~char_data);            // send font data to lcd
					else
						lcd_write_data(char_data | attribute);

      }
//   lcd_write_data(~0x00); // blank side pixels for each font, white char on black background
	 	if (attribute == REVERSE)
	 		lcd_write_data(~0x00);
		else
			lcd_write_data(0x00 | attribute); // blank side pixels for each font
}

/**********************************************************
           Write a string at current screen position
**********************************************************/
void lcd_str(const char *str, char attribute) {

  while (*str) 
		lcd_chr(*str++, attribute); 
	
}

/**********************************************************
  delay routines
***********************************************************/

void DelayUs(int us) {
	for (; us>0; us--);
}

void DelayMs(int ms) {
	for (; ms>0; ms--)
		DelayUs(1000);
}

void mcu_init(void) {
// need to initialize the mcu here.
	PINSEL0=0x00;
	IODIR=0xff;		//pin p0.0..p0.7 used for gpio.
	
}

/*****************************************************************
                  Main Progarm
*****************************************************************/

int main(void)
{
 
   mcu_init();
   lcd_init();
	while (1) {
		lcd_gotoxy(0,0);
//		lcd_chr('c');
//		lcd_chr('b');

   	lcd_str("0-HELLO, WORLD!", NORMAL);
		lcd_gotoxy(1,0);
		lcd_str("1-01234567890012", NORMAL);
		lcd_gotoxy(2,0);
		lcd_str("2-hello, world!", OVERLINE);
		lcd_gotoxy(3,0);
		lcd_str("3-ABCDEFGHIJKLMN", UNDERLINE);
		lcd_gotoxy(4,0);
		lcd_str("4-abcdefghijklmn", STRIKE);
		lcd_gotoxy(5,0);
		lcd_str("5-OPQRSTUVWXYZ", OVERLINE | STRIKE);
		lcd_gotoxy(6,0);
		lcd_str("6-opqrstuvwxyz", UNDERLINE | STRIKE);
		lcd_gotoxy(7,0);
		lcd_str("7-  BYE BYE", STRIKE | OVERLINE | UNDERLINE | REVERSE);


//		lcd_cls();
	}
}

/*void main(void) {
	while (1){
		//TODO Auto-generated main function
	}
}
*/

hope it works.
 
do me 1 favor try printing this to the LCD:
Code:
		lcd_gotoxy(1,0);
		lcd_str("XYZ[\]^_`abc", NORMAL);
This should help me think better. Show a image when done please.
 
oh and for the extra bits that appear in bottom left try clearing the screen before first write.

Try this as your main:
Code:
/*****************************************************************
                  Main Progarm
*****************************************************************/

int main(void)
{
 
    mcu_init();
    lcd_init();
	while (1) {
//	     lcd_chr('c');
//	     lcd_chr('b');

            lcd_cls();
            lcd_gotoxy(0,0);
            lcd_str("0- XYZ[\]^_`abc", NORMAL)

//	     lcd_str("0-HELLO, WORLD!", NORMAL);

            lcd_gotoxy(1,0);
            lcd_str("1-01234567890012", NORMAL);

            lcd_gotoxy(2,0);
            lcd_str("2-hello, world!", OVERLINE);

            lcd_gotoxy(3,0);
            lcd_str("3-ABCDEFGHIJKLMN", UNDERLINE);

            lcd_gotoxy(4,0);
            lcd_str("4-abcdefghijklmn", STRIKE);

            lcd_gotoxy(5,0);
            lcd_str("5-OPQRSTUVWXYZ", OVERLINE | STRIKE);

            lcd_gotoxy(6,0);
            lcd_str("6-opqrstuvwxyz", UNDERLINE | STRIKE);

            lcd_gotoxy(7,0);
            lcd_str("7-  BYE BYE", STRIKE | OVERLINE | UNDERLINE | REVERSE);

//	     lcd_cls();
	}
}
 
Last edited:
do me 1 favor try printing this to the LCD:
Code:
		lcd_gotoxy(1,0);
		lcd_str("XYZ[\]^_`abc", NORMAL);
This should help me think better. Show a image when done please.

if I change the code to

Code:
lcd_str("XYZ[\\]^_`abc", NORMAL);

note the "\\" because "\" is the escape sequence in C.

the output is perfectly normal.
 

Attachments

  • nokia 7110 picture 2.PNG
    33.7 KB · Views: 569
oh and for the extra bits that appear in bottom left try clearing the screen before first write.
[/code]


the dots at the bottom of the screen has something to do with the 7110 model in proteus, I suspect.

If I turn comm to normal, in lcd_init():

Code:
lcd_write_command(comm_reverse); // (15) common output normal (0xC8 reverse)

I get a flipped but otherwise fine screen.
 

Attachments

  • nokia 7110 picture 3.PNG
    34 KB · Views: 1,002
now you see it; now you don't,

if I change the code to

Code:
lcd_str("XYZ[\\]^_`abc", NORMAL);

note the "\\" because "\" is the escape sequence in C.

the output is perfectly normal.

here is how to make the 'a' disappear, .

Code:
		lcd_gotoxy(0,0);
   	lcd_str("0-XYZ[\\]^_`abc", NORMAL);
		lcd_gotoxy(1,0);
		lcd_str("1-XYZ[\\]^_abc", NORMAL);
 

Attachments

  • nokia 7110 picture 4.PNG
    34 KB · Views: 433
try removing some of the comments from the font
Code:
                  0x00,0x41,0x41,0x7f,0x00,  // 5d ]
                  0x04,0x02,0x01,0x02,0x04,
                  0x40,0x40,0x40,0x40,0x40, 
                  0x00,0x01,0x02,0x04,0x00,
                  0x20,0x54,0x54,0x54,0x78,  // 61 a

Im not sure why you get this issue. I have comments also but no issue like this. would it be possible for you to post the proteus model and stuff so i can check it here?
 
Last edited:

sure. see attached.

eliminating the comments made no difference. also, have you noticed that the char ']' was not displaced at all?
 

Attachments

  • Nokia 7110.zip
    27.9 KB · Views: 264

Jason, your instinct was right. I used lcd_chr() to trace the problem back to char 5c, '\', which is a control char for c. I rewrote that line from:

Code:
0x02,0x04,0x08,0x10,0x20,  // 5c \

to

Code:
0x02,0x04,0x08,0x10,0x20,  // 5c 55

and everything is golden!

thank you so much for your help.

here is a copy of the complete code.

Code:
//#include <htc.h>
//#include "delay.h"
#include <LPC210x.h>
//#include "always.h"

#define GETBIT(var,bit) (((var)>>(bit))&1) 			/* read bit from var */
#define SETBIT(var,bit) ((var)|=(1L<<(bit)))		/* set bit from var to 1 */
#define CLRBIT(var,bit) ((var)&=(~(1L<<(bit))))		/* clear bit from var (set it to 0) */

#define uint unsigned int
#define byte unsigned char
//#define delay_ms() DelayMs()

/////////////////////////////////////////////////////////////////////////////////
// Description : This firmware for Nokia 7110 (SED1565 controller) 96*65 TEST  //
// Hardware : PIC16F875 , LCD NOKIA7110                                        //
// Firmware : Rev 0.1                                                          //
// Date : 6/14/2009                                                           //
// by : Hello world                                                            //
// Compiler : PICC-Lite 9.6L1 / TIDE                                                                  //
/////////////////////////////////////////////////////////////////////////////////

//#include <16F877.h>
//#fuses HS,NOPUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
//#use   delay(clock=20000000,RESTART_WDT)
//#byte  lcdport = 6  // (PORTB address value 6 for PIC16F628 device)


// hardware configuration
//                              PIC SIDE         LCD SIDE
/*#bit  nok_sda  = lcdport.0  // RB0 pin-19        pin-13 Serial data
#bit  nok_sclk = lcdport.1  // RB1 pin-20        pin-05 Serial clock
#bit  nok_dc   = lcdport.2  // RB2 pin-21        pin-04 Data or Command mode
#bit  nok_cs   = lcdport.3  // RB3 pin-22        pin-02 LCD Chip select
#bit  nok_res  = lcdport.4  // RB4 pin-23        pin-14 LCD Reset

#zero_ram
*/
// hardware configuration
// change this section if your pin connection is different

#define lcd_res 	0			//lcd_res connected to p0.0, pin13
#define lcd_sda 	1			//lcd_sda connected to p0.1, pin14
#define lcd_led		2			//led backlight connected to p0.2, pin18
#define lcd_sclk 	3			//lcd_sclk connected to p0.3, pin21
#define lcd_dc 		4			//lcd_dc connected to p0.4, pin22
#define lcd_cs 		5			//lcd_cs connected to p0.5, pin23

// end hardware configuration

// display attributes
#define NORMAL		0x00	// normal black on green
#define UNDERLINE	0x80	
#define STRIKE		0x10
#define OVERLINE	0x01
#define REVERSE		0xff	//green on black


#define negative_lcd    lcd_write_command(lcd_reverse)
#define normal_lcd      lcd_write_command(lcd_normal)

/**********************************************************
               LCD Commands
**********************************************************/
#define pow_ctrl					0x20	// (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
#define v5_ratio					0x22	//(17) V5 resistor ratio, from 0b00100000 to 0b00100111. need to add some ratio
#define start_line				0x40	// start line - set the display line start address.
#define elec_vol					0x81	// (18) electronic volume mode
#define adc_normal 				0xA0	// (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
#define adc_reverse				0xA1
#define lcd_bias_1_over_9	0xA2	// (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
#define lcd_bias_1_over_7	0xA3
#define lcd_all_off				0xA4	//turn all pixels off
#define lcd_all_on				0xA5	//lcd all points on - turn on all pixels. 0xA4: normal display.
#define lcd_normal 				0xA6 	// 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
#define lcd_reverse				0xA7
#define lcd_off						0xAE	//
#define lcd_on						0xAF	// lcd on - display on. 0xAE: display off.
#define comm_normal 			0xC0	// (15) common output normal (0xC8 reverse)
#define comm_reverse 			0xC8
#define lcd_nop						0xE3	// nop (command for no-operation, 0b11100011.

#define lcd_1st_col				0x12	//first  displayable column. datasheet didn't mention this. WEIRD!

/**********************************************************
               Global Variable
**********************************************************/
char page;
char x,y;
//char char_row;
//char charpos;
//char chardata;


/**********************************************************
               Function Prototype
**********************************************************/
void lcd_write_dorc(char byteforlcd);
void lcd_write_command(char byteforlcd_command);
void lcd_write_data(char byteforlcd_data);
void lcd_gotoxy(char lcd_row, char lcd_col);	//go to lcd_row / 0-8; and lcd_col / 0-95
//void lcd_pixel(char x, char y);	// not used.
void lcd_chr(char charsel, char attribute);
void lcd_str(const char *str, char attribute);
void lcd_reset(void);
void lcd_cls(void);
void lcd_init(void);
void mcu_init(void);
void DelayUs(int);
void DelayMs(int);


/********************************************************
              ASCII table for 5x7 dots font
********************************************************/

const char Char_Table [] = {
                  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 55
                  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 &brvbar;

                  //7e,43,40,43,7e //&Uuml;
                  //7e,43,42,43,7e //&Ouml;
                  //1e,21,21,71,21 //&Ccedil;
                  //3c,42,53,53,72 //&ETH;

/********************************************************
              lcd clear LCD function
********************************************************/
void lcd_cls(void) {
   for (page=0; page<9; page++)              // 9 page, fill display RAM with 0s.
      {
         lcd_write_command(0xB0 | page);   // page address ie:0xB0,0xB1,...,0xB7
         lcd_write_command(0x11);          // 0x11, most  4 bit column address command 0001 0011
         lcd_write_command(0x01);          // 0x02, least 4 bit column address command 0000 0011
         for (x=96; x>0; x--)              // 96 column
            lcd_write_data(0x00);
      }
}

/**********************************************************
               Reset LCD Function
**********************************************************/
void lcd_reset(void) {
   IOSET = 1<<lcd_cs;			//select the lcd
   DelayMs(10);
   IOCLR = 1<<lcd_res;		//lcd_res low to reset the display. the lcd going into default state.
   DelayMs(10);						//give the lcd time to reset.
   IOSET = 1<<lcd_res;		//pulling the lcd out of reset.
   DelayMs(100);
}

/**********************************************************
               Initial LCD Function
**********************************************************/
void lcd_init(void) {
   lcd_reset();
   // the following initialization sequence per datasheet. All needs to be done in 5ms. (X) where X is the command on pg 8-56 of datasheet

   lcd_write_command(lcd_normal); // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
   lcd_write_command(lcd_bias_1_over_7); // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
   lcd_write_command(adc_reverse); // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
   lcd_write_command(comm_normal); // (15) common output normal (0xC8 reverse)
   lcd_write_command(v5_ratio+2); // (17) V5 resistor ratio, from 0b00100000 to 0b00100111
   lcd_write_command(elec_vol); // (18) electronic volume mode
   lcd_write_command(pow_ctrl+0x0E); // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
   //this concludes the mandatory initialization, as specified on pg 8-56 of the datasheet
   
   lcd_write_command(0x2F); // power control set value, from 0b00101000 to 0b00101111. see pg 8-52 of datasheet.
   lcd_write_command(lcd_nop); // nop (command for no-operation, 0b11100011.
   lcd_write_command(0x40); // start line - set the display line start address.
   lcd_write_command(lcd_on); // lcd on - display on. 0xAE: display off.
//   lcd_write_command(lcd_all_on); // lcd all points on - turn on all pixels. 0xA4: normal display.
   DelayMs(50);
//   lcd_write_command(lcd_off); // lcd off - turn display off.

//   lcd_cls();

//   lcd_write_command(lcd_on); // lcd on
//   lcd_write_command(lcd_all_off); // lcd normal display mode


}

/**********************************************************
               sent 8 bit data to LCD by series
**********************************************************/
void lcd_write_dorc(char byteforlcd) { // same lcdai 3310
 
  char caa;
   for (caa=8;caa>0;caa--)
   {
      IOCLR=1<<lcd_sclk;	//data sent on the rising edge of sclk line
//      DelayUs(2);
      if ((byteforlcd&0x80)==0)	// tramission starts from D7, D6, .., D1, D0. if D7 is 0, send 0. 
         {IOCLR=1<<lcd_sda;}
      else
         {IOSET=1<<lcd_sda;}
         
      IOSET=1<<lcd_sclk;	//clock out the data
      byteforlcd=byteforlcd<<1;	//shift left the next bit.
   }
 
}

/**********************************************************
              Sent Command to LCD Function
**********************************************************/
void lcd_write_command(char byteforlcd_command) {
   IOCLR=1<<lcd_dc;   // dc=0 signals lcd command mode. A0 in the datasheet. dc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_command);	//send the command.
   IOSET=1<<lcd_cs;   // chip disabled
}

/**********************************************************
               Sent Data to LCD Function
**********************************************************/
void lcd_write_data(char byteforlcd_data) {
   IOSET=1<<lcd_dc;   // display data mode. A0 in the datasheet. dorc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_data);	//send the data.
   IOSET=1<<lcd_cs;   // chip disabled
}

/**********************************************************
               goto xy position on LCD Function
**********************************************************/
void lcd_gotoxy(char lcd_row, char lcd_col) {	//lcy_row: 0 - 8 (8th column has only 1 line / D0, lcd_col: 0 - 15.
   char col_addr;
   lcd_write_command(0xB0 + lcd_row);       	// page address set. pg 8-48 in the datasheet.
   col_addr = lcd_1st_col+(lcd_col*6);					// each font has five columns + 1 blank column. xaddr: 0 - 95 on nokia 7110. no offset.
	 //lcd_1st_col=0x12: the first column of display starts here. Weird! the datasheet didn't mention it.
   lcd_write_command(0x10 | (col_addr>>4));        // column address 4 most bit set
   lcd_write_command(0x0f & col_addr);             // column address 4 least bit set
}

/**********************************************************
           Convert bitmap to charractor Function
**********************************************************/
void lcd_chr(char charsel, char attribute) {
	char char_row, char_data;
	int char_pos;

   if (charsel < 0x20) return;
   if (charsel > 0x7f) return;	//check for illegal characters

   for (char_row = 0; char_row < 5; char_row++) // 5 bytes
      {
         char_pos=charsel-0x20;
         char_data=Char_Table[char_pos*5+char_row];
//         lcd_write_data(~char_data);            // send font data to lcd, white char on black background
				 	if(attribute == REVERSE)
				 		lcd_write_data(~char_data);            // send font data to lcd
					else
						lcd_write_data(char_data | attribute);

      }
//   lcd_write_data(~0x00); // blank side pixels for each font, white char on black background
	 	if (attribute == REVERSE)
	 		lcd_write_data(~0x00);
		else
			lcd_write_data(0x00 | attribute); // blank side pixels for each font
}

/**********************************************************
           Write a string at current screen position
**********************************************************/
void lcd_str(const char *str, char attribute) {

  while (*str) 
		lcd_chr(*str++, attribute); 
	
}

/**********************************************************
  delay routines
***********************************************************/

void DelayUs(int us) {
	for (; us>0; us--);
}

void DelayMs(int ms) {
	for (; ms>0; ms--)
		DelayUs(1000);
}

void mcu_init(void) {
// need to initialize the mcu here.
	PINSEL0=0x00;
	IODIR=0xff;		//pin p0.0..p0.7 used for gpio.
	
}

/*****************************************************************
                  Main Progarm
*****************************************************************/

int main(void)
{
 
   mcu_init();
   lcd_init();
	while (1) {
//		lcd_chr('c');
//		lcd_chr('b');

		lcd_gotoxy(0,0);
   	lcd_str("0-XYZ[]^_`abc", NORMAL);
		lcd_gotoxy(1,0);
		lcd_str("1-XYZ[]^_abc", NORMAL);
/*		lcd_gotoxy(2,0);
		lcd_str("2-hello, world!", OVERLINE);
		lcd_gotoxy(3,0);
		lcd_str("3-ABCDEFGHIJKLMN", UNDERLINE);
		lcd_gotoxy(4,0);
		lcd_str("4-abcdefghijklmn", STRIKE);
		lcd_gotoxy(5,0);
		lcd_str("5-OPQRSTUVWXYZ", OVERLINE | STRIKE);
		lcd_gotoxy(6,0);
		lcd_str("6-opqrstuvwxyz", UNDERLINE | STRIKE);
		lcd_gotoxy(7,0);
		lcd_str("7-  BYE BYE", STRIKE | OVERLINE | UNDERLINE | REVERSE);
*/
//		lcd_gotoxy(8,0);
//		lcd_str("0-HELLO, WORLD!", NORMAL);


//		lcd_cls();
	}
}

/*void main(void) {
	while (1){
		//TODO Auto-generated main function
	}
}
*/
 

Attachments

  • nokia 7110 picture 5.PNG
    33.7 KB · Views: 452
cool nice work! glad to here it works! Thanks for the code too! i will be on the LPC2378 in about 2 weeks and this will help a lot!
 
Last edited:
Just wanted to addon that little stuff on bottom right was indeed a isis type glitch..
 

Attachments

  • glitch.png
    15 KB · Views: 1,271
Hey guys i took your advice and am selling on ebay this is my first 2 items

**broken link removed**

**broken link removed**
 
Last edited:
given that there are so many CRT monitors around, has anyone done a VGA display library? it would be interesting to reuse those old CRTs for something.
 
arg!!!! i just broke both my Nokia 7110 LCDs by accident... I dropped a hammer on my desk and both where there and now its sand
 
here is the content of the files + the entire project folder for uvision3.

enjoy.
 

Attachments

  • Nokia 7110.zip
    83.6 KB · Views: 335
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…