Mazur (23.09.2013 01:56, просмотров: 144) ответил Ксения на Не обращайте внимания, что у меня такие чудовищно долгие задержки - это я от отчания их так сильно увеличила. На коротких был тот же результат.
Первое же, что заметил, неправильная инициализация (асм и си):
Init_Display: // Инициализация дисплея.
rcall Wait_20_ms //
ldi LCD_DATA, $30 // Установка 8-разрядного интерфейса.
rcall Send_Com_Init
rcall Wait_5_ms
ldi LCD_DATA, $30 // Установка 8-разрядного интерфейса.
rcall Send_Com_Init
rcall Wait_5_ms
ldi LCD_DATA, $30 // Установка 8-разрядного интерфейса.
rcall Send_Com_Init
rcall Wait_5_ms
ldi LCD_Data, $20 // Установка 4-разрядного интерфейса.
rcall Send_Com_Init
rcall Wait_50_us
ldi LCD_DATA,0x28 // 4-разрядный интерфейс. Двухстрочный режим.
rcall Send_Com
rcall Wait_50_us
ldi LCD_Data, $01 // Команда очистки дисплея.
rcall Send_Com
rcall Wait_5_ms
ldi LCD_Data, $06 // Инкремент счетчика адреса.
rcall Send_Com
rcall Wait_50_us
ldi LCD_Data, $0C // Включение дисплея.
rcall Send_Com
rcall Wait_50_us
ret
// У меня сейчас VFD, ему задержки не нужны. Для вашего дисплея задержки в комментариях.
void init_char_dsp (void)
{
setb (EN_DDR, EN);
setb (RS_DDR, RS);
// delay 100 ms
lcd_send_com_nibble(0x30);
// delay 5 ms
lcd_send_com_nibble(0x30);
// delay 5 ms
lcd_send_com_nibble(0x30);
// delay 5 ms
lcd_send_com_nibble(0x20);
// delay 50 us
lcd_send_com(0x28);
// delay 50 us
lcd_send_com(0x01);
// delay 5 ms
lcd_send_com(0x06);
// delay 50 us
lcd_send_com(0x0C);
// delay 50 us
}