Цитата(AVR @ Jan 24 2006, 02:26)

Есть символьный дисплей BC2004B 20х4.
У этого дисплея четыре строки, но внутрення организация у него как у двухстрочного (3-я строка продолжение первой, 4-я - продолжение второй).
Поэтому для работы с ним я включаю режим работы на две строки. Но в результате, на ЖКИ первая строка пишется в первый ряд ЖКИ как и положено, однако вторая пишется в третий ряд, а 3-я и 4-я вовсе не появляются на экране. В чем может быть ошибка? Как можно задействовать все четыре строки?
Возможно Вы 'недоинициализировали' LCD. Когдато я делал для WH1604A, что немногим отличается от BC2004B (количество позиций в строке). Вот код инициализации:
void LCD_init(void)
{
PORTB = STROB_DOWN;
PORTB = RS_COMAND;
PORTD = WRITE_LCD;
DelayMs(100);
PORTB = (DATA_IO_LCD | 0x03); // To establish word length of the interface
LCD_strobe();
DelayUs(40);
LCD_strobe();
DelayUs(40);
LCD_strobe();
DelayUs(40);
LCD_write_comand(0x28); // 4 bit mode, 2/16 duty, 5x8 font
LCD_write_comand(0x08); // display off
LCD_write_comand(0x0C); // display on, blink curson off
LCD_write_comand(0x06); // entry mode
}
так же необходимо четко выдерживать все временные соотношения рекомендуемые к инициализации контроллера - DelayMs(), DelayUs(40):
#define ClkFreq 16000000
#define _1us (unsigned long)((ClkFreq / 1000000) / 1.25)
#define _1ms (unsigned long)(ClkFreq / 1000)
void DelayMs(unsigned int d)
{
while(d--)__delay_cycles(_1ms);
}
void DelayUs(unsigned int d)
{
while(d--)__delay_cycles(_1us);
}
длительность строба LCD_strobe() так же должна быть не меньше минимально допустимой.
Рекомендую посмотреть документацию на MT-20S4A, что является практически аналогом для BC2004B. Там достаточно подробное описание модуля (http://www.melt.aha.ru/work/display/150).