The LCD driver for the CCS compiler for use with the PIC-01 Development Board.

27 January, 2007 (08:59) | Microchip PIC, Projects | By: glogin

CCS offers a wide variety of C Embedded Develoment Tools for Windows or Linux that support the PIC10, PIC12, PIC14, PIC16, and PIC18 microcontrollers. This is high efficiency and low cost compiler.

This is an example how to modify the standard CCS driver for use with the PIC-01 Development Board.


//------------------------------------------------------------
// llcd.h
// The LCD driver for the CCS C compiler. The driver is
// based on the CCS's driver and modified for use with the
// PIC-01 Development Board.
// lcd_init() Must be called before any other function.
// lcd_putc(c) Will display c on the next position of the LCD.
// 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
//------------------------------------------------------------
//-----------------------PIC Development board pin map------

#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7

#define LCD_E PIN_A1
#define LCD_RS PIN_A3
#define LCD_RW PIN_A2

#define USE_LCD_RW 1 //LCD read enable

//------------------------------------------------------------
#define LCD_CGRAM_ADDR 0x40 // Set the CGRAM address
#define LCD_DDRAM_ADDR 0x80 // Set the DDRAM address

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line

int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xC, // Display on
1, // Clear display
6 // Increment cursor
};

//------------------------------------------------------------
void lcd_send_nibble(int8 nibble)
{
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));

delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;

output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);

output_low(LCD_E);

return(retval);
}
#endif

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//------------------------------------------------------------
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);

delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//------------------------------------------------------------
void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);

#ifndef USE_LCD_RW
delay_ms(5);
#endif
}
}

//------------------------------------------------------------
void lcd_gotoxy(int8 x, int8 y)
{
int8 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': //clear LCD
lcd_send_byte(0,1);
delay_ms(2);
break;

case '\n': //go to the second line
lcd_gotoxy(1,2);
break;

case '\b': //move back one position
lcd_send_byte(0,0x10);
break;

default:
lcd_send_byte(1,c);
break;
}
}

#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif

For more datails read the “CCS C Compiler Reference Manual”.
File is available here:
http://www.loginway.com/project/llcd.zip

Bad Behavior has blocked 58 access attempts in the last 7 days.