CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

NOKIA 1100 LCD Driver [PCF8814]

 
Post new topic   Reply to topic    CCS Forum Index -> Code Library
View previous topic :: View next topic  
Author Message
demonspells



Joined: 06 Jan 2011
Posts: 26

View user's profile Send private message Yahoo Messenger MSN Messenger

NOKIA 1100 LCD Driver [PCF8814]
PostPosted: Thu Mar 10, 2011 8:19 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Thu May 19, 2011 9:30 am     Reply with quote

Thanks, I have one of these LCDs and I might use your code one day! Smile
E_Blue



Joined: 13 Apr 2011
Posts: 417

View user's profile Send private message

NOKIA 1100 LCD Driver [PCF8814]
PostPosted: Wed Jun 08, 2011 11:43 am     Reply with quote

Thanks for the driver. Wink
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

View user's profile Send private message Yahoo Messenger MSN Messenger

PostPosted: Wed Jun 08, 2011 2:02 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Fri Mar 23, 2012 12:56 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Wed Apr 11, 2012 8:51 am     Reply with quote

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

View user's profile Send private message

PostPosted: Sun Aug 12, 2012 10:10 pm     Reply with quote

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

View user's profile Send private message

Trying
PostPosted: Wed Aug 22, 2012 10:00 am     Reply with quote

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

View user's profile Send private message

Re: Trying
PostPosted: Mon Oct 01, 2012 1:06 am     Reply with quote

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,,,,,,,, Smile
_________________
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

View user's profile Send private message

Re: Trying
PostPosted: Mon Oct 08, 2012 2:56 pm     Reply with quote

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,,,,,,,, Smile


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

View user's profile Send private message

PostPosted: Wed Oct 24, 2012 4:41 am     Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> Code Library All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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