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

Keypad+LCD example: i just need to set LCD port.....[SOLVED]

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



Joined: 05 Feb 2008
Posts: 7

View user's profile Send private message

Keypad+LCD example: i just need to set LCD port.....[SOLVED]
PostPosted: Tue Feb 05, 2008 1:07 pm     Reply with quote

I'm using example file EX_LCDKB.C along with LCD.C and KBD.C on a 16f877. I already changed the keypad port to portD (in KBD.C) succesfully.

I also need to change the port settings in LCD.C from this:

// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7

to this:*

// E1 enable*
// E0 rs*
// E2 rw*
// D4 D4
// D5 D5
// D6 D6
// D7 D7

Below is the original example LCD.C. How do I set the outputs the way I want them? Any help would be appreciated.




///////////////////////////////////////////////////////////////////////////
//// LCDD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 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:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


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;


#if defined use_portb_lcd
//#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf81
#else
#locate lcd = 6
#endif
#define set_tris_lcd(x) set_tris_b(x)
#else
//#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
#ifdef __pch__
#locate lcd = 0xf83
#else
#locate lcd = 8
#endif
#define set_tris_lcd(x) set_tris_d(x)
#endif


#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_lcd(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_lcd(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_lcd(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);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}


Last edited by Lucidan on Tue Feb 05, 2008 2:20 pm; edited 1 time in total
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Feb 05, 2008 1:12 pm     Reply with quote

Use one of these two drivers in the code library.
Flex driver:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661
Mark's driver:
http://www.ccsinfo.com/forum/viewtopic.php?t=20182
Lucidan



Joined: 05 Feb 2008
Posts: 7

View user's profile Send private message

PostPosted: Tue Feb 05, 2008 1:49 pm     Reply with quote

Thank you for your quick response.

I cannot compile with flex_LCD:

1st error: "a #device is needed before this line"
-So I placed "#device PIC16f877" before that line.

Then I got these errors:

Undeclared identifier: PIN_D0
Undeclared identifier: PIN_D1
Undeclared identifier: PIN_D2

....and so on.

Why does it not recognise these standard PIC pins anymore?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Feb 05, 2008 1:55 pm     Reply with quote

Quote:
-So I placed "#device PIC16f877" before that line.

Don't ever do this. Always #include the 16F877.H file at the start of
your program. It has the #device statement in it, and it also has
all the necessary constants that can be used with the CCS functions.

The Flex lcd driver is not a stand-alone program. It's a driver.
You need save it in a file called Flex_lcd.c and use an #include
statement to include it in your main program. Here's an example
of how to do it:
Code:

#include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)

#include "flex_lcd.c"
   
//==========================
void main()
{
lcd_init();  // Always call this first.

lcd_putc("\fHello World\n");
lcd_putc("Line Number 2");

while(1);
}


Also, if your connections between the PIC and the LCD are different
than the list of #define statements at the top of the flex_lcd.c file, then
edit the list to make it match your connections.
Lucidan



Joined: 05 Feb 2008
Posts: 7

View user's profile Send private message

PostPosted: Tue Feb 05, 2008 2:14 pm     Reply with quote

I'm sorry, i forgot to mention I was already using the 'hello world' test file. But to make sure I created a new project, and tried to compile the small testing code.
I got the same error....then I noticed the first line was:

include 16F877

instead of

#include 16F877

That was the error! How could I miss that.
The code is now working perfectly! Thanks for suggesting FLEX_LCD.C.

One more question though:

I'm using a 20x2 LCD, is there a simple way to adapt this current code to support 2x20 LCD's? I read in another topic you PM'ed someone 20x2 code (long time ago though).

EDIT: I just realised i can simply lcd_putc 16+ character lines and see if it works, and it does! This code works perfectly with my 20x2 HD44780 LCD. Thanks for helping out.
Lucidan



Joined: 05 Feb 2008
Posts: 7

View user's profile Send private message

PostPosted: Tue Feb 05, 2008 2:55 pm     Reply with quote

Wrapping it up for others new to CCS:

I wanted to use the keypad+lcd example, but first focused on just getting the LCD (HD44780 2x20) to work.

I used two source files:
- the above code posted by PCM Programmer
- the example file flex_LCD.C posted elsewhere on this forum (just search for it).

I simply changed the LCD ports in flex_LCD.C to match my devboard (a LAB-x1 made by Micro Engineering Labs).
That got the LCD working.

EDIT:
To get the keypad (4x4) working with the LCD, I used these source files:
-EX_LCD_KB.c (unmodified)
-flex_lcd.c (modified pins only)
-KBD.C (modified as shown in http://www.ccsinfo.com/forum/viewtopic.php?t=28022&start=14) to support 4x4 keypads, I also modified the pin numbers to match my devboard.
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