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 support@ccsinfo.com

more than 8 custom characters with hd44780 lcd driver CGRAM

 
Post new topic   Reply to topic    CCS Forum Index -> Code Library
View previous topic :: View next topic  
Author Message
bulentperktas



Joined: 11 Jul 2009
Posts: 2

View user's profile Send private message Send e-mail

more than 8 custom characters with hd44780 lcd driver CGRAM
PostPosted: Thu Jun 14, 2012 5:53 pm     Reply with quote

Is it possible that more than 8 custom characters with HD44780 lcd driver?

I want to say yes, but there is some of rules for this driver and also i hope so this legal way because of i have edited CCS C library's driver for LCD.C

There are two versions of code below. First one is (LCD_CGRAM_TR.c) for all PIC, second one is (LCD_CGRAM_TR_RAM.c) for higher hardware source and RAM capacities for example 18F series PIC. But both of them do same work and i have tried a few times works nice. I could not find any bugs and problem.

So if you want to use 6 pin (without R/W) just you write FALSE in related define RW line. But in this way you do not access more than 8 custom characters. you access TURKISH characters or some i created characters. I called them LCD_TURKISH and MORE_CUSTOM_CHARACTERS in the codes. You must define one of them with RW FALSE mode. We do not need R/W pin because we write just 8 characters to CGRAM in lcd_init(); function.

On the other hand 7 pin (with R/W) just you write related PIN related define RW line. With this way you access more than 8 custom characters. so you must define LCD_TURKISH and MORE_CUSTOM_CHARACTERS before your codes. The program send custom characters to CGRAM before using and show on the lcd after load immediately. We use R/W pin because of we read last cursor's position from DDRAM's address. When we load the data of CGRAM,DDRAM's lost last address. We solve this problem before read DDRAM's address. You must be careful you do not show at same time same CGRAM data. I think that you understand when you work with this codes Smile

Best regards,

Code:

LCD_CGRAM_TR.C

///////////////////////////////////////////////////////////////////////////////
///////////////////LCD_CGRAM_TR.c CONFIGURATION////////////////////////////////
//#define LCD_DATA_PORT getenv("SFR:PORTD")                                  //
//#define LCD_DATA_PORT 0xf80 // port address                                 //
//#define use_portb_lcd true                                                 //
//#define LCD_EXTENDED_NEWLINE                                               //
//#define LCD_TYPE 2           // 0=5x7, 1=5x10, 2=2 lines                   //
//#define LCD_LINE_TWO 0x40    // LCD RAM address for the second line        //
//#define LCD_LINE_LENGTH 20                                                 //
//#define __PCB__                                                            //
//#define __PCD__                                                            //
//#define __PCH__                                                            //
//#define __PCM__                                                            //
//#define LCD_ENABLE_PIN PIN_D2                                              //
//#define LCD_RS_PIN PIN_D0                                                  //
//#define LCD_RW_PIN FALSE  //FALSE for 6 pin or PIN_NAME name for 7 pin     //
//#define LCD_DATA0                                                          //
//#define LCD_DATA1                                                          //
//#define LCD_DATA2                                                          //
//#define LCD_DATA3                                                          //
//#define LCD_DATA4 PIN_C0                                                   //
//#define LCD_DATA5 PIN_C1                                                   //
//#define LCD_DATA6 PIN_C2                                                   //
//#define LCD_DATA7 PIN_C3                                                   //
//#define LCD_TURKISH                                                        //
//#define MORE_CUSTOM_CHARACTERS                                             //
///////////////////////////////////////////////////////////////////////////////
// Function Prototypes                                                       //
///////////////////////////////////////////////////////////////////////////////
//BYTE lcd_read_nibble(void);                                                //
//BYTE lcd_read_byte(void);                                                  //
//void lcd_send_nibble(BYTE n);                                              //
//void lcd_send_byte(BYTE address, BYTE n);                                  //
//void lcd_set_CGRAM_character(BYTE character);                              //
//void Character_Generator_RAM(BYTE character,int1 init);                    //
//void lcd_init(void);                                                       //
//void lcd_gotoxy(BYTE x, BYTE y);                                           //
//void lcd_putc(char c);                                                     //
//char lcd_getc(BYTE x, BYTE y);                                             //
//BYTE lcd_get_address_counter(void)                                         //
///////////////////////////////////////////////////////////////////////////////

// define the pinout.
// only required if port access is being used.
typedef struct 
{                            // This structure is overlayed
   BOOLEAN enable;           // on to an I/O port to gain
   BOOLEAN rs;               // access to the LCD pins.
   BOOLEAN rw;               // The bits are allocated from
   BOOLEAN unused;           // low order up.  ENABLE will
   int     data : 4;         // be LSB pin of that port.
  #if defined(__PCD__)       // The port used will be LCD_DATA_PORT.
   int    reserved: 8;
  #endif
} LCD_PIN_MAP;

// this is to improve compatibility with previous LCD drivers that accepted
// a define labeled 'use_portb_lcd' that configured the LCD onto port B.
#if ((defined(use_portb_lcd)) && (use_portb_lcd==TRUE))
 #define LCD_DATA_PORT getenv("SFR:PORTB")
#endif

#if defined(__PCB__)
   // these definitions only need to be modified for baseline PICs.
   // all other PICs use LCD_PIN_MAP or individual LCD_xxx pin definitions.
/*                                    EN, RS,   RW,   UNUSED,  DATA  */
 const LCD_PIN_MAP LCD_OUTPUT_MAP =  {0,  0,    0,    0,       0};
 const LCD_PIN_MAP LCD_INPUT_MAP =   {0,  0,    0,    0,       0xF};
#endif

////////////////////// END CONFIGURATION ///////////////////////////////////

#ifndef LCD_ENABLE_PIN
   #define lcd_output_enable(x) lcdlat.enable=x
   #define lcd_enable_tris()   lcdtris.enable=0
#else
   #define lcd_output_enable(x) output_bit(LCD_ENABLE_PIN, x)
   #define lcd_enable_tris()  output_drive(LCD_ENABLE_PIN)
#endif

#ifndef LCD_RS_PIN
   #define lcd_output_rs(x) lcdlat.rs=x
   #define lcd_rs_tris()   lcdtris.rs=0
#else
   #define lcd_output_rs(x) output_bit(LCD_RS_PIN, x)
   #define lcd_rs_tris()  output_drive(LCD_RS_PIN)
#endif

#ifndef LCD_RW_PIN
   #define LCD_RW_PIN TRUE
   #define lcd_output_rw(x) lcdlat.rw=x
   #define lcd_rw_tris()   lcdtris.rw=0
#elif ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
   #define lcd_output_rw(x) output_bit(LCD_RW_PIN, x)
   #define lcd_rw_tris()  output_drive(LCD_RW_PIN)
#endif

// original version of this library incorrectly labeled LCD_DATA0 as LCD_DATA4,
// LCD_DATA1 as LCD_DATA5, and so on.  this block of code makes the driver
// compatible with any code written for the original library
#if (defined(LCD_DATA0) && defined(LCD_DATA1) && defined(LCD_DATA2) && defined(LCD_DATA3) && !defined(LCD_DATA4) && !defined(LCD_DATA5) && !defined(LCD_DATA6) && !defined(LCD_DATA7))
   #define  LCD_DATA4    LCD_DATA0
   #define  LCD_DATA5    LCD_DATA1
   #define  LCD_DATA6    LCD_DATA2
   #define  LCD_DATA7    LCD_DATA3
#endif

#ifndef LCD_DATA4
#ifndef LCD_DATA_PORT
   #if defined(__PCB__)
      #define LCD_DATA_PORT      0x06     //portb
      #define set_tris_lcd(x)   set_tris_b(x)
   #else
     #if defined(PIN_D0)
      #define LCD_DATA_PORT      getenv("SFR:PORTD")     //portd
     #else
      #define LCD_DATA_PORT      getenv("SFR:PORTB")     //portb
     #endif
   #endif   
#endif

#if defined(__PCB__)
   LCD_PIN_MAP lcd, lcdlat;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT
#elif defined(__PCM__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT
   #byte lcdtris = LCD_DATA_PORT+0x80
#elif defined(__PCH__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT+9
   #byte lcdtris = LCD_DATA_PORT+0x12
#elif defined(__PCD__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #word lcd = LCD_DATA_PORT
   #word lcdlat = LCD_DATA_PORT+2
   #word lcdtris = LCD_DATA_PORT-0x02
#endif
#endif   //LCD_DATA4 not defined

#ifndef LCD_TYPE
   #define LCD_TYPE 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#ifndef LCD_LINE_TWO
   #define LCD_LINE_TWO 0x40    // LCD RAM address for the second line
#endif

#ifndef LCD_LINE_LENGTH
   #define LCD_LINE_LENGTH 20
#endif

BYTE const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_read_nibble(void);
#endif

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_read_byte(void)
{
   BYTE low,high;

 #if defined(__PCB__)
   set_tris_lcd(LCD_INPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_float(LCD_DATA4);
   output_float(LCD_DATA5);
   output_float(LCD_DATA6);
   output_float(LCD_DATA7);
  #else
   lcdtris.data = 0xF;
  #endif
 #endif
       
   lcd_output_rw(1);
   delay_cycles(1);
   lcd_output_enable(1);
   delay_cycles(1);
   high = lcd_read_nibble();
     
   lcd_output_enable(0);
   delay_cycles(1);
   lcd_output_enable(1);
   delay_us(1);
   low = lcd_read_nibble();
     
   lcd_output_enable(0);

 #if defined(__PCB__)
   set_tris_lcd(LCD_OUTPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_drive(LCD_DATA4);
   output_drive(LCD_DATA5);
   output_drive(LCD_DATA6);
   output_drive(LCD_DATA7);
  #else
   lcdtris.data = 0x0;
  #endif
 #endif

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

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_read_nibble(void)
{
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   BYTE n = 0x00;

   /* Read the data port */
   n |= input(LCD_DATA4);
   n |= input(LCD_DATA5) << 1;
   n |= input(LCD_DATA6) << 2;
   n |= input(LCD_DATA7) << 3;
   
   return(n);
  #else
   return(lcd.data);
  #endif
}
#endif

void lcd_send_nibble(BYTE n)
{
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   /* Write to the data port */
   output_bit(LCD_DATA4, bit_test(n, 0));
   output_bit(LCD_DATA5, bit_test(n, 1));
   output_bit(LCD_DATA6, bit_test(n, 2));
   output_bit(LCD_DATA7, bit_test(n, 3));
  #else     
   lcdlat.data = n;
  #endif
     
   delay_cycles(1);
   lcd_output_enable(1);
   delay_us(2);
   lcd_output_enable(0);
}

void lcd_send_byte(BYTE address, BYTE n)
{
  #if defined(__PCB__)
   set_tris_lcd(LCD_OUTPUT_MAP);
  #else
   lcd_enable_tris();
   lcd_rs_tris();
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
   #else
    lcd_rw_tris();
   #endif
  #endif

   lcd_output_rs(0);
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
    delay_ms(1);
   #else
    while ( bit_test(lcd_read_byte(),7) ) ;
   #endif
   lcd_output_rs(address);
   delay_cycles(1);
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
   #else
    lcd_output_rw(0);
   #endif
   delay_cycles(1);
   lcd_output_enable(0);
   lcd_send_nibble(n >> 4);
   lcd_send_nibble(n & 0xf);
}

#if defined(LCD_EXTENDED_NEWLINE)
unsigned int8 g_LcdX, g_LcdY;
#endif

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_get_address_counter(void);
#endif

#if (defined(LCD_TURKISH) || defined(MORE_CUSTOM_CHARACTERS))
void lcd_set_CGRAM_character(BYTE character)
{
   switch(character)
   {
      case  0:   lcd_send_byte(0,0x40);
                                               // Ç    F8421
                          lcd_send_byte(1,14); // 1     |||
                          lcd_send_byte(1,17); // 2    |   |
                          lcd_send_byte(1,16); // 3    |
                          lcd_send_byte(1,16); // 4    |
                          lcd_send_byte(1,21); // 5    | | |
                          lcd_send_byte(1,14); // 6     |||
                          lcd_send_byte(1,4);  // 7      |
                          lcd_send_byte(1,0);  // 8
                break;
      case  1:  lcd_send_byte(0,0x48);
                                               // Ğ    F8421
                          lcd_send_byte(1,14); // 1     |||
                          lcd_send_byte(1,0);  // 2
                          lcd_send_byte(1,15); // 3     ||||
                          lcd_send_byte(1,16); // 4    |
                          lcd_send_byte(1,23); // 5    | |||
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,14); // 7     |||
                          lcd_send_byte(1,0);  // 8
                break;
      case  2:  lcd_send_byte(0,0x50); 
                                               // İ    F8421
                          lcd_send_byte(1,4);  // 1      |
                          lcd_send_byte(1,0);  // 2
                          lcd_send_byte(1,4);  // 3      |
                          lcd_send_byte(1,4);  // 4      |
                          lcd_send_byte(1,4);  // 5      |
                          lcd_send_byte(1,4);  // 6      |
                          lcd_send_byte(1,4);  // 7      |
                          lcd_send_byte(1,0);  // 8
                break;
      case  3:  lcd_send_byte(0,0x58);
                                               // Ö    F8421
                          lcd_send_byte(1,10); // 1     | |
                          lcd_send_byte(1,0);  // 2
                          lcd_send_byte(1,14); // 3     |||
                          lcd_send_byte(1,17); // 4    |   |
                          lcd_send_byte(1,17); // 5    |   |
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,14); // 7     |||
                          lcd_send_byte(1,0);  // 8
                break;                         
      case  4:  lcd_send_byte(0,0x60);
                                               // Ş    F8421
                          lcd_send_byte(1,15); // 1     ||||
                          lcd_send_byte(1,16); // 2    |
                          lcd_send_byte(1,14); // 3     |||
                          lcd_send_byte(1,1);  // 4        |
                          lcd_send_byte(1,21); // 5    | | |
                          lcd_send_byte(1,14); // 6     |||
                          lcd_send_byte(1,4);  // 7      |
                          lcd_send_byte(1,0);  // 8
                break;                         
      case  5:  lcd_send_byte(0,0x68);
                                               // Ü    F8421
                          lcd_send_byte(1,10); // 1    |   |
                          lcd_send_byte(1,0);  // 2
                          lcd_send_byte(1,17); // 3    |   |
                          lcd_send_byte(1,17); // 4    |   |
                          lcd_send_byte(1,17); // 5    |   |
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,14); // 7     |||
                          lcd_send_byte(1,0);  // 8
               break;
      case  6: lcd_send_byte(0,0x70);
                                               // \p   F8421
                          lcd_send_byte(1,31); // 1    |||||
                          lcd_send_byte(1,17); // 2    |   |
                          lcd_send_byte(1,23); // 3    | |||
                          lcd_send_byte(1,20); // 4    | |
                          lcd_send_byte(1,23); // 5    | |||
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,31); // 7    |||||
                          lcd_send_byte(1,0);  // 8
                break;                         
      case  7:  lcd_send_byte(0,0x78);
                                               // \q   F8421
                          lcd_send_byte(1,31); // 1    |||||
                          lcd_send_byte(1,17); // 2    |   |
                          lcd_send_byte(1,29); // 3    ||| |
                          lcd_send_byte(1,5);  // 4      | |
                          lcd_send_byte(1,29); // 5    ||| |
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,31); // 7    |||||
                          lcd_send_byte(1,0);  // 8
                break;                         
      #if defined(MORE_CUSTOM_CHARACTERS)
      case  8:  lcd_send_byte(0,0x40);
                                               // \1   F8421
                          lcd_send_byte(1,14); // 1     |||
                          lcd_send_byte(1,27); // 2    || ||
                          lcd_send_byte(1,30); // 3    ||||
                          lcd_send_byte(1,28); // 4    |||
                          lcd_send_byte(1,30); // 5    ||||
                          lcd_send_byte(1,31); // 6    |||||
                          lcd_send_byte(1,14); // 7     |||
                          lcd_send_byte(1,0);  // 8
                 break;                         
      case   9:  lcd_send_byte(0,0x48);
                                               // \2   F8421
                          lcd_send_byte(1,14); // 1     |||
                          lcd_send_byte(1,27); // 2    || ||
                          lcd_send_byte(1,31); // 3    |||||
                          lcd_send_byte(1,28); // 4    |||
                          lcd_send_byte(1,31); // 5    |||||
                          lcd_send_byte(1,31); // 6    |||||
                          lcd_send_byte(1,14); // 7     |||
                          lcd_send_byte(1,0);  // 8
                 break;                         
      case  10:  lcd_send_byte(0,0x50);
                                               // \3   F8421
                          lcd_send_byte(1,14); // 1     |||
                          lcd_send_byte(1,27); // 2    || ||
                          lcd_send_byte(1,31); // 3    |||||
                          lcd_send_byte(1,7);  // 4      |||
                          lcd_send_byte(1,31); // 5    |||||
                          lcd_send_byte(1,31); // 6    |||||
                          lcd_send_byte(1,14); // 7     |||
                          lcd_send_byte(1,0);  // 8
                 break;                         
      case  11:  lcd_send_byte(0,0x58);
                                               // \4   F8421
                          lcd_send_byte(1,14); // 1     ||| 
                          lcd_send_byte(1,27); // 2    || ||
                          lcd_send_byte(1,15); // 3     ||||
                          lcd_send_byte(1,7);  // 4      |||
                          lcd_send_byte(1,15); // 5     ||||
                          lcd_send_byte(1,31); // 6    ||||| 
                          lcd_send_byte(1,14); // 7     |||
                          lcd_send_byte(1,0);  // 8
     
                 break;                         
      case  12:  lcd_send_byte(0,0x60);
                                               // \5   F8421
                          lcd_send_byte(1,10); // 1     | |
                          lcd_send_byte(1,10); // 2     | |
                          lcd_send_byte(1,14); // 3     |||
                          lcd_send_byte(1,17); // 4    |   |
                          lcd_send_byte(1,17); // 5    |   |
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,31); // 7    |||||
                          lcd_send_byte(1,0);  // 8
                 break;                         
      case  13:  lcd_send_byte(0,0x68);
                                               // \6   F8421
                          lcd_send_byte(1,31); // 1    |||||
                          lcd_send_byte(1,17); // 2    |   |
                          lcd_send_byte(1,17); // 3    |   |
                          lcd_send_byte(1,17); // 4    |   |
                          lcd_send_byte(1,14); // 5     |||
                          lcd_send_byte(1,10); // 6     | |
                          lcd_send_byte(1,10); // 7     | |
                          lcd_send_byte(1,0);  // 8
                 break;                         
      case  14:  lcd_send_byte(0,0x70);   
                                               // \s   F8421
                          lcd_send_byte(1,31); // 1    |||||
                          lcd_send_byte(1,17); // 2    |   |
                          lcd_send_byte(1,23); // 3    | |||
                          lcd_send_byte(1,20); // 4    | |
                          lcd_send_byte(1,23); // 5    | |||
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,31); // 7    |||||
                          lcd_send_byte(1,0);  // 8
                 break;                         
      case  15:  lcd_send_byte(0,0x78);
                                               // \t   F8421
                          lcd_send_byte(1,31); // 1    |||||
                          lcd_send_byte(1,17); // 2    |   |
                          lcd_send_byte(1,29); // 3    ||| |
                          lcd_send_byte(1,5);  // 4      | |
                          lcd_send_byte(1,29); // 5    ||| |
                          lcd_send_byte(1,17); // 6    |   |
                          lcd_send_byte(1,31); // 7    |||||
                          lcd_send_byte(1,0);  // 8
                  break;
      #endif
   }
}

void Character_Generator_RAM(BYTE character,int1 init)
{
   #if (defined(LCD_RW_PIN) && (LCD_RW_PIN==FALSE))
   if(init)
   {
     lcd_set_CGRAM_character(character);
   }
   else lcd_send_byte(1,character%8);
   #else
   BYTE address;
   address=lcd_get_address_counter();
   lcd_set_CGRAM_character(character);
   lcd_send_byte(0,0X80|address);
   lcd_send_byte(1,character%8);
   #endif   
}
#endif

void lcd_init(void)
{
   BYTE i;

 #if defined(__PCB__)
   set_tris_lcd(LCD_OUTPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_drive(LCD_DATA4);
   output_drive(LCD_DATA5);
   output_drive(LCD_DATA6);
   output_drive(LCD_DATA7);
  #else
   lcdtris.data = 0x0;
  #endif
   lcd_enable_tris();
   lcd_rs_tris();
  #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
  #else
   lcd_rw_tris();
  #endif
 #endif
   lcd_output_rs(0);
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
   #else
    lcd_output_rw(0);
   #endif
   lcd_output_enable(0);
   
   //delay_ms(15);               //////////////////////////////
   for(i=1;i<=3;++i)
   {
       lcd_send_nibble(3);
       delay_ms(5);
   }
   lcd_send_nibble(2);
   //delay_ms(5);               //////////////////////////////
   for(i=0;i<=3;++i)
      lcd_send_byte(0,LCD_INIT_STRING[i]);

  #if defined(LCD_EXTENDED_NEWLINE)
   g_LcdX = 0;
   g_LcdY = 0;
  #endif

  #if (defined(LCD_TURKISH) && ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE)))
   for(i=0;i<=7;i++)
    Character_Generator_RAM(i,true);
   lcd_send_byte(0,0x01);
  #elif (defined(MORE_CUSTOM_CHARACTERS)&& ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))) 
   for(i=8;i<=15;i++)
    Character_Generator_RAM(i,true);
    lcd_send_byte(0,0x01);
  #endif
}

void lcd_gotoxy(BYTE x, BYTE y)
{
   BYTE address;
   
   switch(y) {
     case 1 : address=0x80;break;
     case 2 : address=0xc0;break;
     case 3 : address=0x94;break;
     case 4 : address=0xd4;break;
   }
     
   address+=x-1;
   lcd_send_byte(0,0x80|address);

  #if defined(LCD_EXTENDED_NEWLINE)
   g_LcdX = x - 1;
   g_LcdY = y - 1;
  #endif
}

void lcd_putc(char c)
{
   switch (c)
   {
      case '\a'   :  lcd_gotoxy(1,1);     break;

      case '\f'   :  lcd_send_byte(0,1);
                     delay_ms(2);
                    #if defined(LCD_EXTENDED_NEWLINE)
                     g_LcdX = 0;
                     g_LcdY = 0;
                    #endif
                     break;
     
     #if defined(LCD_TURKISH)
     case 'Ç'    :   Character_Generator_RAM(0,false);
                     break;
     case 'Ğ'    :   Character_Generator_RAM(1,false);
                     break;
     case 'İ'    :   Character_Generator_RAM(2,false);
                     break;
     case 'Ö'    :   Character_Generator_RAM(3,false);
                     break;
     case 'Ş'    :   Character_Generator_RAM(4,false);
                     break;
     case 'Ü'    :   Character_Generator_RAM(5,false);
                     break;
     case '\p'   :   Character_Generator_RAM(6,false);
                     break;
     case '\q'   :   Character_Generator_RAM(7,false);
                     break;
     #endif
     #if defined(MORE_CUSTOM_CHARACTERS))
     case '\1'   :   Character_Generator_RAM(8,false);
                     break;
     case '\2'   :   Character_Generator_RAM(9,false);
                     break;
     case '\3'   :   Character_Generator_RAM(10,false);
                     break;
     case '\4'   :   Character_Generator_RAM(11,false);
                     break;
     case '\5'   :   Character_Generator_RAM(12,false);
                     break;
     case '\6'   :   Character_Generator_RAM(13,false);
                     break;
     case '\s'   :   Character_Generator_RAM(14,false);
                     break;
     case '\t'   :   Character_Generator_RAM(15,false);
                     break;
     #endif
     #if defined(LCD_EXTENDED_NEWLINE)
      case '\r'   :  lcd_gotoxy(1, g_LcdY+1);   break;
      case '\n'   :
         while (g_LcdX++ < LCD_LINE_LENGTH)
         {
            lcd_send_byte(1, ' ');
         }
         lcd_gotoxy(1, g_LcdY+2);
         break;
     #else
      case '\n'   : lcd_gotoxy(1,2);        break;
     #endif
     
      case '\b'   : lcd_send_byte(0,0x10);  break;
     
     #if defined(LCD_EXTENDED_NEWLINE)
      default     :
         if (g_LcdX < LCD_LINE_LENGTH)
         {
            lcd_send_byte(1, c);
            g_LcdX++;
         }
         break;
     #else
      default     : lcd_send_byte(1,c);     break;
     #endif
   }
}

#if (defined(LCD_RW_PIN) && (LCD_RW_PIN==FALSE))
#else
char lcd_getc(BYTE x, BYTE y)
{
   char value;

   lcd_gotoxy(x,y);
   while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
   lcd_output_rs(1);
   value = lcd_read_byte();
   lcd_output_rs(0);
   
   return(value);
}

BYTE lcd_get_address_counter(void)
{
   BYTE address;

   lcd_output_rs(0);
   address = lcd_read_byte();
   lcd_output_rs(1);
   
   return(address);
}
#endif



Code:


LCD_CGRAM_TR_RAM.C

///////////////////////////////////////////////////////////////////////////////
///////////////////LCD_CGRAM_TR_RAM.c CONFIGURATION////////////////////////////
//#define LCD_DATA_PORT getenv("SFR:PORTD")                                  //
//#define LCD_DATA_PORT 0xf80 // port adress                                 //
//#define use_portb_lcd true                                                 //
//#define LCD_EXTENDED_NEWLINE                                               //
//#define LCD_TYPE 2           // 0=5x7, 1=5x10, 2=2 lines                   //
//#define LCD_LINE_TWO 0x40    // LCD RAM address for the second line        //
//#define LCD_LINE_LENGTH 20                                                 //
//#define __PCB__                                                            //
//#define __PCD__                                                            //
//#define __PCH__                                                            //
//#define __PCM__                                                            //
//#define LCD_ENABLE_PIN PIN_D2                                              //
//#define LCD_RS_PIN PIN_D0                                                  //
//#define LCD_RW_PIN FALSE  //FALSE for 6 pin or PIN_NAME name for 7 pin     //
//#define LCD_DATA0                                                          //
//#define LCD_DATA1                                                          //
//#define LCD_DATA2                                                          //
//#define LCD_DATA3                                                          //
//#define LCD_DATA4 PIN_C0                                                   //
//#define LCD_DATA5 PIN_C1                                                   //
//#define LCD_DATA6 PIN_C2                                                   //
//#define LCD_DATA7 PIN_C3                                                   //
//#define LCD_TURKISH                                                        //
//#define MORE_CUSTOM_CHARACTERS                                             //
///////////////////////////////////////////////////////////////////////////////
// Function Prototypes                                                       //
///////////////////////////////////////////////////////////////////////////////
//BYTE lcd_read_nibble(void);                                                //
//BYTE lcd_read_byte(void);                                                  //
//void lcd_send_nibble(BYTE n);                                              //
//void lcd_send_byte(BYTE address, BYTE n);                                  //
//void lcd_set_CGRAM_adress(BYTE character);                                 //
//void Character_Generator_RAM(BYTE character,int1 init);                    //
//void lcd_init(void);                                                       //
//void lcd_gotoxy(BYTE x, BYTE y);                                           //
//void lcd_putc(char c);                                                     //
//char lcd_getc(BYTE x, BYTE y);                                             //
//BYTE lcd_get_address_counter(void);                                        //
///////////////////////////////////////////////////////////////////////////////

// define the pinout.
// only required if port access is being used.
typedef struct 
{                            // This structure is overlayed
   BOOLEAN enable;           // on to an I/O port to gain
   BOOLEAN rs;               // access to the LCD pins.
   BOOLEAN rw;               // The bits are allocated from
   BOOLEAN unused;           // low order up.  ENABLE will
   int     data : 4;         // be LSB pin of that port.
  #if defined(__PCD__)       // The port used will be LCD_DATA_PORT.
   int    reserved: 8;
  #endif
} LCD_PIN_MAP;

// this is to improve compatability with previous LCD drivers that accepted
// a define labeled 'use_portb_lcd' that configured the LCD onto port B.
#if ((defined(use_portb_lcd)) && (use_portb_lcd==TRUE))
 #define LCD_DATA_PORT getenv("SFR:PORTB")
#endif

#if defined(__PCB__)
   // these definitions only need to be modified for baseline PICs.
   // all other PICs use LCD_PIN_MAP or individual LCD_xxx pin definitions.
/*                                    EN, RS,   RW,   UNUSED,  DATA  */
 const LCD_PIN_MAP LCD_OUTPUT_MAP =  {0,  0,    0,    0,       0};
 const LCD_PIN_MAP LCD_INPUT_MAP =   {0,  0,    0,    0,       0xF};
#endif

////////////////////// END CONFIGURATION ///////////////////////////////////

#ifndef LCD_ENABLE_PIN
   #define lcd_output_enable(x) lcdlat.enable=x
   #define lcd_enable_tris()   lcdtris.enable=0
#else
   #define lcd_output_enable(x) output_bit(LCD_ENABLE_PIN, x)
   #define lcd_enable_tris()  output_drive(LCD_ENABLE_PIN)
#endif

#ifndef LCD_RS_PIN
   #define lcd_output_rs(x) lcdlat.rs=x
   #define lcd_rs_tris()   lcdtris.rs=0
#else
   #define lcd_output_rs(x) output_bit(LCD_RS_PIN, x)
   #define lcd_rs_tris()  output_drive(LCD_RS_PIN)
#endif

#ifndef LCD_RW_PIN
   #define LCD_RW_PIN TRUE
   #define lcd_output_rw(x) lcdlat.rw=x
   #define lcd_rw_tris()   lcdtris.rw=0
#elif ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
   #define lcd_output_rw(x) output_bit(LCD_RW_PIN, x)
   #define lcd_rw_tris()  output_drive(LCD_RW_PIN)
#endif

// original version of this library incorrectly labeled LCD_DATA0 as LCD_DATA4,
// LCD_DATA1 as LCD_DATA5, and so on.  this block of code makes the driver
// compatible with any code written for the original library
#if (defined(LCD_DATA0) && defined(LCD_DATA1) && defined(LCD_DATA2) && defined(LCD_DATA3) && !defined(LCD_DATA4) && !defined(LCD_DATA5) && !defined(LCD_DATA6) && !defined(LCD_DATA7))
   #define  LCD_DATA4    LCD_DATA0
   #define  LCD_DATA5    LCD_DATA1
   #define  LCD_DATA6    LCD_DATA2
   #define  LCD_DATA7    LCD_DATA3
#endif

#ifndef LCD_DATA4
#ifndef LCD_DATA_PORT
   #if defined(__PCB__)
      #define LCD_DATA_PORT      0x06     //portb
      #define set_tris_lcd(x)   set_tris_b(x)
   #else
     #if defined(PIN_D0)
      #define LCD_DATA_PORT      getenv("SFR:PORTD")     //portd
     #else
      #define LCD_DATA_PORT      getenv("SFR:PORTB")     //portb
     #endif
   #endif   
#endif

#if defined(__PCB__)
   LCD_PIN_MAP lcd, lcdlat;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT
#elif defined(__PCM__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT
   #byte lcdtris = LCD_DATA_PORT+0x80
#elif defined(__PCH__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT+9
   #byte lcdtris = LCD_DATA_PORT+0x12
#elif defined(__PCD__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #word lcd = LCD_DATA_PORT
   #word lcdlat = LCD_DATA_PORT+2
   #word lcdtris = LCD_DATA_PORT-0x02
#endif
#endif   //LCD_DATA4 not defined

#ifndef LCD_TYPE
   #define LCD_TYPE 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#ifndef LCD_LINE_TWO
   #define LCD_LINE_TWO 0x40    // LCD RAM address for the second line
#endif

#ifndef LCD_LINE_LENGTH
   #define LCD_LINE_LENGTH 20
#endif

BYTE const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_read_nibble(void);
#endif

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_read_byte(void)
{
   BYTE low,high;

 #if defined(__PCB__)
   set_tris_lcd(LCD_INPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_float(LCD_DATA4);
   output_float(LCD_DATA5);
   output_float(LCD_DATA6);
   output_float(LCD_DATA7);
  #else
   lcdtris.data = 0xF;
  #endif
 #endif
       
   lcd_output_rw(1);
   delay_cycles(1);
   lcd_output_enable(1);
   delay_cycles(1);
   high = lcd_read_nibble();
     
   lcd_output_enable(0);
   delay_cycles(1);
   lcd_output_enable(1);
   delay_us(1);
   low = lcd_read_nibble();
     
   lcd_output_enable(0);

 #if defined(__PCB__)
   set_tris_lcd(LCD_OUTPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_drive(LCD_DATA4);
   output_drive(LCD_DATA5);
   output_drive(LCD_DATA6);
   output_drive(LCD_DATA7);
  #else
   lcdtris.data = 0x0;
  #endif
 #endif

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

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_read_nibble(void)
{
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   BYTE n = 0x00;

   /* Read the data port */
   n |= input(LCD_DATA4);
   n |= input(LCD_DATA5) << 1;
   n |= input(LCD_DATA6) << 2;
   n |= input(LCD_DATA7) << 3;
   
   return(n);
  #else
   return(lcd.data);
  #endif
}
#endif

void lcd_send_nibble(BYTE n)
{
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   /* Write to the data port */
   output_bit(LCD_DATA4, bit_test(n, 0));
   output_bit(LCD_DATA5, bit_test(n, 1));
   output_bit(LCD_DATA6, bit_test(n, 2));
   output_bit(LCD_DATA7, bit_test(n, 3));
  #else     
   lcdlat.data = n;
  #endif
     
   delay_cycles(1);
   lcd_output_enable(1);
   delay_us(2);
   lcd_output_enable(0);
}

void lcd_send_byte(BYTE address, BYTE n)
{
  #if defined(__PCB__)
   set_tris_lcd(LCD_OUTPUT_MAP);
  #else
   lcd_enable_tris();
   lcd_rs_tris();
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
   #else
    lcd_rw_tris();
   #endif
  #endif

   lcd_output_rs(0);
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
    delay_ms(1);
   #else
    while ( bit_test(lcd_read_byte(),7) ) ;
   #endif
   lcd_output_rs(address);
   delay_cycles(1);
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
   #else
    lcd_output_rw(0);
   #endif
   delay_cycles(1);
   lcd_output_enable(0);
   lcd_send_nibble(n >> 4);
   lcd_send_nibble(n & 0xf);
}

#if defined(LCD_EXTENDED_NEWLINE)
unsigned int8 g_LcdX, g_LcdY;
#endif

#if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
#else
BYTE lcd_get_address_counter(void);
#endif

#if (defined(LCD_TURKISH) || defined(MORE_CUSTOM_CHARACTERS))
void lcd_set_CGRAM_adress(BYTE character)
{
     switch(character%8)
     {
      case 0: lcd_send_byte(0,0x40);
              break;
      case 1: lcd_send_byte(0,0x48);
              break;
      case 2: lcd_send_byte(0,0x50);
              break;
      case 3: lcd_send_byte(0,0x58);
              break;
      case 4: lcd_send_byte(0,0x60);
              break;
      case 5: lcd_send_byte(0,0x68);
              break;
      case 6: lcd_send_byte(0,0x70);
              break;
      case 7: lcd_send_byte(0,0x78);
              break;
     }
}

void Character_Generator_RAM(BYTE character,int1 init)
{
   BYTE q;
   BYTE CGRAM_EXTENDED[16][8]={ 14,17,16,16,21,14, 4, 0,  // Ç
                                14, 0,15,16,23,17,14, 0,  // Ğ
                                 4, 0, 4, 4, 4, 4, 4, 0,  // İ
                                10, 0,14,17,17,17,14, 0,  // Ö
                                15,16,14, 1,21,14, 4, 0,  // Ş
                                10, 0,17,17,17,17,14, 0,  // Ü
                                31,17,23,20,23,17,31, 0,  // \p
                                31,17,29, 5,29,17,31, 0,  // \q                               
                                14,27,30,28,30,31,14, 0,  // \1
                                14,27,31,28,31,31,14, 0,  // \2
                                14,27,31, 7,31,31,14, 0,  // \3
                                14,27,15, 7,15,31,14, 0,  // \4
                                10,10,14,17,17,17,31, 0,  // \5
                                31,17,17,17,14,10,10, 0,  // \6
                                31,17,23,20,23,17,31, 0,  // \s
                                31,17,29, 5,29,17,31, 0,  // \t                               
                              };
/*
   //////////////////////////////////////////////////////////////////////////
   ///////CGRAM0////////////CGRAM1////////////CGRAM2////////////CGRAM3///////
   //////////////////////////////////////////////////////////////////////////
   //  Ç  F8421      //  Ğ  F8421      //  İ  F8421      //  Ö  F8421      //
   //  1   |||   14  //  1   |||   14  //  1    |     4  //  1   | |   10  //
   //  2  |   |  17  //  2          0  //  2          0  //  2          0  //
   //  3  |      16  //  3   ||||  15  //  3    |     4  //  3   |||   14  //
   //  4  |      16  //  4  |      16  //  4    |     4  //  4  |   |  17  //
   //  5  | | |  21  //  5  | |||  23  //  5    |     4  //  5  |   |  17  //
   //  6   |||   14  //  6  |   |  17  //  6    |     4  //  6  |   |  17  //
   //  7    |     4  //  7   |||   14  //  7    |     4  //  7   |||   14  //
   //  8          0  //  8          0  //  8          0  //  8          0  //
   //////////////////////////////////////////////////////////////////////////
   ///////CGRAM4////////////CGRAM5////////////CGRAM6////////////CGRAM7///////
   //////////////////////////////////////////////////////////////////////////
   //  Ş  F8421      //  Ü  F8421      // \p  F8421      // \q  F8421      //
   //  1   ||||  15  //  1   | |   10  //  1  |||||  31  //  1  |||||  31  //
   //  2  |      16  //  2          0  //  2  |   |  17  //  2  |   |  17  //
   //  3   |||   14  //  3  |   |  17  //  3  | |||  23  //  3  ||| |  29  //
   //  4      |   1  //  4  |   |  17  //  4  | |    20  //  4    | |   5  //
   //  5  | | |  21  //  5  |   |  17  //  5  | |||  23  //  5  ||| |  29  //
   //  6   |||   14  //  6  |   |  17  //  6  |   |  17  //  6  |   |  17  //
   //  7    |     4  //  7   |||   14  //  7  |||||  31  //  7  |||||  31  //
   //  8          0  //  8          0  //  8          0  //  8          0  //
   //////////////////////////////////////////////////////////////////////////
   ///////CGRAM0////////////CGRAM1////////////CGRAM2////////////CGRAM3///////
   //////////////////////////////////////////////////////////////////////////
   // \1  F8421      // \2  F8421      // \3  F8421      // \4  F8421      //
   //  1   |||   14  //  1   |||   14  //  1   |||   14  //  1   |||   14  //
   //  2  || ||  27  //  2  || ||  27  //  2  || ||  27  //  2  || ||  27  //
   //  3  ||||   30  //  3  |||||  31  //  3  |||||  31  //  3   ||||  15  //
   //  4  |||    28  //  4  |||    28  //  4    |||   7  //  4    |||   7  //
   //  5  ||||   30  //  5  |||||  31  //  5  |||||  31  //  5   ||||  15  //
   //  6  |||||  31  //  6  |||||  31  //  6  |||||  31  //  6  |||||  31  //
   //  7   |||   14  //  7   |||   14  //  7   |||   14  //  7   |||   14  //
   //  8          0  //  8          0  //  8          0  //  8          0  //
   //////////////////////////////////////////////////////////////////////////
   ///////CGRAM4////////////CGRAM5////////////CGRAM6////////////CGRAM7///////
   //////////////////////////////////////////////////////////////////////////
   // \5  F8421      // \6  F8421      // \p  F8421      // \q  F8421      //
   //  1   | |   10  //  1  |||||  31  //  1  |||||  31  //  1  |||||  31  //
   //  2   | |   10  //  2  |   |  17  //  2  |   |  17  //  2  |   |  17  //
   //  3   |||   14  //  3  |   |  17  //  3  | |||  23  //  3  ||| |  29  //
   //  4  |   |  17  //  4  |   |  17  //  4  | |    20  //  4    | |   5  //
   //  5  |   |  17  //  5   |||   14  //  5  | |||  23  //  5  ||| |  29  //
   //  6  |   |  17  //  6   | |   10  //  6  |   |  17  //  6  |   |  17  //
   //  7  |||||  31  //  7   | |   10  //  7  |||||  31  //  7  |||||  31  //
   //  8          0  //  8          0  //  8          0  //  8          0  //
   //////////////////////////////////////////////////////////////////////////
*/

  #if (defined(LCD_RW_PIN) && (LCD_RW_PIN==FALSE))
  if(init)
   {
    lcd_set_CGRAM_adress(character);
    for(q=0;q<=7;q++)
     lcd_send_byte(1,CGRAM_EXTENDED[character][q]);
   }
   else lcd_send_byte(1,character%8);
  #else
  BYTE address;
  address=lcd_get_address_counter();
  lcd_set_CGRAM_adress(character);
   for(q=0;q<=7;q++)
    lcd_send_byte(1,CGRAM_EXTENDED[character][q]);
   lcd_send_byte(0,0X80|address);
   lcd_send_byte(1,character%8);
  #endif
 
}
#endif

void lcd_init(void)
{
   BYTE i;

 #if defined(__PCB__)
   set_tris_lcd(LCD_OUTPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_drive(LCD_DATA4);
   output_drive(LCD_DATA5);
   output_drive(LCD_DATA6);
   output_drive(LCD_DATA7);
  #else
   lcdtris.data = 0x0;
  #endif
   lcd_enable_tris();
   lcd_rs_tris();
  #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
  #else
   lcd_rw_tris();
  #endif
 #endif
   lcd_output_rs(0);
   #if ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))
   #else
    lcd_output_rw(0);
   #endif
   lcd_output_enable(0);
   
   //delay_ms(15);               //////////////////////////////
   for(i=1;i<=3;++i)
   {
       lcd_send_nibble(3);
       delay_ms(5);
   }
   lcd_send_nibble(2);
   //delay_ms(5);               //////////////////////////////
   for(i=0;i<=3;++i)
      lcd_send_byte(0,LCD_INIT_STRING[i]);

  #if defined(LCD_EXTENDED_NEWLINE)
   g_LcdX = 0;
   g_LcdY = 0;
  #endif

  #if (defined(LCD_TURKISH) && ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE)))
   for(i=0;i<=7;i++)
    Character_Generator_RAM(i,true);
   lcd_send_byte(0,0x01);
  #elif (defined(MORE_CUSTOM_CHARACTERS)&& ((defined(LCD_RW_PIN)) && (LCD_RW_PIN==FALSE))) 
   for(i=8;i<=15;i++)
    Character_Generator_RAM(i,true);
    lcd_send_byte(0,0x01);
  #endif
}

void lcd_gotoxy(BYTE x, BYTE y)
{
   BYTE address;
   
   switch(y) {
     case 1 : address=0x80;break;
     case 2 : address=0xc0;break;
     case 3 : address=0x94;break;
     case 4 : address=0xd4;break;
   }
     
   address+=x-1;
   lcd_send_byte(0,0x80|address);

  #if defined(LCD_EXTENDED_NEWLINE)
   g_LcdX = x - 1;
   g_LcdY = y - 1;
  #endif
}

void lcd_putc(char c)
{
   switch (c)
   {
      case '\a'   :  lcd_gotoxy(1,1);     break;

      case '\f'   :  lcd_send_byte(0,1);
                     delay_ms(2);
                    #if defined(LCD_EXTENDED_NEWLINE)
                     g_LcdX = 0;
                     g_LcdY = 0;
                    #endif
                     break;
     
     #if defined(LCD_TURKISH)
     case 'Ç'    :   Character_Generator_RAM(0,false);
                     break;
     case 'Ğ'    :   Character_Generator_RAM(1,false);
                     break;
     case 'İ'    :   Character_Generator_RAM(2,false);
                     break;
     case 'Ö'    :   Character_Generator_RAM(3,false);
                     break;
     case 'Ş'    :   Character_Generator_RAM(4,false);
                     break;
     case 'Ü'    :   Character_Generator_RAM(5,false);
                     break;
     case '\p'   :   Character_Generator_RAM(6,false);
                     break;
     case '\q'   :   Character_Generator_RAM(7,false);
                     break;
     #endif
     #if defined(MORE_CUSTOM_CHARACTERS))
     case '\1'   :   Character_Generator_RAM(8,false);
                     break;
     case '\2'   :   Character_Generator_RAM(9,false);
                     break;
     case '\3'   :   Character_Generator_RAM(10,false);
                     break;
     case '\4'   :   Character_Generator_RAM(11,false);
                     break;
     case '\5'   :   Character_Generator_RAM(12,false);
                     break;
     case '\6'   :   Character_Generator_RAM(13,false);
                     break;
     case '\s'   :   Character_Generator_RAM(14,false);
                     break;
     case '\t'   :   Character_Generator_RAM(15,false);
                     break;
     #endif
     #if defined(LCD_EXTENDED_NEWLINE)
      case '\r'   :  lcd_gotoxy(1, g_LcdY+1);   break;
      case '\n'   :
         while (g_LcdX++ < LCD_LINE_LENGTH)
         {
            lcd_send_byte(1, ' ');
         }
         lcd_gotoxy(1, g_LcdY+2);
         break;
     #else
      case '\n'   : lcd_gotoxy(1,2);        break;
     #endif
     
      case '\b'   : lcd_send_byte(0,0x10);  break;
     
     #if defined(LCD_EXTENDED_NEWLINE)
      default     :
         if (g_LcdX < LCD_LINE_LENGTH)
         {
            lcd_send_byte(1, c);
            g_LcdX++;
         }
         break;
     #else
      default     : lcd_send_byte(1,c);     break;
     #endif
   }
}

#if (defined(LCD_RW_PIN) && (LCD_RW_PIN==FALSE))
#else
char lcd_getc(BYTE x, BYTE y)
{
   char value;

   lcd_gotoxy(x,y);
   while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
   lcd_output_rs(1);
   value = lcd_read_byte();
   lcd_output_rs(0);
   
   return(value);
}

BYTE lcd_get_address_counter(void)
{
   BYTE address;

   lcd_output_rs(0);
   address = lcd_read_byte();
   lcd_output_rs(1);
   
   return(address);
}
#endif



Code:


example_1.c

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NODEBUG,BROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=4000000)
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0                                 
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_C0
#define LCD_DATA5 PIN_C1
#define LCD_DATA6 PIN_C2
#define LCD_DATA7 PIN_C3
#define MORE_CUSTOM_CHARACTERS
#define LCD_TURKISH
#include <LCD_CGRAM_TR.c>

unsigned int i;

void erase_pacman(int row, int column)
{
   int x,y,z;
   printf(lcd_putc, "\f   \p PACMAN \q   \n   CHARACTER    ");
   delay_ms(2000);
   for(y=1;y<=row;y++)
   {
      z=column;
      for(x=1;x<=column;x++)
      {
         if(y%2)lcd_gotoxy(x,y);
         else lcd_gotoxy(z,y);
         if(x%2 && y%2) printf(lcd_putc, "\1");
         else if (x%2==0 && y%2) printf(lcd_putc, "\2");
         else if (x%2 && y%2==0) printf(lcd_putc, "\3");
         else if (x%2==0 && y%2==0) printf(lcd_putc, "\4");
         delay_ms(200);
         printf(lcd_putc, "\b ");
         z--;
      }
   }
}

void main()
{
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_adc_ports(NO_ANALOGS);
   setup_spi(FALSE);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   lcd_init();
   erase_pacman(2,16);
 
   while(1)
   {
      printf(lcd_putc, "\f\s");
      delay_ms(2000);
      printf(lcd_putc, "\1");
      delay_ms(2000);
      printf(lcd_putc, "\2");
      delay_ms(2000);
      printf(lcd_putc, "\3");
      delay_ms(2000);
      printf(lcd_putc, "\4");
      delay_ms(2000);
      printf(lcd_putc, "\5");
      delay_ms(2000);
      printf(lcd_putc, "\6");
      delay_ms(2000);
      printf(lcd_putc, "Ç");
      delay_ms(2000);
      printf(lcd_putc, "Ğ");
      delay_ms(2000);
      printf(lcd_putc, "İ");
      delay_ms(2000);
      printf(lcd_putc, "Ö");
      delay_ms(2000);
      printf(lcd_putc, "Ş");
      delay_ms(2000);
      printf(lcd_putc, "Ü");
      delay_ms(2000);
      printf(lcd_putc, "\p");
      delay_ms(2000);
      printf(lcd_putc, "\q");
      delay_ms(2000);
      printf(lcd_putc, "\t");
      delay_ms(2000);
      printf(lcd_putc, "\n\s");
      delay_ms(2000);
      printf(lcd_putc, "\1");
      delay_ms(2000);
      printf(lcd_putc, "\2");
      delay_ms(2000);
      printf(lcd_putc, "\3");
      delay_ms(2000);
      printf(lcd_putc, "\4");
      delay_ms(2000);
      printf(lcd_putc, "\5");
      delay_ms(2000);
      printf(lcd_putc, "\6");
      delay_ms(2000);
      printf(lcd_putc, "Ç");
      delay_ms(2000);
      printf(lcd_putc, "Ğ");
      delay_ms(2000);
      printf(lcd_putc, "İ");
      delay_ms(2000);
      printf(lcd_putc, "Ö");
      delay_ms(2000);
      printf(lcd_putc, "Ş");
      delay_ms(2000);
      printf(lcd_putc, "Ü");
      delay_ms(2000);
      printf(lcd_putc, "\p");
      delay_ms(2000);
      printf(lcd_putc, "\q");
      delay_ms(2000);
      printf(lcd_putc, "\t");
      delay_ms(2000);
      lcd_gotoxy(1,1);
      for(i=0;i<=255;i++)
      { 
         lcd_gotoxy(1,1);
         printf(lcd_putc,"%c          %05d",i,i);
         delay_ms(200);
         printf(lcd_putc,"\n\s\1\2\3\4\5\6\p\qÇĞİÖŞÜ\t");
      }
   }
}



Code:


example_2.c

#include <18f4580.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOMCLR
#use delay(clock=8000000)
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0                                 
#define LCD_RW_PIN FALSE
#define LCD_DATA4 PIN_C0
#define LCD_DATA5 PIN_C1
#define LCD_DATA6 PIN_C2
#define LCD_DATA7 PIN_C3
//#define MORE_CUSTOM_CHARACTERS
#define LCD_TURKISH
#include <LCD_CGRAM_TR_RAM.c>

unsigned int i;

void main()
{
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_adc_ports(NO_ANALOGS);
   setup_spi(FALSE);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   lcd_init();
   printf(lcd_putc,"   TURKISH    \n   CHARACTERS   ");
 
   while(1)
   {
      printf(lcd_putc, "\f\p");
      delay_ms(2000);
      printf(lcd_putc, "Ç");
      delay_ms(2000);
      printf(lcd_putc, "Ğ");
      delay_ms(2000);
      printf(lcd_putc, "İ");
      delay_ms(2000);
      printf(lcd_putc, "Ö");
      delay_ms(2000);
      printf(lcd_putc, "Ş");
      delay_ms(2000);
      printf(lcd_putc, "Ü");
      delay_ms(2000);
      printf(lcd_putc, "\q");
      delay_ms(2000);
      printf(lcd_putc, "\f");
      for(i=0;i<=255;i++)
      { 
         lcd_gotoxy(1,1);
         printf(lcd_putc,"%c          %05d",i,i);
         delay_ms(200);
         printf(lcd_putc,"\n\pÇĞİÖŞÜ\q");
      }
   }
}


_________________
Bülent PERKTAŞ


Last edited by bulentperktas on Sat Oct 01, 2016 4:48 pm; edited 2 times in total
Arsenic



Joined: 23 Sep 2016
Posts: 11

View user's profile Send private message

PostPosted: Tue Nov 14, 2017 7:05 pm     Reply with quote

Hi! Thanks for sharing your work. I note it that your library takes -along with my code- 91 percent of the ram of my uC. But I don't care that for now.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> Code Library 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