#include <pic.h>
#include "lcd_lib.h"
#include "delay_lib.h"
#define LCD_RS RA2 // Register select
#define LCD_EN RA3 // Enable
#define LCD_D4 RB0 // Data bits
#define LCD_D5 RB1 // Data bits
#define LCD_D6 RB2 // Data bits
#define LCD_D7 RB3 // Data bits
#define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0))
/* Write a byte to the LCD in 4 bit mode */
/*****************************************/
void
lcd_write(unsigned char c)
{
if(c & 0x80) LCD_D7=1; else LCD_D7=0;
if(c & 0x40) LCD_D6=1; else LCD_D6=0;
if(c & 0x20) LCD_D5=1; else LCD_D5=0;
if(c & 0x10) LCD_D4=1; else LCD_D4=0;
LCD_STROBE;
if(c & 0x08) LCD_D7=1; else LCD_D7=0;
if(c & 0x04) LCD_D6=1; else LCD_D6=0;
if(c & 0x02) LCD_D5=1; else LCD_D5=0;
if(c & 0x01) LCD_D4=1; else LCD_D4=0;
LCD_STROBE;
DelayUs(40);
}
/* Clear and home the LCD */
/*****************************************/
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
DelayMs(2);
}
/* Write a string of chars to the LCD */
/*****************************************/
void
lcd_puts(const char * s)
{
LCD_RS = 1; // write characters
while(*s) lcd_write(*s++);
}
/* Write one character to the LCD */
/*****************************************/
void
lcd_putch(unsigned char c)
{
LCD_RS = 1; // write characters
lcd_write(c);
}
/* Go to the specified position */
/*****************************************/
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80 + pos);
}
/* Initialise the LCD */
/*****************************************/
void
lcd_init(void)
{
LCD_RS = 0; // write control bytes
DelayMs(15); // power on delay
LCD_D4 = 1; // init!
LCD_D5 = 1; //
LCD_STROBE;
DelayMs(5);
LCD_STROBE; // init!
DelayUs(100);
LCD_STROBE; // init!
DelayMs(5);
LCD_D4 = 0; // set 4 bit mode
LCD_STROBE;
DelayUs(40);
lcd_write(0x28); //4 bit mode, 1/16 duty, 5x8 font, 2lines
lcd_write(0x0C); //display on
lcd_write(0x06); //entry mode advance cursor
lcd_write(0x01); //clear display and reset cursor
}