Белый Жрец (11.09.2013 09:56 - 09:59, просмотров: 114) ответил Mazur на Все. На данный момент застрял.
как вариант на обработчике прерывания таймера: {/// Обработка LCD --------------------------------------------------------------------
if(LcdStep==0){ // проверяем тут не в case - чтобы не делать лишнего вызова по прерыванию - обработка смвола занимает 3 вызова (3мс)
if(labs(Gol-Hv)>0){ // если что есть выводить - выводим
Stt=STT_Wrk; // работаем
LcdMode=Buf[Hv++]; // изымаем перемещаем голову
Hv%=BufMax; // если что - заворачиваем хвост
if (LcdMode<=0x1E) { LcdStep=1; } // исполняем команду
else if (LcdMode==0x1F) { LcdStep=0; Set1ms(); } // задержка 1мс
else LcdStep=2; // вывод символа
}
else Stt=STT_Rdy; // всё вывели
}
switch(LcdStep){
case 1: RS0(); LcdStep=3; break;
case 2: RS1(); LcdStep=3; break;
case 3: EN1(); DB(kod[LcdMode]); LcdStep=4; break; // вывод через таблицу
case 4: EN0(); LcdStep=0; break;
}
}
u8 Lcd_Out(u8 *buf){ // вывод на дисплей текстовой строки
if(labs(Gol-Hv)<BufMax-40){ // если длина позволяет (подразумеваем что вывод не более 40ка символов)
while(*buf){ // mod
Buf[Gol++]=*buf++; // присваиваем перемещая голову
Gol%=BufMax; // если что - заворачиваем голову
}
}
return (BufMax-labs(Gol-Hv)); // возвращаем остаток в буфере
}
LcdOut("\x01Ошибка передачи \x02Смените позицию.");