#define F_CPU 8000000UL // Устанавливаем частоту процессора 1МГц
#include "lcd_lib.h"
void LCDsendCommand(uint8_t cmd)
{
    LCD_PORT = (cmd&0xF0); //загружаем в порт данных старший полубайт команды
    LCD_PORT |= 1<<LCD_E; //отправляем старший полубайт команды (E=1)
    _delay_ms(1);
    LCD_PORT &= ~(1<<LCD_E); //E=0
    _delay_ms(1);
    LCD_PORT = ((cmd&0x0F)<<4); //загружаем в порт данных младший полубайт команды
    LCD_PORT |= 1<<LCD_E; //отправляем старший полубайт команды (E=1)
    _delay_ms(1);
    LCD_PORT &= ~(1<<LCD_E); //E=0
    _delay_ms(1);
}

void LCDsend2digitNumber(int8_t num) {
    if (num < 0) {
        num *= -1;
        LCDsendChar((uint8_t)'-');
    }
    LCDsendChar((uint8_t)('0' + num / 10));
    LCDsendChar((uint8_t)('0' + num % 10));
}

void LCDsendChar(uint8_t ch)
{
    LCD_PORT=(ch&0xF0); //загружаем в порт данных старший полубайт символа
    LCD_PORT |= 1<<LCD_RS; //настраиваем порт на отправку данных (RS=1)
    LCD_PORT |= 1<<LCD_E; //отправляем старший полубайт символа(E=1)
    _delay_ms(1);
    LCD_PORT &= ~(1<<LCD_E); //E=0
    LCD_PORT &= ~(1<<LCD_RS); //RS=0
    _delay_ms(1);
    LCD_PORT=((ch&0x0F)<<4); //загружаем в порт данных старший полубайт символа
    LCD_PORT |= 1<<LCD_RS; //настраиваем порт на отправку данных (RS=1)
    LCD_PORT |= 1<<LCD_E; //отправляем старший полубайт символа(E=1)
    _delay_ms(1);
    LCD_PORT &= ~(1<<LCD_E); //E=0
    LCD_PORT &= ~(1<<LCD_RS); // RS=1
    _delay_ms(1);
}
void LCDinit(void)
{
    _delay_ms(40);
    LCD_PORT = 0x00; //обнуляем порт данных
    LCD_DDR |= 1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4; //порт данных настраиваем на выход
    LCD_DDR |= 1<<LCD_E|1<<LCD_RW|1<<LCD_RS; //порт управления настраиваем на выход
    LCD_PORT = 0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|1<<LCD_D4; //загружаем команду 0011
    LCD_PORT |= 1<<LCD_E|0<<LCD_RW|0<<LCD_RS; //отправляем команду 0011
    _delay_ms(1);
    LCD_PORT &= ~(1<<LCD_E);
    _delay_ms(1);
    LCD_PORT = 0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|0<<LCD_D4; //загружаем команду 0010
    LCD_PORT |= 1<<LCD_E|0<<LCD_RW|0<<LCD_RS; //отправляем команду 0010
    _delay_ms(1);
    LCD_PORT &= ~(1<<LCD_E);
    _delay_ms(1);
    LCD_PORT = 1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|0<<LCD_D4; //загружаем команду NF10
    LCD_PORT |= 1<<LCD_E|0<<LCD_RW|0<<LCD_RS; // отправляем команду NF10
    _delay_ms(1);
    LCD_PORT = 0<<LCD_D7|0<<LCD_D6|1<<LCD_D5|0<<LCD_D4; //загружаем команду 0010
    LCD_PORT |= 1<<LCD_E|0<<LCD_RW|0<<LCD_RS; //отправляем команду 0010
    _delay_ms(1);
    LCD_PORT &= ~(1<<LCD_E);
    _delay_ms(1);
    LCD_PORT = 1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|0<<LCD_D4; //загружаем команду NF10
    LCD_PORT &= ~(1<<LCD_E);
    _delay_ms(1);
    LCDsendCommand(0b00001111); //отправляем команду 00001DCB
    LCDsendCommand(0b00000111); //отправляем команду 000001KZ
    LCDsendCommand(0x0C); // Дисплей включен, курсор выключен
    LCDsendCommand(0x06); // Сдвиг курсора вправо
    LCDsendCommand(0x01); // Очистка дисплея
}
// void LCDinit(void) {
//     LCD_DDR = 0xFF; // Все выводы порта B на выход
//     _delay_ms(15);

//     LCDsendCommand(0x02); // Включение 4-битного режима
//     LCDsendCommand(0x28); // 4-битный режим, 2 строки, шрифт 5x8
//     LCDsendCommand(0x0C); // Дисплей включен, курсор выключен
//     LCDsendCommand(0x06); // Сдвиг курсора вправо
//     LCDsendCommand(0x01); // Очистка дисплея
//     _delay_ms(2);
// }

void LCDclr(void) {
    LCDsendCommand(0x01);
    _delay_ms(2);
}

void LCDGotoXY(uint8_t x, uint8_t y) {
    uint8_t address = 0x80 + x;
    if (y == 1) {
        address = 0xC0 + x;
    }
    LCDsendCommand(address);
}

void LCDstring(uint8_t* str) {
    while (*str) {
        LCDsendChar(*str++);
    }
}
