//Библиотека функций ЖКИ (lcd_2.c), РадиоХобби, #4/2006 =1
#include <avr/io.h>           //Библиотека ввода-вывода =2
#define RS    PC4      //Условное имя для вывода RS ЖКИ =3
#define EN    PC5       //Условное имя для вывода E ЖКИ =4
#define TIME 10     //2...20 задержка времени для 1 МГц =5
//---------------Функция задержки времени---------------=6
void ipause(unsigned int p)  //"p" - длительность паузы =7
{ unsigned int b;               //"b" - счетчик времени =8
  for (b=p; b > 0; b--);        //Цикл задержки времени =9
}                         //Окончание функции "ipause" =10
//-------Общая часть функций lcd_com, lcd_dat----------=11
void lcd(unsigned char p) //"p"-байт данных или команд =12
{ PORTC &= 0xF0; PORTC |= (p >> 4);    //Старший ниббл =13
  ipause(TIME);        //Длительность лог.1 сигнала EN =14
  PORTC &= ~_BV(EN);   //EN=0, запись информации в ЖКИ =15
  ipause(TIME);        //Длительность лог.0 сигнала EN =16
  PORTC |= _BV(EN);                      //Сигнал EN=1 =17
  PORTC &= 0xF0; PORTC |= (p & 0x0F);  //Младший ниббл =18
  ipause(TIME);        //Длительность лог.1 сигнала EN =19
  PORTC &= ~_BV(EN);   //EN=0, запись информации в ЖКИ =20
  ipause(5*TIME);       //Пауза для выполнения команды =21
}                            //Окончание функции “lcd” =22
//-----------Функция записи команды в ЖКИ--------------=23
void lcd_com(unsigned char p)     //"p" - байт команды =24
{ PORTC &= ~_BV(RS); PORTC |= _BV(EN);    //RS=0, EN=1 =25
  lcd(p); //Вызов общей части функций lcd_com, lcd_dat =26
}                        //Окончание функции “lcd_com” =27
//-----------Функция записи данных в ЖКИ---------------=28
void lcd_dat(unsigned char p)      //"p" - байт данных =29
{ PORTC |= _BV(RS) | _BV(EN);             //RS=1, EN=1 =30
  lcd(p); //Вызов общей части функций lcd_com, lcd_dat =31
}                        //Окончание функции “lcd_dat” =32
//------------Функция инициализации ЖКИ----------------=33
void lcd_init(void)     //Режим 4-бит, мигающий курсор =34
{ lcd_com(0x33); ipause(500*TIME);        //Подготовка =35
  lcd_com(0x32); lcd_com(0x28);    //4-бит, две строки =36
  lcd_com(0x08);           //Полное выключение дисплея =37
  lcd_com(0x01); ipause(1000*TIME);  //Очистка дисплея =38
  lcd_com(0x06); //Направление сдвига курсора - вправо =39
  lcd_com(0x0D);  //Включение дисплея, мигающий курсор =40
}                       //Окончание функции “lcd_init” =41
//---------Функция вывода текстового стринга-----------=42
void lcd_puts(unsigned char *data)     //"data"=стринг =43
{ while(*data) lcd_dat(*(data++));    //Смена символов =44
}                       //Окончание функции "lcd_puts" =45
