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

LCD with pic18F452

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



Joined: 10 Jun 2005
Posts: 4
Location: Italy

View user's profile Send private message

LCD with pic18F452
PostPosted: Mon Jun 13, 2005 2:19 am     Reply with quote

Thank you for helping me...But I can't still write anything on LCD display.
My schematic configuration is:
4bit data LCD are connected to port D of 18F452 (RD0,RD1,RD2,RD3)
Enable line on LCD is connected to RA5 of 18F452
RS and R/W are connected respectively to RD4 and RD5 of 18F452
How could I modify the source code that you have me linked?
Thank you again!
chingB



Joined: 29 Dec 2003
Posts: 81

View user's profile Send private message

PostPosted: Mon Jun 13, 2005 5:27 am     Reply with quote

Hi,

This is what I did for my PIC18F452 with an LCD module connection.

LCD Pin PIC18F452 Pin
DB4 RD4
DB5 RD5
DB6 RD6
DB7 RD7
LCD_EN RD0
RW RD2
RS RD1

My Header File for LCD.H
Code:

#ifndef __LCD_H__
#define __LCD_H__


// LCD Pin Map Structure
typedef struct LcdPinMapStruct
{
    int     unusedA;      // portA is not used
    int     unusedB;      // portB is not used
    int     unusedC;      // portC is not used
    boolean enable;       // PinD0
    boolean rs;           // PinD1
    boolean rw;           // PinD2
    boolean dummy;        // PinD3 is not used
    int     data    :4;   // higher nibble of portD is used for data lines
} LCD_PIN_MAP_STRUCT;


// LCD PortA Register Mapping
#if defined(__PCH__)
    LCD_PIN_MAP_STRUCT LcdPinMapBits;
    #locate LcdPinMapBits = PORTA_BASE
#else
    LCD_PIN_MAP_STRUCT LcdPinMapBits;
    #locate LcdPinMapBits = 0x05
#endif


// LCD Tris Structure
typedef struct LcdTrisMapStruct
{
    int unusedA;        // portA is not used
    int unusedB;        // portB is not used
    int unusedC;        // portC is not used
    int control    :3;
    boolean dummy;      // PinD3 is not used
    int data       :4;  // higher nibble of PortD is used for data lines
} LCD_TRIS_MAP_STRUCT;


// LCD TrisA Register Mapping
#if defined(__PCH__)
    LCD_TRIS_MAP_STRUCT LcdTrisMapBits;
    #locate LcdTrisMapBits = TRISA_BASE
#else
    LCD_TRIS_MAP_STRUCT LcdTrisMapBits;
    #locate LcdTrisMapBits = 0x85
#endif


// set Tris on ports for LCD
#define SET_TRIS_LCD(x)             \
        LcdTrisMapBits.data = (x);  \
        LcdTrisMapBits.control = 0;

#define LCD_TYPE        (2)     // 0=5x7, 1=5x10, 2=2 lines
#define LCD_LINE_TWO    (0x40)  // LCD RAM address for the second line

#define XLAT_OFFSET     (0x80)  // Character Translation Offset
#define LCD_SIZE        (16)    // Allocated Buffer for LCD Module

// LCD buffer allocation
byte LCDbuff[LCD_SIZE];

// These bytes need to be sent to the LCD to start it up.
byte const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1, 6};
 
// The following are used for setting the I/O port direction register.
#define LCD_WRITE       0       // For write mode all pins are out
#define LCD_READ        15      // For read mode data pins are in

// The following display a string at specified x,y position
#define LCD_DISPLAY(x,y,string) \
        lcd_gotoxy(x,y);        \
        lcd_putc(string);



/******************************************************************************
* Function Prototypes                                                         *
******************************************************************************/
void lcd_init(void);                        // initialize LCD display

char lcd_getc(byte x, byte y);              // get char from LCD display

void lcd_putc(char c);                      // put char to LCD display

void lcd_gotoxy(byte x, byte y);            // set an x,y position

void lcd_send_byte(byte address, byte n);   // send a byte to LCD display

void lcd_send_nibble(byte n);               // send a nibble to LCD display

byte lcd_read_byte(void);                   // read a byte from LCD display


#endif


My Source File for LCD.C
Code:

/******************************************************************************
* Driver for Common LCD Modules                                               *
*                                                                             *
* lcd_init()    Must be called before any other function                      *
* lcd_putc(c)   Will display character (c) on the next position of the LCD    *
*               The following Parameters:                                     *
*                   \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                   *                   
******************************************************************************/

#include "Include\T-Keeper LCD.H"



/******************************************************************************
* Read a Byte from LCD                                                        *
******************************************************************************/
byte lcd_read_byte(void)
{
    byte low, high;

    SET_TRIS_LCD(LCD_READ);     // set data pin to input state (read mode)
    LcdPinMapBits.rw = 1;       // set to rw to high (read mode)
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set the enable pin to high
    #asm nop #endasm            // delay for one-clock cycle
    high = LcdPinMapBits.data;  // get the data from LCD (high nibble)
    LcdPinMapBits.enable = 0;   // set enable pin to low
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set enable pin to high
    #asm nop #endasm            // delay for one-clock cycle
    low = LcdPinMapBits.data;   // get the data from LCD (low nibble)
    LcdPinMapBits.enable = 0;   // set enable pin to low
    SET_TRIS_LCD(LCD_WRITE);    // set data pin to output state (write mode)
    return ((high << 4) | low); // return result
}


/******************************************************************************
* Send Nibble to LCD                                                          *
******************************************************************************/
void lcd_send_nibble(byte n)
{
    LcdPinMapBits.data = n;     // send a nibble to LCD
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set enable pin to high
    delay_us(2);                // delay for 2uSec.
    LcdPinMapBits.enable = 0;   // set enable pin to low
    return;
}


/******************************************************************************
* Send Byte to LCD                                                            *
******************************************************************************/
void lcd_send_byte(byte address, byte n)
{
    LcdPinMapBits.rs = 0;       // set rs pin to low
    while (bit_test(lcd_read_byte(),7));
    LcdPinMapBits.rs = address; // provide the address to write
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.rw = 0;       // set rw pin to low (write mode)
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 0;   // set enable pin to low
    lcd_send_nibble(n >> 4);    // send high nibble to LCD
    lcd_send_nibble(n & 0x0F);  // send low nibble to LCD
    return;
}


/******************************************************************************
* Initialize LCD Display                                                      *
******************************************************************************/
void lcd_init(void)
{
    byte i;

    SET_TRIS_LCD(LCD_WRITE);    // set all ports to output state (write mode)
    LcdPinMapBits.rs = 0;       // set rs pin to low
    LcdPinMapBits.rw = 0;       // set rw pin to low
    LcdPinMapBits.enable = 0;   // set enable pin to low
    delay_ms(15);               // make a 15mSec. delay

    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]);
    }

    for (i=0; i<LCD_SIZE; )
    {
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
    }
    return;
}


/******************************************************************************
* Gotoxy LCD Routine                                                          *
******************************************************************************/
void lcd_gotoxy(BYTE x, BYTE y)
{
    byte address;
   
    if (y != 1)
        address = LCD_LINE_TWO; // if not line1 set address to line2
    else
        address = 0;            // set address to line1

    address += (x - 1);         // increment to next address (line1 or line2)
    lcd_send_byte(0,(0x80 | address));  // send to address to write
    return;
}


/******************************************************************************
* LCD Display PutChar Routine                                                 *
******************************************************************************/
void lcd_putc(char c)
{
    if (c == '\f')      // clear and write to line1
    {
        lcd_send_byte(0,1);
        delay_ms(2);
        return;
    }
    else if (c == '\n') // write to line2
    {
        lcd_gotoxy(1,2);   
        return;
    }
    else if (c == '\b') // backspace one position (line1 or line2)
    {
        lcd_send_byte(0,0x10);
        return;
    }
    else
    {
        lcd_send_byte(1,c);
        return;
    }
}


/******************************************************************************
* LCD Display GetChar Routine                                                 *
******************************************************************************/
char lcd_getc(byte x, byte y)
{
    char value;
   
    lcd_gotoxy(x,y);         // provide a x,y position
    LcdPinMapBits.rs = 1;    // set rs pin to high
    value = lcd_read_byte(); // get a byte from LCD at x,y position
    LcdPinMapBits.rs = 0;    // set rs pin to low
    return (value);          // return the value
}


Hope this would help connect your LCD module to a PIC18F452.
chingB



Joined: 29 Dec 2003
Posts: 81

View user's profile Send private message

PostPosted: Mon Jun 13, 2005 5:28 am     Reply with quote

Hi,

This is what I did for my PIC18F452 with an LCD module connection.

LCD Pin PIC18F452 Pin
DB4 RD4
DB5 RD5
DB6 RD6
DB7 RD7
LCD_EN RD0
RW RD2
RS RD1

My Header File for LCD.H
Code:

#ifndef __LCD_H__
#define __LCD_H__


// LCD Pin Map Structure
typedef struct LcdPinMapStruct
{
    int     unusedA;      // portA is not used
    int     unusedB;      // portB is not used
    int     unusedC;      // portC is not used
    boolean enable;       // PinD0
    boolean rs;           // PinD1
    boolean rw;           // PinD2
    boolean dummy;        // PinD3 is not used
    int     data    :4;   // higher nibble of portD is used for data lines
} LCD_PIN_MAP_STRUCT;


// LCD PortA Register Mapping
#if defined(__PCH__)
    LCD_PIN_MAP_STRUCT LcdPinMapBits;
    #locate LcdPinMapBits = PORTA_BASE
#else
    LCD_PIN_MAP_STRUCT LcdPinMapBits;
    #locate LcdPinMapBits = 0x05
#endif


// LCD Tris Structure
typedef struct LcdTrisMapStruct
{
    int unusedA;        // portA is not used
    int unusedB;        // portB is not used
    int unusedC;        // portC is not used
    int control    :3;
    boolean dummy;      // PinD3 is not used
    int data       :4;  // higher nibble of PortD is used for data lines
} LCD_TRIS_MAP_STRUCT;


// LCD TrisA Register Mapping
#if defined(__PCH__)
    LCD_TRIS_MAP_STRUCT LcdTrisMapBits;
    #locate LcdTrisMapBits = TRISA_BASE
#else
    LCD_TRIS_MAP_STRUCT LcdTrisMapBits;
    #locate LcdTrisMapBits = 0x85
#endif


// set Tris on ports for LCD
#define SET_TRIS_LCD(x)             \
        LcdTrisMapBits.data = (x);  \
        LcdTrisMapBits.control = 0;

#define LCD_TYPE        (2)     // 0=5x7, 1=5x10, 2=2 lines
#define LCD_LINE_TWO    (0x40)  // LCD RAM address for the second line

#define XLAT_OFFSET     (0x80)  // Character Translation Offset
#define LCD_SIZE        (16)    // Allocated Buffer for LCD Module

// LCD buffer allocation
byte LCDbuff[LCD_SIZE];

// These bytes need to be sent to the LCD to start it up.
byte const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1, 6};
 
// The following are used for setting the I/O port direction register.
#define LCD_WRITE       0       // For write mode all pins are out
#define LCD_READ        15      // For read mode data pins are in

// The following display a string at specified x,y position
#define LCD_DISPLAY(x,y,string) \
        lcd_gotoxy(x,y);        \
        lcd_putc(string);



/******************************************************************************
* Function Prototypes                                                         *
******************************************************************************/
void lcd_init(void);                        // initialize LCD display

char lcd_getc(byte x, byte y);              // get char from LCD display

void lcd_putc(char c);                      // put char to LCD display

void lcd_gotoxy(byte x, byte y);            // set an x,y position

void lcd_send_byte(byte address, byte n);   // send a byte to LCD display

void lcd_send_nibble(byte n);               // send a nibble to LCD display

byte lcd_read_byte(void);                   // read a byte from LCD display


#endif


My Source File for LCD.C
Code:

/******************************************************************************
* Driver for Common LCD Modules                                               *
*                                                                             *
* lcd_init()    Must be called before any other function                      *
* lcd_putc(c)   Will display character (c) on the next position of the LCD    *
*               The following Parameters:                                     *
*                   \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                   *                   
******************************************************************************/

#include "Include\T-Keeper LCD.H"



/******************************************************************************
* Read a Byte from LCD                                                        *
******************************************************************************/
byte lcd_read_byte(void)
{
    byte low, high;

    SET_TRIS_LCD(LCD_READ);     // set data pin to input state (read mode)
    LcdPinMapBits.rw = 1;       // set to rw to high (read mode)
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set the enable pin to high
    #asm nop #endasm            // delay for one-clock cycle
    high = LcdPinMapBits.data;  // get the data from LCD (high nibble)
    LcdPinMapBits.enable = 0;   // set enable pin to low
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set enable pin to high
    #asm nop #endasm            // delay for one-clock cycle
    low = LcdPinMapBits.data;   // get the data from LCD (low nibble)
    LcdPinMapBits.enable = 0;   // set enable pin to low
    SET_TRIS_LCD(LCD_WRITE);    // set data pin to output state (write mode)
    return ((high << 4) | low); // return result
}


/******************************************************************************
* Send Nibble to LCD                                                          *
******************************************************************************/
void lcd_send_nibble(byte n)
{
    LcdPinMapBits.data = n;     // send a nibble to LCD
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set enable pin to high
    delay_us(2);                // delay for 2uSec.
    LcdPinMapBits.enable = 0;   // set enable pin to low
    return;
}


/******************************************************************************
* Send Byte to LCD                                                            *
******************************************************************************/
void lcd_send_byte(byte address, byte n)
{
    LcdPinMapBits.rs = 0;       // set rs pin to low
    while (bit_test(lcd_read_byte(),7));
    LcdPinMapBits.rs = address; // provide the address to write
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.rw = 0;       // set rw pin to low (write mode)
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 0;   // set enable pin to low
    lcd_send_nibble(n >> 4);    // send high nibble to LCD
    lcd_send_nibble(n & 0x0F);  // send low nibble to LCD
    return;
}


/******************************************************************************
* Initialize LCD Display                                                      *
******************************************************************************/
void lcd_init(void)
{
    byte i;

    SET_TRIS_LCD(LCD_WRITE);    // set all ports to output state (write mode)
    LcdPinMapBits.rs = 0;       // set rs pin to low
    LcdPinMapBits.rw = 0;       // set rw pin to low
    LcdPinMapBits.enable = 0;   // set enable pin to low
    delay_ms(15);               // make a 15mSec. delay

    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]);
    }

    for (i=0; i<LCD_SIZE; )
    {
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
    }
    return;
}


/******************************************************************************
* Gotoxy LCD Routine                                                          *
******************************************************************************/
void lcd_gotoxy(BYTE x, BYTE y)
{
    byte address;
   
    if (y != 1)
        address = LCD_LINE_TWO; // if not line1 set address to line2
    else
        address = 0;            // set address to line1

    address += (x - 1);         // increment to next address (line1 or line2)
    lcd_send_byte(0,(0x80 | address));  // send to address to write
    return;
}


/******************************************************************************
* LCD Display PutChar Routine                                                 *
******************************************************************************/
void lcd_putc(char c)
{
    if (c == '\f')      // clear and write to line1
    {
        lcd_send_byte(0,1);
        delay_ms(2);
        return;
    }
    else if (c == '\n') // write to line2
    {
        lcd_gotoxy(1,2);   
        return;
    }
    else if (c == '\b') // backspace one position (line1 or line2)
    {
        lcd_send_byte(0,0x10);
        return;
    }
    else
    {
        lcd_send_byte(1,c);
        return;
    }
}


/******************************************************************************
* LCD Display GetChar Routine                                                 *
******************************************************************************/
char lcd_getc(byte x, byte y)
{
    char value;
   
    lcd_gotoxy(x,y);         // provide a x,y position
    LcdPinMapBits.rs = 1;    // set rs pin to high
    value = lcd_read_byte(); // get a byte from LCD at x,y position
    LcdPinMapBits.rs = 0;    // set rs pin to low
    return (value);          // return the value
}


Hope this would help connect your LCD module to a PIC18F452.
chingB



Joined: 29 Dec 2003
Posts: 81

View user's profile Send private message

PostPosted: Mon Jun 13, 2005 5:29 am     Reply with quote

Hi,

This is what I did for my PIC18F452 with an LCD module connection.

LCD Pin PIC18F452 Pin
DB4 RD4
DB5 RD5
DB6 RD6
DB7 RD7
LCD_EN RD0
RW RD2
RS RD1

My Header File for LCD.H
Code:

#ifndef __LCD_H__
#define __LCD_H__


// LCD Pin Map Structure
typedef struct LcdPinMapStruct
{
    int     unusedA;      // portA is not used
    int     unusedB;      // portB is not used
    int     unusedC;      // portC is not used
    boolean enable;       // PinD0
    boolean rs;           // PinD1
    boolean rw;           // PinD2
    boolean dummy;        // PinD3 is not used
    int     data    :4;   // higher nibble of portD is used for data lines
} LCD_PIN_MAP_STRUCT;


// LCD PortA Register Mapping
#if defined(__PCH__)
    LCD_PIN_MAP_STRUCT LcdPinMapBits;
    #locate LcdPinMapBits = PORTA_BASE
#else
    LCD_PIN_MAP_STRUCT LcdPinMapBits;
    #locate LcdPinMapBits = 0x05
#endif


// LCD Tris Structure
typedef struct LcdTrisMapStruct
{
    int unusedA;        // portA is not used
    int unusedB;        // portB is not used
    int unusedC;        // portC is not used
    int control    :3;
    boolean dummy;      // PinD3 is not used
    int data       :4;  // higher nibble of PortD is used for data lines
} LCD_TRIS_MAP_STRUCT;


// LCD TrisA Register Mapping
#if defined(__PCH__)
    LCD_TRIS_MAP_STRUCT LcdTrisMapBits;
    #locate LcdTrisMapBits = TRISA_BASE
#else
    LCD_TRIS_MAP_STRUCT LcdTrisMapBits;
    #locate LcdTrisMapBits = 0x85
#endif


// set Tris on ports for LCD
#define SET_TRIS_LCD(x)             \
        LcdTrisMapBits.data = (x);  \
        LcdTrisMapBits.control = 0;

#define LCD_TYPE        (2)     // 0=5x7, 1=5x10, 2=2 lines
#define LCD_LINE_TWO    (0x40)  // LCD RAM address for the second line

#define XLAT_OFFSET     (0x80)  // Character Translation Offset
#define LCD_SIZE        (16)    // Allocated Buffer for LCD Module

// LCD buffer allocation
byte LCDbuff[LCD_SIZE];

// These bytes need to be sent to the LCD to start it up.
byte const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1, 6};
 
// The following are used for setting the I/O port direction register.
#define LCD_WRITE       0       // For write mode all pins are out
#define LCD_READ        15      // For read mode data pins are in

// The following display a string at specified x,y position
#define LCD_DISPLAY(x,y,string) \
        lcd_gotoxy(x,y);        \
        lcd_putc(string);



/******************************************************************************
* Function Prototypes                                                         *
******************************************************************************/
void lcd_init(void);                        // initialize LCD display

char lcd_getc(byte x, byte y);              // get char from LCD display

void lcd_putc(char c);                      // put char to LCD display

void lcd_gotoxy(byte x, byte y);            // set an x,y position

void lcd_send_byte(byte address, byte n);   // send a byte to LCD display

void lcd_send_nibble(byte n);               // send a nibble to LCD display

byte lcd_read_byte(void);                   // read a byte from LCD display


#endif


My Source File for LCD.C
Code:

/******************************************************************************
* Driver for Common LCD Modules                                               *
*                                                                             *
* lcd_init()    Must be called before any other function                      *
* lcd_putc(c)   Will display character (c) on the next position of the LCD    *
*               The following Parameters:                                     *
*                   \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                   *                   
******************************************************************************/

#include "Include\T-Keeper LCD.H"



/******************************************************************************
* Read a Byte from LCD                                                        *
******************************************************************************/
byte lcd_read_byte(void)
{
    byte low, high;

    SET_TRIS_LCD(LCD_READ);     // set data pin to input state (read mode)
    LcdPinMapBits.rw = 1;       // set to rw to high (read mode)
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set the enable pin to high
    #asm nop #endasm            // delay for one-clock cycle
    high = LcdPinMapBits.data;  // get the data from LCD (high nibble)
    LcdPinMapBits.enable = 0;   // set enable pin to low
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set enable pin to high
    #asm nop #endasm            // delay for one-clock cycle
    low = LcdPinMapBits.data;   // get the data from LCD (low nibble)
    LcdPinMapBits.enable = 0;   // set enable pin to low
    SET_TRIS_LCD(LCD_WRITE);    // set data pin to output state (write mode)
    return ((high << 4) | low); // return result
}


/******************************************************************************
* Send Nibble to LCD                                                          *
******************************************************************************/
void lcd_send_nibble(byte n)
{
    LcdPinMapBits.data = n;     // send a nibble to LCD
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 1;   // set enable pin to high
    delay_us(2);                // delay for 2uSec.
    LcdPinMapBits.enable = 0;   // set enable pin to low
    return;
}


/******************************************************************************
* Send Byte to LCD                                                            *
******************************************************************************/
void lcd_send_byte(byte address, byte n)
{
    LcdPinMapBits.rs = 0;       // set rs pin to low
    while (bit_test(lcd_read_byte(),7));
    LcdPinMapBits.rs = address; // provide the address to write
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.rw = 0;       // set rw pin to low (write mode)
    #asm nop #endasm            // delay for one-clock cycle
    LcdPinMapBits.enable = 0;   // set enable pin to low
    lcd_send_nibble(n >> 4);    // send high nibble to LCD
    lcd_send_nibble(n & 0x0F);  // send low nibble to LCD
    return;
}


/******************************************************************************
* Initialize LCD Display                                                      *
******************************************************************************/
void lcd_init(void)
{
    byte i;

    SET_TRIS_LCD(LCD_WRITE);    // set all ports to output state (write mode)
    LcdPinMapBits.rs = 0;       // set rs pin to low
    LcdPinMapBits.rw = 0;       // set rw pin to low
    LcdPinMapBits.enable = 0;   // set enable pin to low
    delay_ms(15);               // make a 15mSec. delay

    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]);
    }

    for (i=0; i<LCD_SIZE; )
    {
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
        LCDbuff[i] = 0; i++;
    }
    return;
}


/******************************************************************************
* Gotoxy LCD Routine                                                          *
******************************************************************************/
void lcd_gotoxy(BYTE x, BYTE y)
{
    byte address;
   
    if (y != 1)
        address = LCD_LINE_TWO; // if not line1 set address to line2
    else
        address = 0;            // set address to line1

    address += (x - 1);         // increment to next address (line1 or line2)
    lcd_send_byte(0,(0x80 | address));  // send to address to write
    return;
}


/******************************************************************************
* LCD Display PutChar Routine                                                 *
******************************************************************************/
void lcd_putc(char c)
{
    if (c == '\f')      // clear and write to line1
    {
        lcd_send_byte(0,1);
        delay_ms(2);
        return;
    }
    else if (c == '\n') // write to line2
    {
        lcd_gotoxy(1,2);   
        return;
    }
    else if (c == '\b') // backspace one position (line1 or line2)
    {
        lcd_send_byte(0,0x10);
        return;
    }
    else
    {
        lcd_send_byte(1,c);
        return;
    }
}


/******************************************************************************
* LCD Display GetChar Routine                                                 *
******************************************************************************/
char lcd_getc(byte x, byte y)
{
    char value;
   
    lcd_gotoxy(x,y);         // provide a x,y position
    LcdPinMapBits.rs = 1;    // set rs pin to high
    value = lcd_read_byte(); // get a byte from LCD at x,y position
    LcdPinMapBits.rs = 0;    // set rs pin to low
    return (value);          // return the value
}


Hope this would help connect your LCD module to a PIC18F452.
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