פונקציה ראשית שקוראת ל-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)
תודה רבה לשי מלול.
אין תגובות:
הוסף רשומת תגובה