Заранее благодарим за любую помощь, которую любой может предоставить!Новый ЖК-дисплей имеет разную компоновку пикселей, необходим более эффективный метод перевода буфера массива (рабочий метод слишком медленный)
Вот моя проблема: я заменяю устаревший ЖК-дисплей. Оба ЖК-дисплея, новые и старые, имеют ширину 240 на 128 пикселей, но имеют разные пиксельные устройства. Я написал код для перевода массива Screen из OLD в формат NEW, но он слишком медленный. Я надеюсь, что кто-то лучше справится с небольшими манипуляциями, чтобы я мог придумать лучший метод. Ниже представлена компоновка в виде стрелок, которые представляют собой байт в 8 пикселей и какова их ориентация на ЖК-дисплее.
В основном старый ЖК-дисплей размещается в 8 пиксельных байтах в горизонтальных срезах, которые увеличиваются горизонтально и обтекаются, а затем увеличиваются вертикально. Новый ЖК-дисплей расположен в 8 пиксельных байтах в вертикальных срезах, которые увеличиваются горизонтально и обтекаются, а затем увеличиваются вертикально.
Я пытаюсь визуализировать оба устройства со стрелками, представляющими 8-пиксельные байты, как вертикальные или горизонтальные стрелки, указывающие в направлении увеличения битов. Каждая стрелка в обоих представлениях представляет собой один байт или 8 пикселей.
Здесь расположение старого ЖК-дисплея: 30 байт по 128 байт для 30,720 бит или пикселей 240 битов по горизонтали составляет 30 байтов 128 байт вертикальные Old LCD
Здесь расположение нового ЖК-дисплея: 240 байт по 16 байт для 30,720 бит или пикселей 128 бит вертикали в 16 байт 240 байт горизонтальных New LCD
Ниже мой перевод код, который работает, но слишком медленно. Он увеличивается через байты новой компоновки, и обнаруживает, откуда взялся каждый бит для каждого байта из старой компоновки. Слишком медленный и утомительный, отстающий от системы, должен быть лучший способ! Я попытался изменить все вызовы функций на встроенный код без улучшения.
#define DISPLAY_BUFFER_SIZE 3840 // buffer size in *bytes*
#define HORIZONTAL_PIX 240
#define VERTICAL_ROWS 16
#define VERTICAL_PIX 128
#define HORIZONTAL_COL 30
#define BITS_IN_BYTE 8
UBYTE isBitSet(UBYTE* arr, USHORT bit)
{
USHORT index = bit/8; // Get the index of the array for byte with this bit
USHORT bitPosition = 7-(bit % 8); // Position of this bit a byte Every byte on the OLD LCD was bit swapped from MSB to LSB so annoyingly this is reversed here
return (arr[index] >> bitPosition & 1) == 1;
}
// main code inside another function
for (i=0; i<DISPLAY_BUFFER_SIZE; i++)
{
newbyte_pos = i % HORIZONTAL_PIX; // Value is 0 to 29. 30 = 240col/8bits
newbyte_offset = i/HORIZONTAL_PIX; // Value is 0 to 127
new_display_byte = 0x00;
// Bit 0
oldbit_num = (newbyte_offset * 1920) + (240 * 0) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x01;
// Bit 1
oldbit_num = (newbyte_offset * 1920) + (240 * 1) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x02;
// Bit 2
oldbit_num = (newbyte_offset * 1920) + (240 * 2) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x04;
// Bit 3
oldbit_num = (newbyte_offset * 1920) + (240 * 3) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x08;
// Bit 4
oldbit_num = (newbyte_offset * 1920) + (240 * 4) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x10;
// Bit 5
oldbit_num = (newbyte_offset * 1920) + (240 * 5) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x20;
// Bit 6
oldbit_num = (newbyte_offset * 1920) + (240 * 6) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x40;
// Bit 7
oldbit_num = (newbyte_offset * 1920) + (240 * 7) + newbyte_pos;
if (isBitSet(buffer_pointer, oldbit_num))
new_display_byte |= 0x80;
new_display_buf[i] = new_display_byte;
}
}
Почему вы отмечаете два языка? Вы только пишете в одном из них. –
Попробуйте * вставить * или вставить код 'isBitSet' в местах. Изменение путей выполнения замедляет работу процессора. –
компилятор уже может это сделать, но нет необходимости вычислять 'newbyte_offset * 1920' 8 раз .. просто сделайте это один раз. Возможно, вы могли бы предварительно вычислить '240 * x', а затем просто добавить правильный. – yano