| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| demonspells 
 
 
 Joined: 06 Jan 2011
 Posts: 26
 
 
 
			        
 
 | 
			
				| NOKIA 1100 LCD Driver [PCF8814] |  
				|  Posted: Thu Mar 10, 2011 8:19 pm |   |  
				| 
 |  
				| Just Copy the library and save it in a source file (ex. lcd1100.c) and include it in your main code
 
 works fine on both 18F & 16F families
 
 
 
  	  | Code: |  	  | //////////////////////
 ///    lcd1100.c
 ///
 ///    Badr Ghatasheh (demonspells)
 ///    11/3/2011
 //////////////////////
 #define sclk   PIN_B4
 #define sda    PIN_B5
 #define cs     PIN_B6
 #define rst    PIN_B7
 
 #define CMD      0
 #define DATA   1
 
 
 
 void Lcd_Init(void);
 void Lcd_Write(int1 cd,unsigned char c);
 void Lcd_Clear(void);
 void SetX(char x);
 void SetY(char y);
 void Gotoxy(char x,char y);
 void VLine(char x,char y,char on);
 void Line(unsigned char x,unsigned char y,unsigned char y2,unsigned char on);
 void print_char(char c);
 char bitaddr;
 
 
 // lookup table, here you can modify the font
 byte const FontLookup1[48][5]={
 {0x00, 0x00, 0x00, 0x00, 0x00},// (space)
 {0x00, 0x00, 0x5F, 0x00, 0x00},// !
 {0x00, 0x07, 0x00, 0x07, 0x00},// "
 {0x14, 0x7F, 0x14, 0x7F, 0x14},// #
 {0x24, 0x2A, 0x7F, 0x2A, 0x12},// $
 {0x23, 0x13, 0x08, 0x64, 0x62},// %
 {0x36, 0x49, 0x55, 0x22, 0x50},// &
 {0x00, 0x05, 0x03, 0x00, 0x00},// '
 {0x00, 0x1C, 0x22, 0x41, 0x00},// (
 {0x00, 0x41, 0x22, 0x1C, 0x00},// )
 {0x08, 0x2A, 0x1C, 0x2A, 0x08},// *
 {0x08, 0x08, 0x3E, 0x08, 0x08},// +
 {0x00, 0x50, 0x30, 0x00, 0x00},// ,
 {0x08, 0x08, 0x08, 0x08, 0x08},// -
 {0x00, 0x30, 0x30, 0x00, 0x00},// .
 {0x20, 0x10, 0x08, 0x04, 0x02},// /
 {0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
 {0x00, 0x42, 0x7F, 0x40, 0x00},// 1
 {0x42, 0x61, 0x51, 0x49, 0x46},// 2
 {0x21, 0x41, 0x45, 0x4B, 0x31},// 3
 {0x18, 0x14, 0x12, 0x7F, 0x10},// 4
 {0x27, 0x45, 0x45, 0x45, 0x39},// 5
 {0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
 {0x01, 0x71, 0x09, 0x05, 0x03},// 7
 {0x36, 0x49, 0x49, 0x49, 0x36},// 8
 {0x06, 0x49, 0x49, 0x29, 0x1E},// 9
 {0x00, 0x36, 0x36, 0x00, 0x00},// :
 {0x00, 0x56, 0x36, 0x00, 0x00},// ;
 {0x00, 0x08, 0x14, 0x22, 0x41},// <
 {0x14, 0x14, 0x14, 0x14, 0x14},// =
 {0x41, 0x22, 0x14, 0x08, 0x00},// >
 {0x02, 0x01, 0x51, 0x09, 0x06},// ?
 {0x32, 0x49, 0x79, 0x41, 0x3E},// @
 {0x7E, 0x11, 0x11, 0x11, 0x7E},// A
 {0x7F, 0x49, 0x49, 0x49, 0x36},// B
 {0x3E, 0x41, 0x41, 0x41, 0x22},// C
 {0x7F, 0x41, 0x41, 0x22, 0x1C},// D
 {0x7F, 0x49, 0x49, 0x49, 0x41},// E
 {0x7F, 0x09, 0x09, 0x01, 0x01},// F
 {0x3E, 0x41, 0x41, 0x51, 0x32},// G
 {0x7F, 0x08, 0x08, 0x08, 0x7F},// H
 {0x00, 0x41, 0x7F, 0x41, 0x00},// I
 {0x20, 0x40, 0x41, 0x3F, 0x01},// J
 {0x7F, 0x08, 0x14, 0x22, 0x41},// K
 {0x7F, 0x40, 0x40, 0x40, 0x40},// L
 {0x7F, 0x02, 0x04, 0x02, 0x7F},// M
 {0x7F, 0x04, 0x08, 0x10, 0x7F},// N
 {0x3E, 0x41, 0x41, 0x41, 0x3E}};// O
 
 byte const FontLookup2[48][5]={
 {0x7F, 0x09, 0x09, 0x09, 0x06},// P
 {0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
 {0x7F, 0x09, 0x19, 0x29, 0x46},// R
 {0x46, 0x49, 0x49, 0x49, 0x31},// S
 {0x01, 0x01, 0x7F, 0x01, 0x01},// T
 {0x3F, 0x40, 0x40, 0x40, 0x3F},// U
 {0x1F, 0x20, 0x40, 0x20, 0x1F},// V
 {0x7F, 0x20, 0x18, 0x20, 0x7F},// W
 {0x63, 0x14, 0x08, 0x14, 0x63},// X
 {0x03, 0x04, 0x78, 0x04, 0x03},// Y
 {0x61, 0x51, 0x49, 0x45, 0x43},// Z
 {0x00, 0x00, 0x7F, 0x41, 0x41},// [
 {0x02, 0x04, 0x08, 0x10, 0x20},// "\"
 {0x41, 0x41, 0x7F, 0x00, 0x00},// ]
 {0x04, 0x02, 0x01, 0x02, 0x04},// ^
 {0x40, 0x40, 0x40, 0x40, 0x40},// _
 {0x00, 0x01, 0x02, 0x04, 0x00},// `
 {0x20, 0x54, 0x54, 0x54, 0x78},// a
 {0x7F, 0x48, 0x44, 0x44, 0x38},// b
 {0x38, 0x44, 0x44, 0x44, 0x20},// c
 {0x38, 0x44, 0x44, 0x48, 0x7F},// d
 {0x38, 0x54, 0x54, 0x54, 0x18},// e
 {0x08, 0x7E, 0x09, 0x01, 0x02},// f
 {0x08, 0x14, 0x54, 0x54, 0x3C},// g
 {0x7F, 0x08, 0x04, 0x04, 0x78},// h
 {0x00, 0x44, 0x7D, 0x40, 0x00},// i
 {0x20, 0x40, 0x44, 0x3D, 0x00},// j
 {0x00, 0x7F, 0x10, 0x28, 0x44},// k
 {0x00, 0x41, 0x7F, 0x40, 0x00},// l
 {0x7C, 0x04, 0x18, 0x04, 0x78},// m
 {0x7C, 0x08, 0x04, 0x04, 0x78},// n
 {0x38, 0x44, 0x44, 0x44, 0x38},// o
 {0x7C, 0x14, 0x14, 0x14, 0x08},// p
 {0x08, 0x14, 0x14, 0x18, 0x7C},// q
 {0x7C, 0x08, 0x04, 0x04, 0x08},// r
 {0x48, 0x54, 0x54, 0x54, 0x20},// s
 {0x04, 0x3F, 0x44, 0x40, 0x20},// t
 {0x3C, 0x40, 0x40, 0x20, 0x7C},// u
 {0x1C, 0x20, 0x40, 0x20, 0x1C},// v
 {0x3C, 0x40, 0x30, 0x40, 0x3C},// w
 {0x44, 0x28, 0x10, 0x28, 0x44},// x
 {0x0C, 0x50, 0x50, 0x50, 0x3C},// y
 {0x44, 0x64, 0x54, 0x4C, 0x44},// z
 {0x00, 0x08, 0x36, 0x41, 0x00},// {
 {0x00, 0x00, 0x7F, 0x00, 0x00},// |
 {0x00, 0x41, 0x36, 0x08, 0x00},// }
 {0x08, 0x08, 0x2A, 0x1C, 0x08},// ->
 {0x08, 0x1C, 0x2A, 0x08, 0x08} // <-
 };
 
 
 // clear LCD
 void Lcd_Clear(void){
 unsigned int i;
 Lcd_Write(CMD,0x40); // Y = 0
 Lcd_Write(CMD,0xb0);
 Lcd_Write(CMD,0x10); // X = 0
 Lcd_Write(CMD,0x0);
 Lcd_Write(CMD,0xae); // disable display;
 for(i=0;i<255;i++)
 Lcd_Write(DATA,0x00);
 for(i=0;i<255;i++)
 Lcd_Write(DATA,0x00);
 for(i=0;i<255;i++)
 Lcd_Write(DATA,0x00);
 for(i=0;i<99;i++)
 Lcd_Write(DATA,0x00);
 Lcd_Write(CMD,0xaf); // enable display;
 }
 
 // init LCD
 void Lcd_Init(void){
 output_low(cs);
 output_low(rst);
 delay_ms(5);         // 5mS so says the stop watch(less than 5ms will not work)
 output_high(rst);
 Lcd_Write(CMD,0x20); // write VOP register
 Lcd_Write(CMD,0x90);
 Lcd_Write(CMD,0xA4); // all on/normal display
 Lcd_Write(CMD,0x2F); // Power control set(charge pump on/off)
 Lcd_Write(CMD,0x40); // set start row address = 0
 Lcd_Write(CMD,0xb0); // set Y-address = 0
 Lcd_Write(CMD,0x10); // set X-address, upper 3 bits
 Lcd_Write(CMD,0x0);  // set X-address, lower 4 bits
 Lcd_Write(CMD,0xC8); // mirror Y axis (about X axis)
 Lcd_Write(CMD,0xa1); // Invert screen in horizontal axis
 Lcd_Write(CMD,0xac); // set initial row (R0) of the display
 Lcd_Write(CMD,0x07);
 //Lcd_Write(CMD,0xF9); //
 Lcd_Write(CMD,0xaf); // display ON/OFF
 
 Lcd_Clear(); // clear LCD
 Lcd_Write(CMD,0xa7); // invert display
 delay_ms(100);
 Lcd_Write(CMD,0xa6); // normal display (non inverted)
 delay_ms(100);
 }
 
 
 void Lcd_Write(int1 cd,unsigned char c){
 int i;
 output_low(cs);
 output_low(sclk);
 output_bit(sda,cd);
 output_high(sclk);
 
 for(i=0;i<8;i++){
 output_low(sclk);
 if((c & 0x80))
 output_high(sda);
 else
 output_low(sda);
 output_high(sclk);
 c <<= 1;
 delay_us(10);
 }
 output_high(cs);
 }
 
 
 void SetX(char x){
 Lcd_Write(CMD,0x10 | ((x>>4)&0x7));
 Lcd_Write(CMD,x & 0x0f);
 }
 
 void SetY(char y){
 char aux = 0;
 while(y>7){
 y -=8;
 aux ++;
 }
 
 bitaddr = y-1;
 Lcd_Write(CMD,0xB0 | (aux & 0x0f));
 }
 
 void Gotoxy(char x,char y){
 Lcd_Write(CMD,(0xB0|(y&0x0F)));       // Y axis initialisation: 0100 yyyy
 Lcd_Write(CMD,(0x00|(x&0x0F)));       // X axis initialisation: 0000 xxxx ( x3 x2 x1 x0)
 Lcd_Write(CMD,(0x10|((x>>4)&0x07))); // X axis initialisation: 0010 0xxx  ( x6 x5 x4)
 
 }
 
 
 //x dir >    y dir from last line to ^
 void VLine(char x,char y,char on){
 char aux[8];
 char i;
 
 for(i=0;i<8;i++)
 aux[i] = 0;
 
 i = 7;
 while(y > 9){
 aux[i] = 0xff;
 y -= 8;
 i--;
 }
 
 while(y > 0){
 aux[i] >>= 1;
 aux[i] |= 0x80;
 y --;
 }
 
 
 
 for(y=0;y<8;y++){
 Lcd_Write(CMD,0xB0 | y);
 SetX(x);
 Lcd_Write(DATA,aux[y]);
 }
 
 }
 
 // xdir is >       y is always < than y2  can be used for graphs
 void Line(unsigned char x,unsigned char y,unsigned char y2,unsigned char on){
 char aux[8];
 char i,o;
 char c=1;
 char index;
 
 
 
 for(i=0;i<8;i++)
 aux[i] = 0;
 
 
 index = 0;
 for(i=0;i<64;i++){
 
 if(i >= y && i <= y2){
 aux[index] |= c << o;
 }
 
 o ++;
 if(o == 8){
 o = 0;
 index ++;
 }
 }
 
 
 for(i=0;i<8;i++){
 Lcd_Write(CMD,0xB0 | i);
 SetX(x);
 Lcd_Write(DATA,aux[i]);
 }
 
 
 }
 
 
 
 void print_char(char c){
 int i;
 
 
 for ( i = 0; i < 5; i++ ){
 if(c<0x50) Lcd_Write(DATA,FontLookup1[c - 0x20][i] << 1);
 else if(c>0x4f) Lcd_Write(DATA,FontLookup2[c - 0x50][i] << 1);
 }
 Lcd_Write(DATA,0x00);
 Lcd_Write(CMD,0xaf);
 }
 
 | 
 Here is the main file I've tested
 
  	  | Code: |  	  | #include <16f877a.h>
 #fuses HS,NOWDT,NOLVP,NOPROTECT
 #use delay(clock=4000000)
 #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,stream=com0)
 
 #include "lcd1100.c"
 
 void main (void) {
 
 Lcd_Init();
 Gotoxy(5,0);
 printf(print_char,"Nokia 1100 LCD");
 Gotoxy(40,4);
 printf(print_char,":D");
 
 while(1);
 }
 
 | 
 |  |  
		|  |  
		| vladtess 
 
 
 Joined: 14 May 2011
 Posts: 26
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 19, 2011 9:30 am |   |  
				| 
 |  
				| Thanks, I have one of these LCDs and I might use your code one day!  |  |  
		|  |  
		| E_Blue 
 
 
 Joined: 13 Apr 2011
 Posts: 417
 
 
 
			    
 
 | 
			
				| NOKIA 1100 LCD Driver [PCF8814] |  
				|  Posted: Wed Jun 08, 2011 11:43 am |   |  
				| 
 |  
				| Thanks for the driver.   Does anybody test this code on a Siemens A56 LCD?
 I have some of those LCD's.
 _________________
 Electric Blue
 |  |  
		|  |  
		| demonspells 
 
 
 Joined: 06 Jan 2011
 Posts: 26
 
 
 
			        
 
 | 
			
				|  |  
				|  Posted: Wed Jun 08, 2011 2:02 pm |   |  
				| 
 |  
				| Even though the pinouts are the same in both Nokia 1100 and Siemens A56 LCDs, they seem to have different controllers, PCF8812 for Siemens. both LCDs also have different resolutions which will cause addressing problems.
 
 A test never hurts, just keep in mind that Siemens LCDs works on 2.9V.
 _________________
 Badr Ghatasheh
 |  |  
		|  |  
		| sresam89 
 
 
 Joined: 15 Mar 2012
 Posts: 20
 Location: India
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Mar 23, 2012 12:56 pm |   |  
				| 
 |  
				| sir just out of curiosity why were you using this particular line in your code 
  	  | Code: |  	  | #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,stream=com0)
 
 | 
 
 where you looping the output/display via rs232?
 |  |  
		|  |  
		| E_Blue 
 
 
 Joined: 13 Apr 2011
 Posts: 417
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Apr 11, 2012 8:51 am |   |  
				| 
 |  
				| Thanks demonspells, I will search the datasheet of PCF8812. 
 Sorry for the delayed answer, I'm quite busy with another projects. This particular project is just to learn how to use an LCD graphic display.
 
 
  	  | sresam89 wrote: |  	  | sir just out of curiosity why were you using this particular line in your code 
  	  | Code: |  	  | #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,stream=com0)
 
 | 
 
 where you looping the output/display via rs232?
 | 
 
 I guess cause he is printing the characters to a debug terminal, maybe a PC.
 
 Look the following line at Main
 
 
  	  | Code: |  	  | printf(print_char,":D"); | 
 _________________
 Electric Blue
 |  |  
		|  |  
		| loquillo3600 
 
 
 Joined: 12 Aug 2012
 Posts: 1
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Aug 12, 2012 10:10 pm |   |  
				| 
 |  
				| I find myself doing the circuit assembly, with your program, but the Nokia  1100 is connected to the PIC on the breadboard and does not work. Could you help me with the actual connection of the circuit ?  Thank you very much. |  |  
		|  |  
		| the_dalga 
 
 
 Joined: 27 Jun 2012
 Posts: 5
 
 
 
			    
 
 | 
			
				| Trying |  
				|  Posted: Wed Aug 22, 2012 10:00 am |   |  
				| 
 |  
				| I try it on Proteus it works. When I try it on real time, I will give information about it.
 
 Thanks a lot.
 |  |  
		|  |  
		| kristinjenson 
 
 
 Joined: 01 Oct 2012
 Posts: 1
 
 
 
			    
 
 | 
			
				| Re: Trying |  
				|  Posted: Mon Oct 01, 2012 1:06 am |   |  
				| 
 |  
				|  	  | the_dalga wrote: |  	  | I try it on Proteus it works. When I try it on real time, I will give information about it.
 
 Thanks a lot.
 | 
 
 yeah I also tried it !
 I really working amazing,,,,,,,,
  _________________
 If you want to pass your HOBET admission test with less effort then must use 70-412 for more detail GIAC best wishes
 |  |  
		|  |  
		| the_dalga 
 
 
 Joined: 27 Jun 2012
 Posts: 5
 
 
 
			    
 
 | 
			
				| Re: Trying |  
				|  Posted: Mon Oct 08, 2012 2:56 pm |   |  
				| 
 |  
				|  	  | kristinjenson wrote: |  	  |  	  | the_dalga wrote: |  	  | I try it on Proteus it works. When I try it on real time, I will give information about it.
 
 Thanks a lot.
 | 
 
 yeah I also tried it !
 I really working amazing,,,,,,,,
   
 | 
 
 I tried it in real now.
 
 Be careful about VOP register.
 
 It is about Contrast. If needed, you can change it in LCD init function like
 
  	  | Code: |  	  | Lcd_Write(CMD,0x30); // write VOP register  //not 20 
 | 
 It works better.
 
 I want to use this screen as position on Nokia1100. Is there a solution, how can I change direction of screen?
 |  |  
		|  |  
		| broken850 
 
 
 Joined: 24 Oct 2012
 Posts: 1
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Oct 24, 2012 4:41 am |   |  
				| 
 |  
				| If CCS does not provide code you may have to do it yourself. 
 The part is not that complex. Send a start signal, and it responds by squirting out all its data in a specified format.
 
 I suggest you make a start on the coding, then ask for help if (when) you get stuck.
 
 ------------------------------------------
 USMAN
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |