Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

serial or parallel LCD

Status
Not open for further replies.

kitedude

New Member
hi,

I am trying to decide which to use. I brought a 2x20 serial Lcd to use with a 16f877.
i'm using ccs to program it however i'm not having much luck.
would i be better off simply desoldering the bpk and the using it parallel.

are there functions allready available for writing to lcds in parallel.

I got it from milford instruments as they said it would be easy to program.
i told that what i was using it for, however it appears only to be useful for stamps.
 
CCS has a LCD driver for 4 bit parralel interface
Anyway, just write the code yourself, it would be fun. not that tough
 
ok i have gone with the parallel lcd,
i just desoldered the bpk daughterboard from the lcd.

i'm using the lcd.c code supplied along with the following code.
the disply isn't displaying anyhting, can anybody see a mistake
************************************************

//test the lcd

#include <16F877.h>
#use delay (clock=20000000)
#include <lcd.c>


main() {
char k;

lcd_init();
lcd_putc("\fReady...\n");
delay_ms(1000);
while (TRUE)
{
k='A';
lcd_putc(k);
}
}
************************************
and the lcd.c is
*************************************
////////////////////////////////////////////////////////////////////////////
//// LCD.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,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.

//#use delay(clock=20000000)


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__)
#byte lcd = 0xF81 // This puts the entire structure
#else // on to port B (at address 6)
#byte lcd = 6
#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_b(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_b(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_b(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);
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
 
yep,
i had initally left it out, thinking it was default to standard.
but after including it i now half a row of squares on top of a row of nothing.

did you notice anything wrong with the code.
 
kitedude said:
yep,
i had initally left it out, thinking it was default to standard.
but after including it i now half a row of squares on top of a row of nothing.

That's what you get with just power to the LCD, it looks like it's not being setup correctly. As was suggested to you, the serial LCD would be a lot easier to get working, it only requires a simple serial feed - it's pretty fool proof, I can only imagine you hadn't got the serial connection working properly.

did you notice anything wrong with the code.

No, but I didn't look - sorry, I don't do C :cry:

As the code is provided with the assembler, presumably it works?, I would try checking your connections very carefully.

When I wrote my assembler LCD routines I spent a lot of time on them, I downloaded various different routines off the net, but couldn't get any of them to work. Eventually I incorporated the best parts I found, with code of my own, and ended up with very reliable robust code. It's a really nice feeling when it all works, but it can take some getting there.
 
ok,

i got the display working today, the reason it wasn't working was that i'm using microchips icd development board. on this board, pin 39 and 40 are not connected to the board because these pins need to be isolated during in-circuit programming. Circuitry on these pins can cause corruption of the programming bitstream and clock.

i just assumed that becasue the pins were there that they were useable. well i guess the old saying is true assume only makes an ass out of u and me
so i just moved the lcd to port D, altered the lcd.d file and it worked
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top