Еслои быть точным, то в Кейловском примере пишется "int main (void) {"
Вот функции,выполняющие заливку экрана.
Код
void lcd_write_byte(uint8_t data, uint8_t D_C)
{
unsigned long d;
CS_OFF; //Выбор LCD
if (D_C) DCX_ON else DCX_OFF; //Если данные то DCX =1 если команда то DCX = 0
AT91C_BASE_PIOA->PIO_ODSR = data; //Данные в порт
WRX_OFF; //Установка сигнала записи
WRX_ON; //Снятие сигнала записи
}
void lcd_fill_screen(uint32_t color)
{
uint32_t num;
lcd_write_byte(RAMWR, 0);
for(num = 0; num < 0x012C00; num++)
{
lcd_write_byte(r(color),1);
lcd_write_byte(g(color),1);
lcd_write_byte(b(color),1);
}
}
Приведены в оригинале. Мне удалось увеличить скорость. ПОка измерял на глазок - 16 заливок раньше выполнялось за 6 секунд, теперь за 4.
Что я сделал - убрал из lcd_write_byte строку проверки data_or_command (D_C) и сделал две разные - одну для вывода данных, другую для вывода команды, убрал и включение и выключение DCX в этих функциях, включаю принудительно перед каждым блоком работы с данными.
Далее, убрал из lcd_write_byte CS_OFF (выбор чипа) и прописал эту команду в местах где начинается работа с LCD.
В lcd_fill_screen я заменил lcd_write_byte(b(color),1); на bb=b(color); lcd_write_byte_data(bb); То есть составляющие цвета не вычленяются каждый раз при записи байта.
Получилось вот что:
Код
void lcd_write_byte(uint8_t data, uint8_t D_C)
{
CS_OFF; //Выбор LCD
if (D_C) DCX_ON else DCX_OFF; //Если данные то DCX =1 если команда то DCX = 0
AT91C_BASE_PIOA->PIO_ODSR = data; //Данные в порт
WRX_OFF; //Установка сигнала записи
WRX_ON; //Снятие сигнала записи
}
void lcd_write_byte_data(uint8_t data)
{
AT91C_BASE_PIOA->PIO_ODSR = data; //Данные в порт
WRX_OFF; //Установка сигнала записи
WRX_ON; //Снятие сигнала записи
}
void lcd_write_byte_command(uint8_t data)
{
AT91C_BASE_PIOA->PIO_ODSR = data; //Данные в порт
WRX_OFF; //Установка сигнала записи
WRX_ON; //Снятие сигнала записи
}
void lcd_fill_screen(uint32_t color)
{
uint32_t num;
uint8_t rr,gg,bb;
rr=r(color); // выделяем
gg=g(color); // цветовые составляющие
bb=b(color); //заранее
DCX_OFF; // строб команды
lcd_write_byte_command(RAMWR);
DCX_ON; // строб данных
for(num = 0; num < 0x012C00; num++)
{
lcd_write_byte_data(rr); // передаем данные с помощью оптимизированной функции
lcd_write_byte_data(gg);
lcd_write_byte_data(bb);
}
DCX_ON;
}
Что еще господа посоветуют для акселерации работы с дисплеем?.
Сообщение отредактировал zheka - May 18 2010, 13:56