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