www.pudn.com > rs485(full).rar > lcd873b.c


/***************************************************************************/ 
/*  Lcd.c       LCD interface routines                                     */ 
/*  Version :   2.1. for PIC16F87x                                         */ 
/*                                                                         */ 
/*  J. Winpenny  1/8/2000                                                  */ 
/*                                                                         */ 
/*                                                                         */ 
/*  Mode : HD44780 type LCD displays                                       */ 
/*                                                                         */ 
/*                                                                         */ 
/* Notes : Updated version                                                 */ 
/*         to allow greater adaptability to different displays             */ 
/*                                                                         */ 
/***************************************************************************/ 
 
#include "lcd873b.h" 
 
/* Definitions for the LCD interface */ 
 
#define LCD_SEL 3 /* Port A bit 3 ( Enables LCD ) */ 
#define LCD_WR  2 /* Port A bit 2 ( Logic 0 = Write ) */ 
#define LCD_RS  0 /* Port A bit 1 ( Register select ) */ 
#define LCD_DATA PORTB 
#define LCD_CONTROL PORTA 
 
 
#define BUSY_BIT 7 
#define BUSY_MASK 0x80 
 
#define LCD_DATA_4 4   /* LCD BIT 0 */ 
#define LCD_DATA_5 5   /* LCD BIT 1 */ 
#define LCD_DATA_6 6   /* LCD BIT 2 */ 
#define LCD_DATA_7 7   /* LCD BIT 3 */ 
 
 
char ModeFlags; 
char LCD_gp; 
 
 
/***********************************/ 
/* Setup the lcd device            */ 
/***********************************/ 
void LCDSetup(void) 
{ 
 /* Reset the LCD */ 
 
   ModeFlags = 0;           /* Default to Function Mode */ 
 
 
   Write_8_Bit( system_set_4_bit ); /* This sequence resets the LCD */ 
   delay_ms(5); 
   Write_8_Bit( system_set_4_bit ); 
   delay_ms(1); 
   Write_8_Bit( system_set_4_bit ); 
   delay_ms(1); 
   LcdWrite( system_set_4_bit ); 
 
   LcdWrite( display_on ); 
   LcdWrite( clear_lcd ); 
   LcdWrite( entry_mode ); 
   LcdWrite( set_dd_ram ); 
   ModeFlags = 1; /* Data Mode */ 
 
} 
 
 
 
/***********************************/ 
/* Put LCD in Function Mode        */ 
/***********************************/ 
void FunctionMode(void) 
{ 
   BIT_CLEAR( ModeFlags, 0 ); /* Save Mode */ 
   #asm BCF LCD_CONTROL, LCD_RS #endasm 
   Delaylcd(); 
} 
 
/***********************************/ 
/* Put LCD in Data Mode            */ 
/***********************************/ 
 
void DataMode(void) 
{ 
   BIT_SET( ModeFlags, 0 ); /* Save Mode */ 
   #asm BSF LCD_CONTROL, LCD_RS #endasm 
   Delaylcd(); 
} 
 
/***********************************/ 
/* Write a single byte to the LCD  */ 
/* 8 Bit Mode                      */ 
/***********************************/ 
void Write_8_Bit( char dh ) 
{ 
   #asm BCF LCD_CONTROL, LCD_WR #endasm 
   #asm BCF LCD_CONTROL, LCD_RS #endasm 
   #asm BCF LCD_CONTROL, LCD_SEL #endasm 
 
   //LCD_CONTROL = 0; 
 
   delay_ms(1); 
   LCD_DATA = dh;                          /* Setup data    */ 
   BIT_SET( LCD_CONTROL, LCD_SEL );        /* Select LCD    */ 
   Delaylcd(); 
   BIT_CLEAR( LCD_CONTROL, LCD_SEL );     /* de-select LCD */ 
   Delaylcd(); 
    
} 
 
 
/***********************************/ 
/* Write a single byte to the LCD  */ 
/* 4 Bit Mode                      */ 
/***********************************/ 
void LcdWrite(char dl ) 
{ 
 
char e; 
 
   e = dl;                           /* Save lower 4 bits */ 
 
/*********************************** Output Upper 8 bits ******************************/ 
 
   BIT_CLEAR( LCD_CONTROL, LCD_WR );       /* Write mode */ 
 
   if ( ( ModeFlags & 0x01 ) == 0 ) 
      BIT_CLEAR( LCD_CONTROL, LCD_RS );    /* Function mode */ 
   else 
      BIT_SET( LCD_CONTROL, LCD_RS );      /* Data mode */ 
 
   BIT_CLEAR( LCD_CONTROL, LCD_SEL); 
   LCD_DATA = dl;                           /* Setup data    */ 
 
   BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */ 
   Delaylcd(); 
   BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */ 
 
 
   dl = e;                                  /* Restore lower 4 bits */ 
   dl <<= 4; 
 
/*********************************** Output Lower 8 bits ******************************/ 
 
   BIT_CLEAR( LCD_CONTROL, LCD_WR );       /* Write mode    */ 
 
   if ( ( ModeFlags & 0x01 ) == 0 ) 
      BIT_CLEAR( LCD_CONTROL, LCD_RS );    /* Function mode */ 
   else 
      BIT_SET( LCD_CONTROL, LCD_RS );      /* Data mode */ 
 
   BIT_CLEAR( LCD_CONTROL, LCD_SEL); 
   LCD_DATA = dl;                           /* Setup data    */ 
 
   BIT_SET( LCD_CONTROL, LCD_SEL);         /* Select LCD    */ 
   Delaylcd(); 
   BIT_CLEAR( LCD_CONTROL, LCD_SEL );      /* de-select LCD */ 
   Delaylcd(); 
} 
 
/***********************************/ 
/* LCD timing delay                */ 
/* Adjust for your LCD Display     */ 
/***********************************/ 
void Delaylcd(void) 
{ 
   delay_ms(2); 
} 
 
/***********************************/ 
/* Clear LCD Screen                */ 
/***********************************/ 
void Clear(void) 
{ 
 
   FunctionMode(); 
   LcdWrite(clear_lcd); 
   DataMode(); 
 
} 
 
/***********************************/ 
/* Set the cursor position         */ 
/***********************************/ 
void SetPos(char Pos) 
{ 
 
   FunctionMode(); 
   LcdWrite( Pos ); 
   DataMode(); 
 
} 
 
/***********************************/ 
/* Set Position to line 1          */ 
/***********************************/ 
void Line1(void) 
{ 
   FunctionMode(); 
   LcdWrite( set_dd_line1 ); 
   DataMode(); 
} 
 
/***********************************/ 
/* Set Position to line 2          */ 
/***********************************/ 
void Line2(void) 
{ 
   FunctionMode(); 
   LcdWrite( set_dd_line2 ); 
   DataMode(); 
} 
 
/*******************************************/ 
/* Clear Line 1                            */ 
/*******************************************/ 
void ClearLine1(void) 
{ 
 
   Line1(); 
 
   for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ ) 
      { 
          LcdWrite(' '); 
      } 
 
   Line1(); 
} 
 
/*******************************************/ 
/* Clear Line 2                            */ 
/*******************************************/ 
void ClearLine2(void) 
{ 
 
  Line2(); 
 
  for( LCD_gp = 0; LCD_gp < 16; LCD_gp++ ) 
     { 
         LcdWrite(' '); 
     } 
 
  Line2(); 
}