Coding using PIC16F877A on a PIC Millenium board

Status
Not open for further replies.

Manor_Villages

New Member
Sorry but I am new to using PIC. I have tried to program this onto my pic microcontroller so that i can display stuff on the LCD of my PIC millenium board. But for some reason I cant program it. Is it because I need to include a driver for LCD? The port used should be D. Can somebody sort this problem out. Thanks

#if defined(__PCB__)
#include <16C56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)

#elif defined(__PCM__)
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif

#include <lcd.c>
#include <kbd.c>


void main() {
char k;

lcd_init();
kbd_init();

lcd_putc("\fReady...\n");

while (TRUE) {
k=kbd_getc();
if(k!=0)
if(k=='*')
lcd_putc('\f');
else
lcd_putc(k);
}
}
 
I'm unsure what "#elif defined(__PCM__)" is checking, you could try only including the correct headers for your PIC.

I also don't recognise which compiler that is but you will probably need to #define where the LCD is or it will use some defaults. As many PICs don't have a port D I doubt it will be using that by default.
 
This is for the CCS compiler.

I am fairly sure that the compiler for the PIC16F877A is PCM. Do you have that compiler ?

You need to provide more information regarding what you mean by you can not program it. (could be many reasons)

Lots of details.
 
Last edited:
Yes I do have the PCM compiler. I Intend to display letters onto the LCD , eg "Hello World". My pic board has ports that can be connected to the LCD. I dont think I have the right Header file for my program and I am not able to find it. My program compiles perfectly but when I transfer it on to the pic and place it on the pics millenium board nothing is being printed.
 
I found this from microchip site.

///////////////////////////////////////////////////////////////////////////
//// 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(__PCH__)
#if defined use_portb_lcd
#byte lcd = 0xF81 // This puts the entire structure
#else
#byte lcd = 0xF83 // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
#byte lcd = 6 // on to port B (at address 6)
#else
#byte lcd = 8 // on to port D (at address 8)
#endif
#endif

#if defined use_portb_lcd
#define set_tris_lcd(x) set_tris_b(x)
#else
#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);
}


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);
}
 
Egads .. two of you who do not know how to use the # icon to post code.


The first thing is how did you figure out which pins the LCD should attach to and in what order.

I found the file LCD.c in
C:\PROGRAM FILE\PICC\DRIVERS
it seems to be the same file listed by Mannor_v

Code:
// 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.

Did you attach the LCD as indicated ?
 
yes i did connect it. for the pic millenium board there is no direct connection from the pc to the board. i have to put the program onto the pic first and then place the pic onto the board. its quiete time consuming.. I did remove the # but i still find error in the line 41.
i.e before
struct lcd_pin_map { // This structure is overlayed
BOOLEAN enable; // on to an I/O port to gain
 
But did you connect it correctly? How are we to know?

The code allows for use of portb or portd. Which did you use?

You say you got an error but did not include what it was !

What # did you remove ?

To use portb change
Code:
// #define use_portb_lcd TRUE
to
Code:
#define use_portb_lcd TRUE

 
yes i did connect it. for the pic millenium board there is no direct connection from the pc to the board.

I've got a PIC Millenium board, and it has two ICSP connectors, one for 16Fxx devices and the other for 12Fxx devices. You need to make up a suitable cable to go from the ICSP connector to your programmer.
 
I am using port D. Sorry, I meant I removed // from (//#define use_portd_lcd TRUE) and still got an error.

The error I received was:-
Executing: "C:\Program files\Picc\CCSC.exe" "LCD.C" +FM +DF +LN +T -A +M +Z +Y=9 +EA
*** Error 128 "C:\Program Files\PICC\Drivers\LCD.C" Line 42(1,7): A #DEVICE required before this line
1 Errors, 0 Warnings.
Halting build on first failure as requested.
 
I tried the program below and it works fine
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

void lcd_putc(char c)
{
printf("%X ", c);
}

//=================================
void main()
{

lcd_putc("Hello World");

while(1);
}

but I get the following error when i try to run the LCD.C driver on CCS. *** Error 128 "C:\picproject\test.c" Line 52(1,12): A #DEVICE required before this line
 
Posted: Tue Mar 10, 2009 2:07 pm

--------------------------------------------------------------------------------

I modifies the LCD.C driver as given below but i still get the error.
#define LCD_D4 PIN_D4
#define LCD_D5 PIN_D5
#define LCD_D6 PIN_D6
#define LCD_D7 PIN_D7

#define LCD_enable PIN_D0
#define LCD_RS PIN_D1
#define LCD_RW PIN_D2

the error is shown before this line of commands
struct lcd_pin_map { // This structure is overlayed

BOOLEAN enable
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…