From Tim's website
Revision as of 15:42, 14 April 2012 by Tim (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

PIC Software - lcd.c for CCS

<source lang="c"> /* Define the hardware connections */ const int LCD_EN_LINE = PIN_B1; /* Enable device, high-low to clock data */ const int LCD_RW_LINE = PIN_B2; /* Read / Write line */ const int LCD_RS_LINE = PIN_B3; /* Register Select line command or character */ const int LCD_BUSY_PIN = PIN_C7; /* DB7 (connected to C7 shows busy flag */

/* Define some commands */ const int LCD_CLEAR = 0x01; /* Clear the display and send cursor to Home */ const int LCD_CUR_HOME = 0x02; /* Send the cursor to Home but keep display */

const int LCD_CUR_DEC = 0x04; /* Set cursor to move left after character */ const int LCD_CUR_INC = 0x06; /* Set cursor to move right after character */ const int LCD_CUR_SCR_R = 0x05; /* Set display to move right after character */ const int LCD_CUR_SCR_L = 0x07; /* Set display to move left after character */

const int LCD_DISP_OFF = 0x08; /* Turn off the LCD display */ const int LCD_DISP_ON = 0x0C; /* Turn on display, no cursor */ const int LCD_DISP_CUR = 0x0E; /* Turn on display, with cursor */ const int LCD_DISP_BLINK = 0x0F; /* Turn on display, with blinking cursor */

const int LCD_SHFT_CUR_L = 0x10; /* Decrement the cursor (move left) */ const int LCD_SHFT_CUR_R = 0x14; /* Increment the cursor (move right) */ const int LCD_SHFT_SCR_L = 0x18; /* Shift the display (scroll) to the left */ const int LCD_SHFT_SCR_R = 0x1C; /* Shift the display (scroll) to the right */

const int LCD_SIZE_LARGE = 0x34; /* Large cursor, one line, 8 bit interface */ const int LCD_SIZE_SMALL = 0x38; /* Small cursor, two lines, 8 bit interface */

/* Address is added to the following two values, up to 0F for each line */ const int LCD_DD_ADD_L1 = 0x80; /* First Display RAM address on Line 1 */ const int LCD_DD_ADD_L2 = 0xC0; /* First Display RAM address on Line 2 */

/* Line number for dots is added to each of the following addresses, up to 07 */ const int LCD_CG_ADD_C0 = 0x40; /* First Character Generator RAM address */ const int LCD_CG_ADD_C1 = 0x48; /* Second Character Generator RAM address */ const int LCD_CG_ADD_C2 = 0x50; /* Third Character Generator RAM address */ const int LCD_CG_ADD_C3 = 0x58; /* Fourth Character Generator RAM address */ const int LCD_CG_ADD_C4 = 0x60; /* Fifth Character Generator RAM address */ const int LCD_CG_ADD_C5 = 0x68; /* Sixth Character Generator RAM address */ const int LCD_CG_ADD_C6 = 0x70; /* Seventh Character Generator RAM address */ const int LCD_CG_ADD_C7 = 0x78; /* Eighth Character Generator RAM address */


/* Functions */ void lcd_command( char command ); void lcd_character( char character ); void lcd_number( int number ); void lcd_initialise( int size );


void lcd_command( char command ) /* Sends the given command to the LCD display. Most of the commands are */ /* defined in the header. This function will wait for the busy flag on the */ /* display to clear before sending the command and returning. */ {

  output_low( LCD_RS_LINE );
  output_high( LCD_RW_LINE );
  /* Wait for busy flag */
  while( input( LCD_BUSY_PIN ) );
  output_low( LCD_RW_LINE );
  /* Send the command */
  output_c( command );
  output_low( LCD_EN_LINE );
  delay_us( 200 );
  output_high( LCD_EN_LINE );
  /* Impose a 5ms delay while the command is processed */
  delay_ms( 5 );

}


void lcd_character( char character ) /* Sends the given character to the LCD display. ASCII Numbers and letters */ /* are valid, and punctuation below 0x7F. Characters 0x00 to 0x0F are the */ /* Generated Characters, which will be blank initially. Other useful symbols */ /* and Greek characters may be found in the range 0x80 to 0xFF */ {

  output_low( LCD_RS_LINE );
  output_high( LCD_RW_LINE );
  /* Wait for busy flag */
  while( input( LCD_BUSY_PIN ) );
  output_low( LCD_RW_LINE );
  output_high( LCD_RS_LINE );
  /* Send the command */
  output_c( character );
  output_low( LCD_EN_LINE );
  delay_us( 200 );
  output_high( LCD_EN_LINE );

}


void lcd_number( int number ) /* Sends the given number to the LCD display, with up to 2 characters. This */ /* limits number to 100 */ {

  int tens = 0;
  int units = 0;
  while( number > 9 )
  {
     tens++;
     number -= 10;
  }
  units = number;
  
  lcd_character( '0' + tens );
  lcd_character( '0' + units );

}


void lcd_initialise( int size ) /* Initialises the display incase the initialisation at startup failed or the */ /* cursor size is to be changed. 'size' is LCD_SIZE_SMALL or LCD_SIZE_LARGE */ {

  int i;
  
  delay_ms( 15 );
  output_low( LCD_RS_LINE );
  for( i = 0; i < 3; i++ )
  {
     output_c( size );
     output_low( LCD_EN_LINE );
     delay_us( 200 );
     output_high( LCD_EN_LINE );
     delay_ms( 5 );
  }
  lcd_command( size );
  lcd_command( LCD_DISP_OFF );
  lcd_command( LCD_DISP_ON );
  lcd_command( LCD_CUR_INC );
  lcd_command( LCD_CLEAR );

} </source>