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

a Lcd connected to pic 16f877 in port D doesn't work.

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
isa
Guest







a Lcd connected to pic 16f877 in port D doesn't work.
PostPosted: Thu Jan 23, 2003 9:59 am     Reply with quote

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.
PostPosted: Thu Jan 23, 2003 11:02 am     Reply with quote

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.
PostPosted: Thu Jan 23, 2003 1:42 pm     Reply with quote

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.
PostPosted: Fri Jan 24, 2003 2:12 am     Reply with quote

:=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.
PostPosted: Sat Jan 25, 2003 7:10 pm     Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion 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