//****************************************************************************************************
//************************************    my_lcd.c    ************************************************
//****************************************************************************************************
//************************************   Месяц А.     ************************************************
//****************************************************************************************************

//1.Скопировать этот файл в папку с проектом и подключить при помощи " #include <my_lcd.c> "
//2.Подключить порты к LCD и сконфигурировать их на выход.

#include <io.h>
#include <delay.h>

//****************************************************************************************************
//****************************  Настройка подключения LCD  *******************************************
//****************************************************************************************************

#define COLUMNS 16  //количество символов в строке

#define EN PORTA.7
#define RS PORTA.6
#define LCD_PD4 PORTC.7
#define LCD_PD5 PORTC.6
#define LCD_PD6 PORTC.5
#define LCD_PD7 PORTC.4

//****************************************************************************************************
//****************************************************************************************************
//****************************************************************************************************
#define COMAND    0   // Команда
#define DATA    1   // Данные
#define lcd_delay 1 //При необходимости, подстроить

#pragma used+

//функции
void lcd_write(unsigned char data, unsigned char mode);
void lcd_init(void);
void lcd_putchar(unsigned char data);              // отображение 1 символа в позиции (последняя + 1)
void lcd_gotoxy(unsigned char x, unsigned char y); // задание позиции 1 символа x - символ =0..39 y - строка =0..3
void lcd_clear(void);                              // очистка LCD
void lcd_puts(char *str);                          // вывод символа расположенного в SRAM на LCD
void lcd_putsf(char flash *str);                   // вывод символа расположенного в FLASH на LCD
void lcd_cursor_on(void);
void lcd_cursor_off(void);
void lcd_clear_string(unsigned char y,unsigned char from,unsigned char to);// очистка нужного количества символов в строке
//****************************************************************************************************


flash unsigned char base_y[4]={0x80,0xc0,0x80+COLUMNS,0xc0+COLUMNS};// стартовые значения 1 и 2 строки
unsigned char lcd_x, lcd_y;              // переменные для хранения последней позиции символа

//****************************************************************************************************

void lcd_write(unsigned char data, unsigned char mode){

if (mode)RS = 1;else RS = 0;    //выбор режима 1-data 0-comand

delay_us(lcd_delay);

// старший нибл
if (data & (1<<7)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<6)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<5)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<4)) LCD_PD4=1; else LCD_PD4=0;

EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);

//младший нибл
if (data & (1<<3)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<2)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<1)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<0)) LCD_PD4=1; else LCD_PD4=0;

EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);

LCD_PD7=1; LCD_PD6=1; LCD_PD5=1; LCD_PD4=1;
delay_ms(lcd_delay);
}//lcd_write()

//****************************************************************************************************

void lcd_init(){
RS=0;
EN=0;
delay_ms(200);
lcd_write(0x33, COMAND);
delay_ms(5);
lcd_write(0x32, COMAND);
lcd_write(0x28, COMAND); // 4 бит, 2 строки
lcd_write(0x08, COMAND); // полное выключение дисплея
lcd_write(0x01, COMAND); // очистка дисплея
lcd_write(0x06, COMAND); // сдвиг курсора вправо
lcd_write(0x0C, COMAND); // включение дисплея, выключение курсора
lcd_clear();
}//lcd_init();

//****************************************************************************************************

void lcd_gotoxy(unsigned char x, unsigned char y){
if (y<=3)lcd_write((base_y[y]+lcd_x),COMAND);
else lcd_write((base_y[0]+lcd_x),COMAND);
lcd_x=x;
lcd_y=y;
}//lcd_gotoxy()

//****************************************************************************************************

// очистка дисплея LCD
void lcd_clear(void){
lcd_write(2,COMAND);   // cursor home
lcd_write(0x0c,COMAND); // cursor off
lcd_write(1,COMAND);   // clear
lcd_x=lcd_y=0;
}//lcd_clear()

//****************************************************************************************************

// очистка нужного количества символов в строке
void lcd_clear_string(unsigned char y,unsigned char from,unsigned char to){

while(from <= to){
        lcd_gotoxy(from++,y);
        lcd_putchar(' ');
};//while
}//lcd_clear_string()

//****************************************************************************************************

void lcd_cursor_on(){
lcd_write(0x0d,COMAND);
}//lcd_cursor_on()

//****************************************************************************************************

void lcd_cursor_off(){
lcd_write(0x0c,COMAND);
}//lcd_cursor_off()

//****************************************************************************************************

void lcd_putchar(unsigned char data){ 
if (lcd_x>(COLUMNS-1)){
        if (++lcd_y>3){lcd_y=0;lcd_clear();} 
        lcd_x=0; 
};//if
lcd_gotoxy(lcd_x,lcd_y);
lcd_write(data, DATA);
lcd_x++;

}//lcd_putchar();

//****************************************************************************************************

// вывод символа расположенного в SRAM на LCD
void lcd_puts(char *str){
while(*str)lcd_putchar(*str++);// передача символа
}//lcd_puts()

//****************************************************************************************************

// вывод символа расположенного в FLASH на LCD
void lcd_putsf(char flash *str){
while(*str)lcd_putchar(*str++);// передача символа
}//lcd_putsf()
                        
                        
//****************************************************************************************************
