Здравствуйте уважаемый подписчик!
Ранее мной было разослано описание контроллера ЖКИ HD44780,в этом выпуске предлагаю
библиотеки для его подключения к контроллеру семейства MCS-51.
Если у Вас возникли вопросы по применению MCS-51 напишите мне rat_e@ngs.ru
//*****************library for work with HD44780(forXX51, KEIL)
//******************************************************* made by Nikolay Chernov
//Для работы с HD44780 просто подключите приведенные ниже функции к Вашему проекту
// и переадресуйте порты согласно Вашей схеме.
bit flag_t_c;
sbit RS = 0xA5; //присвоение битам порта имен
sbit R_W = 0xA6; //используемых сигналов
sbit En = 0xA7;
// Определение кодов временных задержек на частоте 2 МГц
#define t255_us 0xFF2A
#define t15_ms 0xF63B
#define t4_5_ms 0xFD12
#define t50_us 0xFFF8
#define t0_4_s 0x0
#define t0_2_s 0x7FFF
//Определение адреса начала первой и второй строк дисплея
#define set_first_line 0x80
#define set_second_line 0xC0
// Программирование таймера/счетчика для задания временных интервалов
void timer0_int(void) interrupt 1 //обработка прерывания от таймера/счетчика0
{
flag_t_c = 1; //Служит для задания временных интервалов
}
union //Объединение, позволяет преобразовывать
{ //время задержки в два байта для таймера
unsigned int time_delay;
unsigned char time[2];
}T_C;
//***************************функция временной задержки**************************
delay(unsigned int time_f)
{
ET0 = 1; // разрешение прерывания от T/C0
T_C.time_delay = time_f;
TL0 = T_C.time[1]; // инициализация регистров T/C0
TH0 = T_C.time[0];
do{}while(flag_t_c != 1);
ET0 = 0; // запрет прерывания от T/C0
flag_t_c = 0;
}
//***************************передача в регистр HD44780*********************
send_lcd_reg_4wire(unsigned char send_data)
{
RS = 0; //установка сигналов
R_W = 0;
En = 1;
P0 = (send_data << 4)|0x0F; //выдача в порт
delay(t50_us);
En = 0;
}
// В данном случае рассмотрен вариант выдачи через старшие четыре бита порта
P0
// Применена приведенная выше функция временной задержки delay()
//***********************функция инициализации HD44780 в 4-х проводном режиме****
init_lcd_4wire()
{
En = 0; // временные задержки, необходимые
delay(t0_4_s); // для правильного функционирования
delay(t15_ms);
send_lcd_reg_4wire(0x3);
delay(t4_5_ms);
send_lcd_reg_4wire(0x3);
delay(t255_us);
send_lcd_reg_4wire(0x3);
delay(t255_us);
send_lcd_reg_4wire(0x2); // установка 4-х проводного режима
delay(t255_us);
send_lcd_reg_4wire(0x2); // 4 бита, 2 линии, 5x7 пикселей
delay(t255_us);
send_lcd_reg_4wire(0x8);
delay(t255_us);
send_lcd_reg_4wire(0x0); // включение дисплея
delay(t255_us);
send_lcd_reg_4wire(0xC);
delay(t255_us);
send_lcd_reg_4wire(0x0); // очистка дисплея
delay(t255_us);
send_lcd_reg_4wire(0x1);
delay(t255_us);
send_lcd_reg_4wire(0x0); // задание режима
delay(t255_us);
send_lcd_reg_4wire(0x6);
delay(t255_us);
// ***********Функция вавода на дисплей в 4-проводном режиме**************
send_lcd_display_4wire(unsigned char address, unsigned char send_data)
{
unsigned char send_data_h, send_data_l, address_l, address_h;
address_l = address; //адрес иданные разбиваются для передачи
address_h = address >> 4; // по 4 бита
send_data_l = send_data;
send_data_h = send_data >> 4;
RS = 0; //установка сигналов управления
R_W = 0;
En = 1;
P0 = (address_h << 4)|0x0F;
delay(t50_us);
En = 0;
delay(t255_us);
En = 1;
P0 = (address_l << 4)|0x0F;
delay(t50_us);
En = 0;
delay(t255_us);
RS = 1;
R_W = 0;
En = 1;
P0 = (send_data_h << 4)|0x0F;
delay(t50_us);
En = 0;
delay(t255_us);
En = 1;
P0 = (send_data_l << 4)|0x0F;
delay(t50_us);
En = 0;
}
// В данном случае рассмотрен вариант выдачи через старшие четыре бита порта
P0
//*************************** функция очистки дисплея *************************
clear_display()
{
send_lcd_reg_4wire(0x0);
delay(t255_us);
send_lcd_reg_4wire(0x1);
delay(t255_us);
}
// пример вывода на первую строку дисплея буквы B
//send_lcd_display_4wire(set_first_line,B);