|
|
View previous topic :: View next topic |
Author |
Message |
senator
Joined: 31 Jul 2009 Posts: 17
|
pic18f4520 and nokia3310 LCD |
Posted: Sat Jan 09, 2010 11:32 am |
|
|
Please, I need help on displaying characters on nokia3310 lcd screen. The best I could have were 2 or 3 layers of lines drawn on screen. I interfaced it with pic18f4520 and I am using 8MHz oscillator to drive the PIC. Could that be a problem because most projects use 20MHz.
Here is my code:
Code: |
#include <18F4520.h>
#device adc=8
#include <nokia3310Driver.c>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Low power osc < 200 khz
/*#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD*/
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use delay(clock=8000000)
void main()
{
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab
// TODO: USER CODE!!
int i=0;
//REmember, you must define and initialise all variables here!!!
// TODO: USER CODE!!
char fName[10]="Ade", lName[10]="Olusegun";
//you must call initlcd before doing anything else with lcd
initlcd();
while(true)
{
clearram();
//delay_ms(500);
delay_ms(50);
//cursorxy(1,0);
cursorxy(i,0);
//putstr(fName);
putstr(fName);
// TODO: USER CODE!!
cursorxy(30,0);
putstr(lName);
cursorxy(1,1);
putstr(fName);
// TODO: USER CODE!!
cursorxy(30,1);
putstr(lName);
cursorxy(1,5);
putstr(fName);
// TODO: USER CODE!!
cursorxy(30,5);
putstr(lName);
delay_ms(500);
i++;
}
//now you can call any function from the driver to modify brightness, determine where to write next, write a character, or a string.
}
|
nokia3310Driver.c
Code: |
/*
Nokia 3310 LCD Demo. Codes are partially modified from Michel
Bavin's CCS C Codes for Nokia 3310 Graphical LCD
(LPH7779) routines version 3 from http://users.skynet.be/bk317494/
Connection:
- get the pinout of the 3310 screen online
- how the 3310 pins are connected to the PIC pin are defined by the define statements below:
#define SCK PIN_D7 // Connections between PIC and LCD.
#define SDI PIN_D6
#define D_C PIN_D5
#define _SCE PIN_D4
#define _RES PIN_D3
The above shows that by default, pins D3 to D7 are used by this code.
You can change by modifying the #define statements below.
The 480-byte large array "Table" is used to define the font used for the display.
The comment on each line of the code for declaring the array shows the character that line defines.
DO NOT MESS WITH THIS TABLE AT ALL UNLESS YOU NEED TO CHANGE THE STYLE WITH WHICH A PARTICULAR CHARACTER IS DISPLAYED
Contrastup and contrastdown increase or reduce the contrast by a small amount respectively each time they are called
Initlcd must be called before any other thing is done with or to the lcd. It needs to be called only once close to the beginning of your code.
There is no need to call it again unless program execution resets for whatever reason
Writecomm, Writedata,Clockdata : DO NOT these functions. They are called by some other functions.
Clearam clears the entire screen
Cursorxy places the cursor at a screen location. Note that the cursor itself is invisible. Use Cursor XY to
determine where the next character you write will appear.
Putlcdchar allows you to write a single character to the LCD at the present cursor location. Character written with a foreground of
black and a background of white.
Putlcdcharinv writes a single character to the LCD. Difference is that the character is written with a foreground of white on a background of black.
putstr and putstrinv both write an array of chacters to the LCD. outstr writes with a forground of black on white while putstrinv
writes with white on a black background.
*/
// Structures used by LCD
#define SCK PIN_D7 // Connections between PIC and LCD.
#define SDI PIN_D6
#define D_C PIN_D5
#define _SCE PIN_D4
#define _RES PIN_D3
int lcdcontrast = 216; //Contrast initially set at 216
void initlcd(void); // Initializes the LCD.
void writecom(char); // Writes a command.
void writedata(char); // Writes data to DDRAM to illuminate the pixels.
void clockdata(char); // Clocks in data into the PCD8544 controller.
void clearram(void); // Erase the DDRAM contents.
void cursorxy(char,char); // Position cursor to x,y.
void putlcdchar(char); // Write one character.
void putlcdcharinv(char); // Write one character.
void putstr(char *message); // Writes a string of characters.
void putstrinv(char *message); // Writes a string of characters.
const char table[480] = { 0x00,0x00,0x00,0x00,0x00,// 20 space ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes
0x00,0x00,0x5f,0x00,0x00, // 21 ! Note that this is the same set of codes for character you
0x00,0x07,0x00,0x07,0x00, // 22 " would find on a HD44780 based character LCD. :)
0x14,0x7f,0x14,0x7f,0x14, // 23 # Also, given the size of the LCD (84 pixels by 48 pixels),
0x24,0x2a,0x7f,0x2a,0x12, // 24 $ the maximum number of characters per row is only 14. :)
0x23,0x13,0x08,0x64,0x62, // 25 %
0x36,0x49,0x55,0x22,0x50, // 26 &
0x00,0x05,0x03,0x00,0x00, // 27 ' KAY: 480 bytes above obtained only from fact that the table has 96 elements
0x00,0x1c,0x22,0x41,0x00, // 28 ( and not from any physical limitation of the LCD itself
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,0x70,0x70,0x70,0x00, // 2e . // changed from 0x00,0x60,0x60,0x00,0x00 on 27/02/09
0x20,0x10,0x08,0x04,0x02, // 2f /
0x3e,0x51,0x49,0x45,0x3e, // 30 0 //start
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 Yen Currency Sign
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 Right Arrow ->
0x78,0x46,0x41,0x46,0x78}; // 7f Left Arrow <-
////////////////////////////////////////////////////////////////////////
void contrastup(void)
{
//write 000100 001
//000100 in ANY mode sets the mode (value of H and V etc)
if(lcdcontrast<250)
{
writecom(0x21); // Activate Chip and H=1. bit PD=0, V=0, H=1 //
lcdcontrast=lcdcontrast+5;
writecom(lcdcontrast); // Set LCD Voltage to about 7V. //Kay changed from C2
writecom(0x20); // Horizontal addressing and H=0.
}
}
////////////////////////////////////////////////////////////////////////
void contrastdown(void)
{
if(lcdcontrast>132)
{
writecom(0x21); // Activate Chip and H=1. bit PD=0, V=0, H=1 //
lcdcontrast=lcdcontrast-5;
writecom(lcdcontrast); // Set LCD Voltage to about 7V. //Kay changed from C2
writecom(0x20); // Horizontal addressing and H=0.
}
}
////////////////////////////////////////////////////////////////////////
void initlcd(void)
{
output_high(_RES); // Set _RES HIGH.
output_high(_SCE); // Disable Chip.
output_low(_RES); // Reset the LCD.
//delay_ms(100); // Wait 100ms.
output_high(_RES); // Awake LCD from RESET state.
writecom(0x21); // Activate Chip and H=1. bit PD=0, V=0, H=1 //
writecom(lcdcontrast); // Set LCD Voltage to about 7V. //Kay changed from C2
writecom(0x13); // Adjust voltage bias.
writecom(0x20); // Horizontal addressing and H=0. //Can change to vertical mode to draw screen, but hope no stress associated
//H doesn't need to be set to 1 any more unless we need to change Bias or LCD Voltage
//to set to vertical address mode, writecom(0x22)
writecom(0x09); // Activate all segments.
clearram(); // Erase all pixel on the DDRAM.
writecom(0x08); // Blank the Display.
writecom(0x0C); // Display Normal.
cursorxy(0,0); // Cursor Home.
}
////////////////////////////////////////////////////////////////////////
void writecom(char command_in)
{
output_low(D_C); // Select Command register.
output_low(_SCE); // Select Chip.
clockdata(command_in); // Clock in command bits.
output_high(_SCE); // Deselect Chip.
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void writedata(char data_in)
{
output_high(D_C); // Select Data register.
output_low(_SCE); // Select Chip.
clockdata(data_in); // Clock in data bits.
output_high(_SCE); // Deselect Chip.
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void clockdata(char bits_in)
{
int bitcnt;
for (bitcnt=8; bitcnt>0; bitcnt--)
{
output_low(SCK);
// Set Clock Idle level LOW.
if ((bits_in&0x80)==0x80) {output_high(SDI);} // PCD8544 clocks in the MSb first.
else {output_low(SDI);}
output_high(SCK); // Data is clocked on the rising edge of SCK.
//ADDED BY KAY
bits_in=bits_in<<1; // Logical shift data by 1 bit left.
}
}
////////////////////////////////////////////////////////////////////////
// CLEARRAM: clears the RAM by writing blanks to every single RAM location
// Each RAM location controls 8 vertical pixels
////////////////////////////////////////////////////////////////////////
void clearram(void)
{
int16 ddram;
cursorxy(0,0); // Cursor Home.
for (ddram=700;ddram>0;ddram--) {writedata(0x00);} // 6*84 = 504 DDRAM addresses. //changed to 600 to troubleshoot
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// CURSORXY: Uses appropriate Command to take "cursor" to right RAM address.
// This is probably done by specifying a RAM address to go to
////////////////////////////////////////////////////////////////////////
void cursorxy(char x, char y)
{
writecom(0x40|(y&0x07)); // Y axis
writecom(0x80|(x&0x7f)); // X axis
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void putlcdchar(char character)
{
int16 tablept;
int16 characterint;
int count;
int char_column;
if ((character<0x20)||(character>0x7f)) {return;}// Exit function if character is not found.
characterint=character;
tablept = ((5*characterint) - 160); // Point to the columns of the character in the table.
for (count=5;count>0;count--) // Draw the columns to print the character.
{
char_column = table[tablept];
writedata(char_column);
tablept++;
}
writedata(0x00); // 1 pixel spacing per character.
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void putlcdcharinv(char character)
{
int16 tablept;
int16 characterint;
int count;
int char_column;
if ((character<0x20)||(character>0x7f)) {return;}// Exit function if character is not found.
characterint=character;
tablept = ((5*characterint) - 160); // Point to the columns of the character in the table.
for (count=5;count>0;count--) // Draw the columns to print the character.
{
char_column = table[tablept]^0xFF;
writedata(char_column);
tablept++;
}
writedata(0xFF); // 1 pixel spacing per character.
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void putstr(char *message)
{
// int i=0;
while(*message) {putlcdchar(*message++);} // Points to one ASCII to be written one at a time.
// while((i<30)&&(message[i]))
// {
// putchar(message[i]);
// i++;
// }
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void putstrinv(char *message)
{
while(*message) {putlcdcharinv(*message++);} // Points to one ASCII to be written one at a time.
}
////////////////////////////////////////////////////////////////////////
|
Thanks in advance |
|
|
senator
Joined: 31 Jul 2009 Posts: 17
|
|
Posted: Sun Jan 10, 2010 1:28 am |
|
|
My codes and circuit design runs on proteus but the hardware is not coming on. Please what could be the problem? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jan 10, 2010 2:13 am |
|
|
Quote: |
My codes and circuit design runs on proteus but the hardware is not coming on.
FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
|
Change that fuse to NOLVP. |
|
|
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Sun Jan 10, 2010 3:42 am |
|
|
Your delay statement is also wrong
Code: | #use delay(clock=20000000) | Since you're using an 8MHz crystal this should be Code: | #use delay(clock=8000000) |
Rohit |
|
|
senator
Joined: 31 Jul 2009 Posts: 17
|
|
Posted: Fri Jan 15, 2010 2:48 am |
|
|
Thanks a lot everyone, i adjusted my codes and the 3310 lcd is now coming on, but the characters are not stable on the screen, they keep flickering and some times the 3310 lcd doesn't come on at all and other times when it comes on it doesn't last for a minute before it goes off.
I tried changing my crystal oscillator from 8 MHz to 20MHz, but it is still the same, i also tried to increase the 4.7uF capacitor to about 24uF so that it can drive the 3310 lcd well, but the result is still the same.
What could be the cause of this? Could it be a hardware or a software error?
Thanks in advance |
|
|
senator
Joined: 31 Jul 2009 Posts: 17
|
|
Posted: Mon Jan 18, 2010 9:38 pm |
|
|
please i am trying to display humidity and temperature using sht75 and pic18f4550. The PIC displays a lot of unwanted values (jargons) on screen that are not temperature values neither are the humidity values. My screen gets filled up with all sorts of numbers and characters. I am using nokia 3310 for the display.
Here are my codes:
MAIN:
#include <18F4550.h>
#fuses HS,NOWDT,NOLVP,PUT,NOPROTECT
#device adc=8
#use delay(clock=20000000)
#include <nokia3310Driver.c>
#include <sht75.c>
void main()
{
float restemp, truehumid;
int16 temp [10]= "temp=" , humid [10] = "humid=";
initlcd();
sht_init();
while(true)
{
// clearram();
//delay_ms(50);
sht_rd (restemp, truehumid);
cursorxy(1,10);
putstr(temp);
cursorxy(170,10);
putstr(restemp);
cursorxy(1,5);
putstr(humid);
cursorxy(170,5);
putstr(truehumid);
delay_ms(500); //delay 500 ms between reading to prevent self heating of sensor
}
}
I used sht75.c driver found at :
http://www.ccsinfo.com/forum/viewtopic.php?t=28564&highlight=sensirion |
|
|
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Mon Jan 18, 2010 9:49 pm |
|
|
Try to identify the source of the problem.
Have you managed to get the LCD to work perfectly? Try sending an independent stream of known characters (not from the SHT75) to the LCD. Check if they are displayed properly.
Also check if your SHT75 is properly interfaced. Take readings and send them via the UART to Hyperterminal or some similar serial terminal. If you get 'proper' readings then you can interface the sensor and LCD with the PIC. I don't know how you're going to get 'proper' readings. Do you have a calibrated humidity sensor that you can compare the SHT75 to? Or are you simply looking for a relatively stable set of readings?
Rohit |
|
|
senator
Joined: 31 Jul 2009 Posts: 17
|
|
Posted: Mon Jan 18, 2010 10:06 pm |
|
|
My LCD is now stable and after sending streams of independent characters i get exactly what i sent to it.
Presently i don't have a standard meter to compare my readings with, all i need for now is a stable and consistent set of data readings from SHT75.
I tried to modify the codes for nokia 3310 like i said earlier, but i am not too sure how accurate i did this, since i cannot run and see my data readings in proteus. |
|
|
|
|
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
|