ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
427797 Топик полностью
LightElf (26.07.2013 13:29 - 13:44, просмотров: 461) ответил Ксения на А как быть, если в начале/конце строки есть дополнительная работа (например, на очистку экрана) с особо большой задержкой? Тогда таймирование подравнивать под эту большую задержку, чтобы было поровну, или ту большую задержку разбивать на много
Ну вот как-то примерно так. lcd_put просто складывает строку в буфер fifo. lcd_poll вызывается из main loop.  Byte lcd_put(Byte lcd, Byte * buf, Byte len) { Byte i = 0; while ((lcd_fifo[lcd].count < LCD_FIFO_MASK) && (i < len)) { lcd_fifo[lcd].buffer[lcd_fifo[lcd].wptr] = buf[i]; lcd_fifo[lcd].wptr = (lcd_fifo[lcd].wptr + 1) & LCD_FIFO_MASK; lcd_fifo[lcd].count++; i++; } return len; } void lcd_poll(void) { Byte c, i; Byte * ptr; for (i = 0; i < 2; i++) { if (timer_expired(&lcd_timer[i]) && (0 != lcd_fifo[i].count)) { c = lcd_fifo[i].buffer[lcd_fifo[i].rptr]; lcd_fifo[i].count--; lcd_fifo[i].rptr = (lcd_fifo[i].rptr + 1) & LCD_FIFO_MASK; switch (c) { // почикано несколько веток // .... case 0x1B: // ESC-последовательность if (lcd_fifo[i].count > 0) { // служебный код уже есть в буфере, прочитаем его c = lcd_fifo[i].buffer[lcd_fifo[i].rptr]; lcd_fifo[i].count--; lcd_fifo[i].rptr = (lcd_fifo[i].rptr + 1) & LCD_FIFO_MASK; lcd_out_byte(i, c, 0); timer_set(&lcd_timer[i], 6); } else { // код пока не в буфере - оставляем символ ESC в буфере timer_set(&lcd_timer[i], 2); lcd_fifo[i].count++; lcd_fifo[i].rptr = (lcd_fifo[i].rptr - 1) & LCD_FIFO_MASK; } break; default: // обычный символ lcd_out_byte(i, c, 1); timer_set(&lcd_timer[i], 2); } } }
Не надо делать мне как лучше, оставьте просто хорошо