יום שני, 20 ביוני 2011

פונקציות בסיסיות של LCD בשפת C


פונקציה ראשית שקוראת ל-LCD חייבת להכיר אוגרים בסיסים (REG_89C51)  וסוגי משתנים (type_var_H.h), רגל RS (בחירת אוגר\נתונים) מחוברת לרגל  P3_7, רגל בחירת מצב קריאה\כתיבה לרגל P3_6, רגל אישור מחוברת לרגל P3_5, ומידע עובר דרך P2.

//===========================================================================
void lcd_wait()
{
   u8 lcd_t1;

   for (lcd_t1 = 1 ; lcd_t1 < 5 ; lcd_t1++);   // let the display controller 
                                               // time to execute the command
}//lcd_wait()

//===========================================================================
void set_lcd(bit char_command,u8 lcd_d)
{
   RW_lcd = 0 ;        
   E_lcd = 1 ;
   RS_lcd = char_command ;
   DATA_lcd = lcd_d ;
   E_lcd = 0 ;
   lcd_wait();
   E_lcd = 1 ;
   lcd_wait();
}//set_lcd(bit char_command,char lcd_d)

=============
void lcd_setup()
{
   u8 lcd_i;

   lcd_num  = 0 ;
   lcd_line = 0 ;

   for (lcd_i = 0 ; lcd_i < 10 ; lcd_i++)  // Recovery time after power on
   lcd_wait();
   set_lcd(0,0x3c);// 1- 0 0 1 DL N F 0 0    - FUNCTION SET - 8bit interface
   set_lcd(0,0x3c);// 2- 0 0 1 DL N F 0 0    - FUNCTION SET - 8bit interface
   set_lcd(0,0x3c);// 3- 0 0 1 DL N F 0 0    - FUNCTION SET - 8bit interface
   set_lcd(0,0x0c);// 4- 0 0 0 0 1 D C B     - DISPLAY ON/OFF CONTROL
   set_lcd(0,0x06);// 5- 0 0 0 0 0 1 I/D SH  - ENTRY MODE SET
   set_lcd(0,0x14);// 6- 0 0 0 1 S/C R/L 0 0 - CURSOR OR DISPLAY SHIFT
   set_lcd(0,0x01);// 7- 0 0 0 0 0 0 0 1     - DISPLAY CLEAR
}//lcd_setup()
  
     //===========================================================================
void cursor_on()
  {
   set_lcd(0,0x0e);//   0 0 0 0 1 D C B    - DISPLAY ON/OFF CONTROL
  }//cursor_on()
//=========================================================================
void cursor_off()
  {
   set_lcd(0,0x0c);//   0 0 0 0 1 D C B    - DISPLAY ON/OFF CONTROL
  }//cursor_off()   
//=========================================================================
 void blink_on()
  {
   set_lcd(0,0x0f);//   0 0 0 0 1 D C B    - DISPLAY ON/OFF CONTROL
  }//blink_on()

//===========================================================================
 void blink_off()
  {
   set_lcd(0,0x0e);//   0 0 0 0 1 D C B    - DISPLAY ON/OFF CONTROL
  }//blink_off()

//===========================================================================
void lcd_on()
  {
   set_lcd(0,0x0c);//   0 0 0 0 1 D C B    - DISPLAY ON/OFF CONTROL
}//lcd_on()

//===========================================================================
void lcd_off()
{
   set_lcd(0,0x08);//   0 0 0 0 1 D C B     - DISPLAY ON/OFF CONTROL
}//lcd_off()

//===========================================================================
void lcd_clear()
{
   lcd_num = 0 ;
   lcd_line = 0 ;
   set_lcd(0,0x01);//  0 0 0 0 0 0 0 1      - DISPLAY CLEAR
}//lcd_clear()

//===========================================================================
void lcd_home()
{
   lcd_num = 0 ;
   lcd_line = 0 ;
   set_lcd(0,0x02);//  0 0 0 0 0 0 1 0      - DISPLAY HOME
}//lcd_home()

//===========================================================================
void lcd_line2()
{
   lcd_num = 0 ;
   lcd_line = 1 ;
   set_lcd(0,0xc0);//  1 1 0 0 0 0 0 0      - LINE 2
}//lcd_line2()

//===========================================================================
void lcd_write(char lcd_data)
{
   set_lcd(1,lcd_data);

   if (lcd_num == 0x0f)
   {
      
      if (lcd_line)
         lcd_home();
      else 
         lcd_line2();
   }
   else
      lcd_num++;
}//lcd_write(char lcd_data)

//===========================================================================
static void lcd_end_line0()
{
   lcd_line = 0 ;
   lcd_num = 0x0f ;
   set_lcd(0,0x8f);
}//lcd_end_line0()

//===========================================================================
static void lcd_end_line1()
{
   lcd_line = 1 ;
   lcd_num = 0x0f ;
   set_lcd(0,0xcf);
}//lcd_end_line1()

//===========================================================================
void lcd_back1()
{
   u8 lcd_add;

   if (lcd_num == 0)
   {
      if (lcd_line)
      {
         lcd_line = 0 ;
         lcd_end_line0();
         lcd_num = 15 ;
      }
      else
      {
         lcd_line = 1 ;
         lcd_end_line1();
         lcd_num = 15 ;
      }
   }
   else
   {
      lcd_num--;
      if (lcd_line)
      {
         lcd_add = 0xc0 | lcd_num ;   //      - line2 0x40
         set_lcd(0,lcd_add);
      }
      else
      {
         lcd_add = 0x80 | lcd_num ;  //       - line1 0x00
         set_lcd(0,lcd_add);
      }
   }
}//void lcd_back1()
//===========================================================================
void delete_tav()
   {
     lcd_back1();                         
     lcd_write(' ');
     lcd_back1();
  }//void delete_tav()
//===========================================================================
void lcd_forward1()
{
   u8 lcd_add;

   if (lcd_num == 0x0f)
   {
      if (lcd_line)
      {
         lcd_line = 0 ;
         lcd_home();
         lcd_num = 0 ;
      }
      else
      {
         lcd_line = 1 ;
         lcd_line2();
         lcd_num = 0 ;
      }
   }
   else
   {
      lcd_num++;
      if (lcd_line)
      {
         lcd_add = 0xc0 | lcd_num ;   //      - line2 0x40
         set_lcd(0,lcd_add);
      }
      else
      {
         lcd_add = 0x80 | lcd_num ;   //     - line1 0x00
         set_lcd(0,lcd_add);
      }
   }
}//void lcd_forward1()

//===========================================================================
void lcd_line_up()
{
   u8 lcd_add;

   lcd_line = 0 ;
   lcd_add = 0x80 | lcd_num ;   //      - line2 0x00
   set_lcd(0,lcd_add);
}//lcd_line_up()

//===========================================================================
void lcd_line_down()
{
   u8 lcd_add;

   lcd_line = 1 ;
   lcd_add = 0xc0 | lcd_num ;   //      - line1 0x40
   set_lcd(0,lcd_add);
}//lcd_line_down()

//===========================================================================
void lcd_write_add(u8 lcd_add1)
{
   if (lcd_add1 >= 0x40)
      lcd_line = 1 ;     
   else
      lcd_line = 0 ;

   lcd_num = lcd_add1 & 0x0f ;
   lcd_add1 |= 0x80 ;
   set_lcd(0,lcd_add1);
}//lcd_write_add(char lcd_add)

תודה רבה לשי מלול.

אין תגובות:

הוסף רשומת תגובה