Понимаю что до дыр затёртая тема, но всё же прочитав подобные темы не смог применить к своей инициализации. У меня Atmega 128, с ней портом С подсоединён двустрочный LCD основаный на HD44780. Провожу всеми описываемую инициализацию, но результата нет.
Если не сильно надоело отвечать на подобные вопросы подскажите пожалуйста как быть.
Имеется вот такой вот примитивчик инициализации...
Код
void delay_ms(unsigned short ms)
{
unsigned short outer1, outer2;
outer1 = 200;
while (outer1) {
outer2 = 1000;
while (outer2) {
while ( ms ) ms--;
outer2--;
}
outer1--;
}
}
//-------------------------------------------------------------------------------------
//инициализация дисплея
//-------------------------------------------------------------------------------------
//VLED - PC0
//RS - PC1
//R/W - PC2
//E - PC3
//DB4..DB7 - PC4..PC7
//N - line number (2)
//F - font type (5x8)
//DL - data length (4 bit)
//D - display
//C - cursor
//B - blink
void Write_8Bit(int value, int pause)
{
PORTC=value;
sbi(PORTC,3);
cbi(PORTC,3);
PORTC=0xF1;/установить DB4-DB7 в HI
delay_ms(pause);
}
void Write_4Bit(int hi, int low, int pause)
{
PORTC=hi;//старший полубайт
sbi(PORTC,3);
cbi(PORTC,3);
PORTC=low;//младший полубайт
sbi(PORTC,3);
cbi(PORTC,3);
PORTC=0xF1;//установить DB4-DB7 в HI
delay_ms(pause);
}
void disp_init(void)
{
DDRC=0xFF;// порт С на выход
PORTC=0x01;// включить питание
delay_ms(40); //пауза после включения питания
for(int c=0; c<3; c++) //3 раза устанавливается 8 битный режим
{
Write_8Bit(0x31, 40);
}
Write_4Bit(0x21,0x01,40); // переход в 4 битный режим
Write_4Bit(0x21,0x81,40); //переход в 4 битный режим, повтор
Write_4Bit(0x01,0x81,40); //выключить дисплей
Write_4Bit(0x01,0x61,40); //установить направление сдвига курсора
Write_4Bit(0x01,0xF1,40); //включить индикатор и разрешить курсор, установить его тип
Write_4Bit(0x01,0x11,40); //очистить индикатор и курсор домой
}
{
unsigned short outer1, outer2;
outer1 = 200;
while (outer1) {
outer2 = 1000;
while (outer2) {
while ( ms ) ms--;
outer2--;
}
outer1--;
}
}
//-------------------------------------------------------------------------------------
//инициализация дисплея
//-------------------------------------------------------------------------------------
//VLED - PC0
//RS - PC1
//R/W - PC2
//E - PC3
//DB4..DB7 - PC4..PC7
//N - line number (2)
//F - font type (5x8)
//DL - data length (4 bit)
//D - display
//C - cursor
//B - blink
void Write_8Bit(int value, int pause)
{
PORTC=value;
sbi(PORTC,3);
cbi(PORTC,3);
PORTC=0xF1;/установить DB4-DB7 в HI
delay_ms(pause);
}
void Write_4Bit(int hi, int low, int pause)
{
PORTC=hi;//старший полубайт
sbi(PORTC,3);
cbi(PORTC,3);
PORTC=low;//младший полубайт
sbi(PORTC,3);
cbi(PORTC,3);
PORTC=0xF1;//установить DB4-DB7 в HI
delay_ms(pause);
}
void disp_init(void)
{
DDRC=0xFF;// порт С на выход
PORTC=0x01;// включить питание
delay_ms(40); //пауза после включения питания
for(int c=0; c<3; c++) //3 раза устанавливается 8 битный режим
{
Write_8Bit(0x31, 40);
}
Write_4Bit(0x21,0x01,40); // переход в 4 битный режим
Write_4Bit(0x21,0x81,40); //переход в 4 битный режим, повтор
Write_4Bit(0x01,0x81,40); //выключить дисплей
Write_4Bit(0x01,0x61,40); //установить направление сдвига курсора
Write_4Bit(0x01,0xF1,40); //включить индикатор и разрешить курсор, установить его тип
Write_4Bit(0x01,0x11,40); //очистить индикатор и курсор домой
}
На дисплее ничего не происходит , кроме того что он светится при подаче на него питания. При посылке битов всегда добавляю 1 для того чтобы питание не пропало, потому как оно физически подсоеденено к PC0. Подскажите что у меня не так.
Заранее спасибо.