|
|
View previous topic :: View next topic |
Author |
Message |
isa Guest
|
a Lcd connected to pic 16f877 in port D doesn't work. |
Posted: Thu Jan 23, 2003 9:59 am |
|
|
hello every one.
I have a question about connecting a LCD to the pic 16F877.
The question is that the LCD works if connected to Port B, but in Port D there is no way to make it works.
Can it be a current problem? Doesn`t port D give enouh mA to the Lcd??Can the problem be relationed with the pull up resistors?
I can do my proyect with the LCD in port B but I would like to Know why in Port D doesn't works.
Thanks
___________________________
This message was ported from CCS's old forum
Original Post ID: 10934 |
|
|
nanard-bis Guest
|
Re: a Lcd connected to pic 16f877 in port D doesn't work. |
Posted: Thu Jan 23, 2003 11:02 am |
|
|
You couldn't need the pull up resistor on port d 0x08
for 16f877.
you use the driver #include<lcd.c> for drive your lcd.
because this driver don't run with my lcd (ic ks0066u).
:=hello every one.
:=
:=I have a question about connecting a LCD to the pic 16F877.
:=
:=The question is that the LCD works if connected to Port B, but in Port D there is no way to make it works.
:=
:=Can it be a current problem? Doesn`t port D give enouh mA to the Lcd??Can the problem be relationed with the pull up resistors?
:=
:=I can do my proyect with the LCD in port B but I would like to Know why in Port D doesn't works.
:=
:=Thanks
___________________________
This message was ported from CCS's old forum
Original Post ID: 10939 |
|
|
isa Guest
|
Re: a Lcd connected to pic 16f877 in port D doesn't work. |
Posted: Thu Jan 23, 2003 1:42 pm |
|
|
Well, i'm afraid i didn't explain myself very well.
Port B has internal weak pull up resistor, but i don't use it when i connect Lcd to this port. It's no needed.
I've been seing the 16f877 manual and i have seen that port B has ttl levels when configured as input.
The difference between port D is :
Port D has schmitt trigger levels when configured as standart I/O pin, and Ttl when configured as paralell slave port mode.
Port B has ttl levels when configured as standart I/O pin.
It's maybe the source of my problem.
I use LCD PC1602F-B (POWERTIP) AND here you have the LCD code i use, that works ok in port B (but not in D)
////////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,1997 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
////////////////////////////////////////////////////////////////////////////
// As defined in the following structure the pin connection is as follows:
// B0 enable
// B1 rs
// B2 rw
// B4 D4
// B5 D5
// B6 D6
// B7 D7
//
// LCD pins D0-D3 are not used and PIC B3 is not used.
struct lcd_pin_map { // This structure is overlayed
boolean enable; // on to an I/O port to gain
boolean rs; // access to the LCD pins.
boolean rw; // The bits are allocated from
boolean unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;
#byte lcd = 6 // This puts the entire structure
// on to port B (at address 6)
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to start it up.
// The following are used for setting
// the I/O port direction register.
STRUCT lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
byte lcd_read_byte() {
byte low,high;
set_tris_d(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_d(LCD_WRITE);
return( (high<<4) | low);
}
void lcd_send_nibble( byte n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}
void lcd_send_byte( byte address, byte n ) {
lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init() {
byte i;
set_tris_d(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( byte x, byte y) {
byte address;
if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
char lcd_getc( byte x, byte y) {
char value;
lcd_gotoxy(x,y);
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
___________________________
This message was ported from CCS's old forum
Original Post ID: 10948 |
|
|
Pete Smith Guest
|
Re: a Lcd connected to pic 16f877 in port D doesn't work. |
Posted: Fri Jan 24, 2003 2:12 am |
|
|
:=Well, i'm afraid i didn't explain myself very well.
:=
:=Port B has internal weak pull up resistor, but i don't use it when i connect Lcd to this port. It's no needed.
:=
:=I've been seing the 16f877 manual and i have seen that port B has ttl levels when configured as input.
:=The difference between port D is :
:= Port D has schmitt trigger levels when configured as standart I/O pin, and Ttl when configured as paralell slave port mode.
:=Port B has ttl levels when configured as standart I/O pin.
:=
:=It's maybe the source of my problem.
:=
:=I use LCD PC1602F-B (POWERTIP) AND here you have the LCD code i use, that works ok in port B (but not in D)
:=
:=////////////////////////////////////////////////////////////////////////////
:=//// (C) Copyright 1996,1997 Custom Computer Services ////
:=//// This source code may only be used by licensed users of the CCS C ////
:=//// compiler. This source code may only be distributed to other ////
:=//// licensed users of the CCS C compiler. No other use, reproduction ////
:=//// or distribution is permitted without written permission. ////
:=//// Derivative programs created using this software in object code ////
:=//// form are not restricted in any way. ////
:=////////////////////////////////////////////////////////////////////////////
:=
:=// As defined in the following structure the pin connection is as follows:
:=// B0 enable
:=// B1 rs
:=// B2 rw
:=// B4 D4
:=// B5 D5
:=// B6 D6
:=// B7 D7
:=//
:=// LCD pins D0-D3 are not used and PIC B3 is not used.
:=
:=struct lcd_pin_map { // This structure is overlayed
:= boolean enable; // on to an I/O port to gain
:= boolean rs; // access to the LCD pins.
:= boolean rw; // The bits are allocated from
:= boolean unused; // low order up. ENABLE will
:= int data : 4; // be pin B0.
:= } lcd;
:=
:=#byte lcd = 6 // This puts the entire structure
:= // on to port B (at address 6)
:=
:=#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
:=#define lcd_line_two 0x40 // LCD RAM address for the second line
:=
:=
:=byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
:= // These bytes need to be sent to the LCD
:= // to start it up.
:=
:=
:= // The following are used for setting
:= // the I/O port direction register.
:=
:=STRUCT lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
:=STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
:=
:=
:=
:=
:=byte lcd_read_byte() {
:= byte low,high;
:=
:= set_tris_d(LCD_READ);
:= lcd.rw = 1;
:= delay_cycles(1);
:= lcd.enable = 1;
:= delay_cycles(1);
:= high = lcd.data;
:= lcd.enable = 0;
:= delay_cycles(1);
:= lcd.enable = 1;
:= delay_us(1);
:= low = lcd.data;
:= lcd.enable = 0;
:= set_tris_d(LCD_WRITE);
:= return( (high<<4) | low);
:=}
:=
:=
:=void lcd_send_nibble( byte n ) {
:= lcd.data = n;
:= delay_cycles(1);
:= lcd.enable = 1;
:= delay_us(2);
:= lcd.enable = 0;
:=}
:=
:=
:=void lcd_send_byte( byte address, byte n ) {
:=
:= lcd.rs = 0;
:= while ( bit_test(lcd_read_byte(),7) ) ;
:= lcd.rs = address;
:= delay_cycles(1);
:= lcd.rw = 0;
:= delay_cycles(1);
:= lcd.enable = 0;
:= lcd_send_nibble(n >> 4);
:= lcd_send_nibble(n & 0xf);
:=}
:=
:=
:=void lcd_init() {
:= byte i;
:=
:= set_tris_d(LCD_WRITE);
:= lcd.rs = 0;
:= lcd.rw = 0;
:= lcd.enable = 0;
:= delay_ms(15);
:= for(i=1;i<=3;++i) {
:= lcd_send_nibble(3);
:= delay_ms(5);
:= }
:= lcd_send_nibble(2);
:= for(i=0;i<=3;++i)
:= lcd_send_byte(0,LCD_INIT_STRING[i]);
:=}
:=
:=
:=void lcd_gotoxy( byte x, byte y) {
:= byte address;
:=
:= if(y!=1)
:= address=lcd_line_two;
:= else
:= address=0;
:= address+=x-1;
:= lcd_send_byte(0,0x80|address);
:=}
:=
:=void lcd_putc( char c) {
:= switch (c) {
:= case '\f' : lcd_send_byte(0,1);
:= delay_ms(2);
:= break;
:= case '\n' : lcd_gotoxy(1,2); break;
:= case '\b' : lcd_send_byte(0,0x10); break;
:= default : lcd_send_byte(1,c); break;
:= }
:=}
:=
:=char lcd_getc( byte x, byte y) {
:= char value;
:=
:= lcd_gotoxy(x,y);
:= lcd.rs=1;
:= value = lcd_read_byte();
:= lcd.rs=0;
:= return(value);
:=}
:=
:=
:=
:=
:=
:=
___________________________
This message was ported from CCS's old forum
Original Post ID: 10960 |
|
|
PaulKlissner Guest
|
Re: a Lcd connected to pic 16f877 in port D doesn't work. |
Posted: Sat Jan 25, 2003 7:10 pm |
|
|
I'm doing exactly what you're trying to do:
Driving an LCD from Port D with a PIC16F877.
It works perfectly.
Not only do you need to convert the tris lines
in lcd.h to port D instead of port B, as you seem to have
done, but you ALSO need to be sure that the
pin data structure is mapped to port D as well:
Original way:
#byte lcd = 6 // This puts the entire structure // on to port B
Modified way for Port D:
#byte lcd = 8
Did you try that?
-Paul
___________________________
This message was ported from CCS's old forum
Original Post ID: 10996 |
|
|
|
|
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
|