Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

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
    nokia 7110 picture 2.PNG
    33.7 KB · Views: 558
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
    nokia 7110 picture 3.PNG
    34 KB · Views: 993
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
    nokia 7110 picture 4.PNG
    34 KB · Views: 422
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:
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?

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: 258
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?

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
    nokia 7110 picture 5.PNG
    33.7 KB · Views: 445
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:
Hey guys i took your advice and am selling on ebay :D this is my first 2 items :D

**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.
 
here is the content of the files + the entire project folder for uvision3.

enjoy.
 

Attachments

  • Nokia 7110.zip
    83.6 KB · Views: 326
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top