Здравствуйте! Я вернулся
Не смейтесь. Но инициализацию LCD проходит! УРА!!! Это я просто опять нашел свободное время и осциллограф. С осциллографом все становится намного проще особенно для тех кто не сильно разбирается в Си.
Вот как я прохожу инициализацию:
Код: Выделить всё
DB4 = 0;
DB5 = 0;
DB6 = 0;
DB7 = 0;
LCD_RS = 0; // write control bytes
LCD_E = 0;
Delay(2000);// power on delay 15ms
Delay(2000);
//Set LCD_DATA to high nibble of Software Reset
//LCD_DATA = (LCD_DATA&0x0F)|0x30;
DB4 = 1;
DB5 = 1;
DB6 = 0;
DB7 = 0;
LCD_E = 1;
Delay(50); // Wait 5ms
LCD_E = 0; // Write data to display
Delay(1000); // Wait 5ms
LCD_E = 1;
Delay(50);
LCD_E = 0; // Write data to display again (SW Reset)
Delay(1000); // Wait 5ms
LCD_E = 1;
Delay(50);
LCD_E = 0; // Write data to display again (SW Reset)
Delay(1000); // Wait 5ms
// Set LCD_DATA to high nibble of Function Set (4Bit)
//LCD_DATA = (LCD_DATA&0x0F)|0x20;
DB4 = 0;
DB5 = 1;
DB6 = 0;
DB7 = 0;
LCD_E = 1;
Delay(50);
LCD_E = 0; // Write data to display
Delay(500);
// Set LCD_DATA to high nibble of Function Set : 4 bit, 2 lines, 5*7 font
//LCD_DATA = (LCD_DATA&0x0F)|0x20;
DB4 = 0;
DB5 = 1;
DB6 = 0;
DB7 = 0;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
// Set LCD_DATA to lower nibble of Function Set : 4 bit, 2 lines, 5*7 font
//LCD_DATA = (LCD_DATA&0x0F)|0x80;
DB4 = 0;
DB5 = 0;
DB6 = 0;
DB7 = 1;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
Delay(500); // Wait 400µs
// Set LCD_DATA to high nibble of Display On/Off Control : display off, cursor off, don?t blink
//LCD_DATA = (LCD_DATA&0x0F)|0x00;
DB4 = 0;
DB5 = 0;
DB6 = 0;
DB7 = 0;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
// Set LCD_DATA to lower nibble of Display On/Off Control : display off, cursor off, don?t blink
//LCD_DATA = (LCD_DATA&0x0F)|0x80;
DB4 = 0;
DB5 = 0;
DB6 = 0;
DB7 = 1;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
Delay(500); // Wait 400µs
// Set LCD_DATA to high nibble of Clear Display
//LCD_DATA = (LCD_DATA&0x0F)|0x00;
DB4 = 0;
DB5 = 0;
DB6 = 0;
DB7 = 0;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
// Set LCD_DATA to lower nibble of Clear Display
//LCD_DATA = (LCD_DATA&0x0F)|0x10;
DB4 = 1;
DB5 = 0;
DB6 = 0;
DB7 = 0;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
Delay(1000); // Wait 5ms
// Set LCD_DATA to high nibble of Entry Mode Set : increment DD-RAM address, move cursor
//LCD_DATA = (LCD_DATA&0x0F)|0x00;
DB4 = 0;
DB5 = 0;
DB6 = 0;
DB7 = 0;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
// Set LCD_DATA to lower nibble of Entry Mode Set : increment DD-RAM address, move cursor
//LCD_DATA = (LCD_DATA&0x0F)|0x60;
DB4 = 0;
DB5 = 1;
DB6 = 1;
DB7 = 0;
LCD_E = 1;
Delay(5);
LCD_E = 0; // Write data to display
Delay(500); // Wait 400µs
Понятное дело что это не дело. так по одному фигачить.... но пока по другому ниче не получается.
Сейчас с помощью все того же осциллографа я проверял вот эту функцию:
Код: Выделить всё
void lcd_write(unsigned char c)
{
LCD_DATA = (c & 0x0F) << 4; //send lower-order nibble
LCD_E = 1;
Delay(50);//200microseconds
LCD_E = 0; //LCD_STROBE;
LCD_DATA = (c & 0xF0); // send higher-order nibble
LCD_E = 1;
Delay(50);//200microseconds
LCD_E = 0;//LCD_STROBE;
}
Но не полностью, а по частям. начиная с этого:
lcd_write(0x30); // 0011 0000
void lcd_write(unsigned char c)
{
LCD_DATA = (c & 0xF0); // send higher-order nibble. DB7=0 DB6=0 DB5=1 DB4=1
}
т.e. должно прийти так DB7=0 DB6=0 DB5=1 DB4=1
проверял.... ничего подобного. "1" приходит только на DB7, на остальных нули.
Что может быть не так?