Цитата(Freeze Anti @ Dec 12 2007, 07:32)

что я делаю не так...
1) PORTB = (data & 0xF); - тем самым вы не только выставляете данные, но и сбрасываете управляющие сигналы. Нужно бы PORTB = (data & 0x0F) | (PORTB & 0xF0);
2) аргументом _delay_loop2 является не время в микросекундах. Не зная частоты вашего кварца трудно сказать, какую реально задержку вы получаете. Используйте _delay_ms и _delay_mks.
3) Вы не используете чтение из дисплея. Поэтому выкиньте дерганье ногой RD.
4) Все команды, кроме очистки дисплея, исполняются за 40 мкс, очистка дисплея - за 1.6мс. Т.е. задержку в WriteByte можно уменьшить, а после посылки 0x01 в функциях InitLCD() и ClearLCD() добавить по дополнительной задержке 1.6мс.
5) Команда 0x01 в ClearLCD уже устанавливает курсор на начало, после этого не нужно GoToLine(1);
6) В порядке пожелания:
Код
#define E_1 PORTB |= (1 << 5) //PORTB = PORTB | 0b0100000 - E = 1
#define E_0 PORTB &= ~(1 << 5) //PORTB = PORTB & 0b11011111 - E = 0
Так вы не запутаетесь в битах.
7) В SetLCDPosition() вы первым делом ставите RS в 0. Зачем же в InitLCD вы перед вызовом SetLCDPosition() ставите его в 1? Ваша программа сильно упростится и станет более читабельной, если вы добавите функцию
Код
void WriteCommand(uint8_t byte)
{
RS_0; // command mode
WriteByte(byte);
RS_1; // data mode
}
Т.е. дисплей после этой функции готов принимать команды и не нужно делать RS_1 перед каждым выводом информации.
8) Команды лучше задать в символьном виде, тоже повысит читаемость:
Код
#define LCD_CLEAR 0x01
#define LCD_SET_CURSOR 0x80
#define LCD_SET_CG_PTR 0x40
9) Вы не используете знакогенератор, поэтому зачем его чистить? Когда будете использовать, грузить его можно как строку:
Код
//Функция вывода на дисплей строки из флеш
void ShowStr_P(prog_char *s)
{
char C = pgm_read_byte(s++);
while(C != 0)
{
ShowChar(C);
C = pgm_read_byte(s++);
}
}
prog_char const CharGen[][8] =
{
0x01, 0x03, 0x07, 0x0F, 0x07, 0x03, 0x01, 0x00, // symbol 0 image, 8 bytes per symbol
0x10, 0x18, 0x1C, 0x17, 0x1C, 0x18, 0x10, 0x00, // symbol 1 image, 8 bytes per symbol
.........
};
void InitLCD(void)
{
.............
WriteCommand(LCD_SET_CG_PTR | 0); // write to CG RAM, starting at position 0
ShowStr_P(CharGen);
..............
WriteCommand(LCD_SET_CURSOR | 0); //Переходим в первую строку дисплея
}
10)Непонятен комментарий "//Определение параметров развертки и ширины шины данных сейчас 0x38 если не получится - попробовать 0x28" У вас дисплей, судя по коду, подключен в 4-битном режиме, вам обязательно надо посылать 0x28
после 0x30, 0x30, 0x30.