предлагаю отвлечься от битвы за ЧСВ, а поискать баг в данном коде

КАК пишет МОНСТЕР он НЕИСПРАВЕН
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#define RS_command ~(1<<0)
#define RS_data (1<<0)
#define RW_write ~(1<<1)
#define RW_read (1<<1)
#define E (1<<2)
#define LCD_PORT PORTD
#define RUN_PORT PORTA
#define SIZE_BUS 4 // размер шины данных 4 или 8 бит
void busy_flag()
{
DDRD &= 0x00; // порт D на вход
LCD_PORT |= 0xFF; // включаем поддтяжку
RUN_PORT |= RW_read;
RUN_PORT |= E; // взводим строб
_delay_us(40);
RUN_PORT &= ~E; // команда на запись
_delay_us(40);
if(PIND&(1<<7))
busy_flag();
}
void write_nibbleCommand(int DATA)
{
DDRD |= 0xF0; // младшие три разряда порта А на выход
RUN_PORT &= RS_command; // пишем команду
RUN_PORT &= RW_write;
LCD_PORT &= 0x00; // очищаем шину данных
LCD_PORT |= DATA; // бaйт данных
RUN_PORT |= E; // взводим строб
_delay_us(40);
RUN_PORT &= ~E; // команда на запись
_delay_us(40);
LCD_PORT &= 0x00; // очищаем шину данных
}
void write_command(int DATA)
{
write_nibbleCommand(DATA);
if(SIZE_BUS==4)
write_nibbleCommand(DATA<<4);
busy_flag();
}
void write_nibbleData(int DATA)
{
DDRD |= 0xF0;
RUN_PORT |= RS_data; // пишем команду
RUN_PORT &= RW_write;
LCD_PORT &= 0x00; // очищаем шину данных
LCD_PORT |= DATA; // бaйт данных
RUN_PORT |= E; // взводим строб
_delay_us(40);
RUN_PORT &= ~E; // команда на запись
_delay_us(40);
LCD_PORT &= 0x00; // очищаем шину данных
}
void write_data(int DATA)
{
write_nibbleData(DATA);
if(SIZE_BUS==4)
write_nibbleData(DATA<<4);
busy_flag();
}
void init_LCD()
{
_delay_ms(20); // установка ном напряжения
write_nibbleCommand(0x30); //
_delay_ms(5);
write_nibbleCommand(0x30);
_delay_us(110);
write_nibbleCommand(0x30);
busy_flag();
write_nibbleCommand(0x20); // две строки 4 бита
busy_flag();
write_command(0x28); // две строки 4 бита
write_command(0x08); // отключаем
write_command(0x01); // очищаем
write_command(0x06); // двигаем курсор вправо
write_command(0xF); //включаем
}
int main(void)
{
DDRA =0xFF;
PORTA =0x00;
DDRD =0xFF;
PORTD =0x00;
init_LCD();
// unsigned char znak = 0; // определяем переменную
//while (1)
//{
//write_command(0x80); // Вывод в верхнюю левую позицию 1 строки
//write_data(znak/100 + '0'); // Выделяем сотни
//write_data((znak/10)%10 + '0'); // Выделяем десятки
//write_data(znak%10 + '0'); // Выделяем единицы
//write_data('='); // Выводим знак равенства
//write_data(znak); // Выводим содержимое знакогенератора
//_delay_ms(1000); // Тут можно поменять задержку вывода символов
//znak++; // Следующий символ знакогенератора
//}
}