No i działa!

Dziękuję wszystkim za pomoc i życzę Wesołych Świąt!
A dla potomności:
PORTC zmieniłem na PORTD, zachowałem kolejność tzn. DB4-PIND4, DB5-PIND5, DB6-PIND6, DB7-PIND7, RS-PIND2, E-PIND3.
Mój kod źródłowy dalej nie działał, ale zaczerpnąłem trochę wiadomości z tematu:
https://www.elektroda.pl/rtvforum/topic331234.html
I ruszył mi kod Pitusia Bajdusia. Zamieszczam go poniżej.
#define F_CPU 4000000
#include <avr/io.h>
#include <avr/delay.h>
#define DDR_DB4 DDRD
#define PORT_DB4 PORTD
#define DB4 PD4
#define DDR_DB5 DDRD
#define PORT_DB5 PORTD
#define DB5 PD5
#define DDR_DB6 DDRD
#define PORT_DB6 PORTD
#define DB6 PD6
#define DDR_DB7 DDRD
#define PORT_DB7 PORTD
#define DB7 PD7
#define DDR_RS DDRD
#define PORT_RS PORTD
#define RS PD2
#define DDR_E DDRD
#define PORT_E PORTD
#define E PD3
#define SET_DB4 PORT_DB4 |= _BV(DB4)
#define CLR_DB4 PORT_DB4 &= ~_BV(DB4)
#define SET_DB5 PORT_DB5 |= _BV(DB5)
#define CLR_DB5 PORT_DB5 &= ~_BV(DB5)
#define SET_DB6 PORT_DB6 |= _BV(DB6)
#define CLR_DB6 PORT_DB6 &= ~_BV(DB6)
#define SET_DB7 PORT_DB7 |= _BV(DB7)
#define CLR_DB7 PORT_DB7 &= ~_BV(DB7)
#define SET_E PORT_E |= _BV(E)
#define CLR_E PORT_E &= ~_BV(E)
#define SET_RS PORT_RS |= _BV(RS)
#define CLR_RS PORT_RS &= ~_BV(RS)
// funkcja wystawiająca na szynę danych połówkę bajtu
// pod uwagę brana jest młodsza połówka parametru
void out_nibble(char x)
{
if(x & _BV(0)) SET_DB4; else CLR_DB4;
if(x & _BV(1)) SET_DB5; else CLR_DB5;
if(x & _BV(2)) SET_DB6; else CLR_DB6;
if(x & _BV(3)) SET_DB7; else CLR_DB7;
}
// funkcja zapisująca do LCD bajt danych
void write_to_lcd(char x)
{
SET_E;
out_nibble(x >> 4); // wystawienie na szynę danych starszej połówki bajtu
CLR_E; // opadające zbocze na E powoduje zapis do wyświetlacza
SET_E;
out_nibble(x); // wystawienie na szynę danych młodszej połówki bajtu
CLR_E; // opadające zbocze na E powoduje zapis do wyświetlacza
_delay_ms(1); // opóźnienie ok 1 ms
}
// funkcja zapisująca do LCD rozkaz
void write_command(char x)
{
CLR_RS; // niski stan na RS -> zapis instrukcji
write_to_lcd(x); // zapis do LCD
}
// funkcja zapisujaca do LCD znak
void write_char(char x)
{
SET_RS; // wysoki stan na RS -> zapis danej
write_to_lcd(x); // zapis do LCD
}
// funkcja zapisu tekstu do wyświetlacza LCD
void write_text(char * s)
{
while(*s) // do napotkania 0
{
write_char(*s); // zapisz znak wskazywany przez s na LCD
s++; // zwiększ s (przygotuj nastepny znak)
}
}
// funkcja inicjująca LCD
void lcd_init(void)
{
// ustawienie wszystkich linii sterujących LCD jako wyjścia
DDR_DB4 |= _BV(DB4);
DDR_DB5 |= _BV(DB5);
DDR_DB6 |= _BV(DB6);
DDR_DB7 |= _BV(DB7);
DDR_E |= _BV(E);
DDR_RS |= _BV(RS);
//
_delay_ms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
CLR_E; // E = 0
CLR_RS; // RS = 0
char i; // zmianna licznikowa
for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
{
SET_E; // E = 1
out_nibble(0x03);
CLR_E; // E = 0
_delay_ms(5); // czekaj 5ms
}
SET_E; // E = 1
out_nibble(0x02);
CLR_E; // E = 0
_delay_ms(1); // czekaj 1ms
write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
write_command(0x08); // wyłącz LCD, kursor i miganie
write_command(0x01); // czyść LCD
write_command(0x06); // bez przesuwania w prawo
write_command(0x0C); // włącz LCD, bez kursora i mrugania
}
void LCDxy(char x,char y)
{
unsigned char com=0x80;
com|=(x|(y<<6));
write_command(com);
}
int main(void)
{
// inicjalizacja LCD
lcd_init();
// zapisz na LCD przykładowy tekst
write_text("1234");
LCDxy(0,1);
write_text("ABCD");
// petla nieskończona
while(1);
return 0;
}
Tak naprawdę nie wiem do końca co było przyczyną, ważne że działa!