Да я согласен и не против. А можно вопрос, вы уже делали эти функции или пока в теории?) Просто зачем изобретать велосипед, когда один приличный форумчанин может поделиться такой библиотекой? А то мы сейчас 3 разные версии сделаем, наизобретаем велосипедов.
Fusion уже показал как текст выводить, там просто нужно окно под символ задать и потом шлешь данные сплошным блоком. С линиями сложнее. У меня есть код для S6d0129 + FSMC, без кубов и на C++, а у S6d0129 набор команд отличается, потому придется вникать и переделывать.
Спойлер
Код:
void drawLine(int x1, int y1, int x2, int y2, uint16_t color) { int dx = abs(x2 - x1); int dy = abs(y2 - y1); position(x1, y1);
if (dx > dy) { (x1 > x2) ? direction(LcdDir::LeftDown) : direction(LcdDir::RightDown); int sum = dx / 2; beginWriteData(); int add = (y2 > y1) ? 1 : -1; int dx_ = dx; while (dx-- >= 0) { if (sum >= dx_) { sum -= dx_; setY(y1 += add); beginWriteData(); } writeData(color); sum += dy; } } else { (y1 > y2) ? direction(LcdDir::UpLeft) : direction(LcdDir::DownLeft); int sum = dy / 2; beginWriteData(); int add = (x2 > x1) ? 1 : -1; int dy_ = dy; while (dy-- >= 0) { if (sum >= dy_) { sum -= dy_; setX(x1 += add); beginWriteData(); } writeData(color); sum += dx; } } }
Direction одно из 8-ми направлений вывода и задает, остальные функции вроде тоже понятно что делают...
Fusion уже показал как текст выводить, там просто нужно окно под символ задать и потом шлешь данные сплошным блоком. С линиями сложнее.
Да по буквам я понял, что квадратиками задается, а не каждая точка, но как я говорил мне не критично, выводятся у меня они редко. Линии спасибо, попробую убыстрить. Сделал вертикальные и горизонтальные отдельно быстрыми, в 20 раз быстрее работают, но оно и понятно, для рамки и FFT пригодятся.
Да по буквам я понял, что квадратиками задается, а не каждая точка, но как я говорил мне не критично, выводятся у меня они редко. Линии спасибо, попробую убыстрить. Сделал вертикальные и горизонтальные отдельно быстрыми, в 20 раз быстрее работают, но оно и понятно, для рамки и FFT пригодятся.
Тот вариант, что я предлагал, в принципе позволяет не реализовывать отдельно отрисовку строго вертикальных и горизонтальных линий, т.к. разница будет не такая большая.
Последний раз редактировалось Reflector Пт ноя 25, 2016 22:41:08, всего редактировалось 1 раз.
Да по буквам я понял, что квадратиками задается, а не каждая точка, но как я говорил мне не критично, выводятся у меня они редко. Линии спасибо, попробую убыстрить. Сделал вертикальные и горизонтальные отдельно быстрыми, в 20 раз быстрее работают, но оно и понятно, для рамки и FFT пригодятся.
Тот вариант, что я предлагал, в принципе позволяет не реализовывать отдельно отрисовку строго вертикальных и горизонтальных линий, т.к. разница будет не такая небольшая.
Может быть, но я пока не просек: beginWriteData(); - ну может задание координаты относительно position(x1, y1), но не уверен. В ILI можно задать Х1, Х2, и отдельно Y1, Y2, каким образом beginWriteData понимает что задает?
setY, setХ- что это? Могу предположить что перед beginWriteData как раз и обновляет новый Х или Y, но вначале то их нет.. int sum = dx / 2; beginWriteData();
Можно еще вот эти функции setY, setХ, beginWriteData?
И еще S6d0129 умеет инструментировать сразу обе координаты что-ли? Слева-вниз, справа-вниз, сверху-налево, снизу-налево. ILI9341 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Можно еще вот эти функции setY, setХ, beginWriteData?
BeginWriteData - это команда дающая индикатору понять, что после нее будут идти непосредственно данные цветов. Для S6d0129 и Ili9328 она называется "Write data to GRAM", код 0x22. Она всегда идет перед первой writeData, если до этого выполнялись другие команды, такие как изменение координат. А setX и setY - это команды GRAM Horizontal/Vertical Address(0x20, 0x21), position вызывает их же, только вместе. Все координаты абсолютные.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
BeginWriteData - это команда дающая индикатору понять, что после нее будут идти непосредственно данные цветов. Для S6d0129 и Ili9328 она называется "Write data to GRAM", код 0x22. Она всегда идет перед первой writeData, если до этого выполнялись другие команды, такие как изменение координат. А setX и setY - это команды GRAM Horizontal/Vertical Address(0x20, 0x21), position вызывает их же, только вместе. Все координаты абсолютные.
ну я так и понял, сделал, только вот затык: S6d0129 умеет инструментировать сразу обе координаты что-ли? Слева-вниз, справа-вниз, сверху-налево, снизу-налево. ILI9341 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)
ну я так и понял, сделал, только вот затык: S6d0129 умеет инструментировать сразу обе координаты что-ли? Слева-вниз, справа-вниз, сверху-налево, снизу-налево. ILI9341 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)
ILI9341 более продвинутый, а по диагонали и S6d0129 не умеет. Фактически тот же RightDown отличается от RightUp только тем, что если, допустим, задать окно для символа и заполнить одну линию, то следующая будет ниже или выше, но для рисования линий этот режим не используется, т.к. предполагается, что за пределы окна мы не выходим. Другими словами LeftDown и RightDown - это просто Left и Right.
Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
Добавлено: Пт ноя 25, 2016 23:17:56
Вопрос с выводом точки. На моём индикаторе (от S5230, S6D041) имеются команды CASET и RASET, определяют поле вывода. Сначала отправляю координаты Xstart, Xend, затем Ystart, Yend... Для точки я должен отправить текущую координату (start) и инкремент (end) по X и Y? Я правильно понял принцип вывода точки? Или достаточно задать только Xstart, Ystart? Спасибо.
ILI9341 более продвинутый, а по диагонали и S6d0129 не умеет. Фактически тот же RightDown отличается от RightUp только тем, что если, допустим, задать окно для символа и заполнить одну линию, то следующая будет ниже или выше, но для рисования линий этот режим не используется, т.к. предполагается, что за пределы окна мы не выходим. Другими словами LeftDown и RightDown - это просто Left и Right.
Задумку я понял, но при смене одной из координат, текущее положение курсора сбрасывается. И получается вместо линий квадратики, прямоугольники. Т.е. Линия идет по Х, затем должен быть излом на 1 пиксель по Y, и все бы ничего, только вместе с Y пиксели начинают сначала по X, получается прямоугольник, в котором количество пикселей равно количеству в линии. Пока борюсь безуспешно, сбрасывается и все, CS я не трогаю, видимо такая у него логика работы, если окно сменили, начинает сначала. X подвинуть туда где он был можно, но тогда и прикола нет то.
X подвинуть туда где он был можно, но тогда и прикола нет то.
Если это особенность данного индикатора, хотя подозрительно, то в крайнем случае можно и две координаты сразу менять, все равно это придется делать через определенное число точек с заметным ускорением для вытянутых по одной из осей линий.
X подвинуть туда где он был можно, но тогда и прикола нет то.
Если это особенность данного индикатора, хотя подозрительно, то в крайнем случае можно и две координаты сразу менять, все равно это придется делать через определенное число точек с заметным ускорением для вытянутых по одной из осей линий.
Победил, сбрасывать он сбрасывает, но мы сэкономили на другом, записываю только начало X и Y. Итого 634 ФПС против 271 ( средний на 2х линиях. просто для сравнения)
Спрятал под спойлер, а то нас попрут уже скоро отсюда с этим экраном, оно давно и пора Спойлер
Код:
//ILI9341_DrawFastLine(0, 00 , 320, 20, RED ); ILI9341_DrawLine(0, 10 , 320, 30, GREEN );
FPS_temp++;
//ILI9341_DrawFastLine(10, 0 , 290, 240, RED ); ILI9341_DrawLine(20, 0 , 300, 240, GREEN );
FPS_temp++;
Код:
void ILI9341_DrawFastLine(int x1, int y1, int x2, int y2, uint16_t color) { int dx = abs(x2 - x1); int dy = abs(y2 - y1);
if (dx > dy) { TFT_CS_RESET; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_RESET; SPI_SendData8(SPI1, ILI9341_MAC); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_SET; SPI_SendData8(SPI1, 0xE8); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_CS_SET;
spi16(); ILI9341_SetCursorPosition ( (uint16_t)x1, (uint16_t)y1, (uint16_t)x2, (uint16_t)y2); int sum = dx / 2; int add = (y2 > y1) ? 1 : -1; int dx_ = dx; while (dx-- >= 0) { if (sum >= dx_) { sum -= dx_; y1 += add; //setY ILI9341_SetStartCursorPosition(x1, y1); } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); x1++; sum += dy; } } else { TFT_CS_RESET; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_RESET; SPI_SendData8(SPI1, ILI9341_MAC); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_SET; SPI_SendData8(SPI1, 0x88); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_CS_SET;
spi16(); ILI9341_SetCursorPosition ( (uint16_t)y1, (uint16_t)x1, (uint16_t)y2, (uint16_t)x2); int sum = dy / 2; int add = (x2 > x1) ? 1 : -1; int dy_ = dy; while (dy-- >= 0) { if (sum >= dy_) { sum -= dy_; x1 += add; //setX ILI9341_SetStartCursorPosition(y1, x1); } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); y1++; sum += dx; } } while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_CS_SET; spi8(); TFT_CS_RESET; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_RESET; SPI_SendData8(SPI1, ILI9341_MAC); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_SET; SPI_SendData8(SPI1, 0xE8); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_CS_SET; }
Может код стоит чуть подправить, но 2 часа ночи уже. Прирост скорости меня радует, всем спасибо.
Добавлено after 8 hours 1 minute 54 seconds: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект Все-таки лучше использовать проверку и 16 бит. чем 8бит без проверок, иначе при делителях больших чем 2 и 4, проц успевает напихать в SPI кучу всего. По крайней мере нужно понимать это. [spoiler]
Код:
//SPI_SendData8(SPI1, (color>>8)); //SPI_SendData8(SPI1, color); while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); // только 2 байта цвета
Вот чуть причесал и поправил косячек в функции быстрой линии, теперь она основная будет конечно. Все работает независимо от скорости SPI
Код:
void ILI9341_SetMAC(uint8_t data){ while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_RESET; SPI_SendData8(SPI1, ILI9341_MAC); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_SET; SPI_SendData8(SPI1, data); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); }
void ILI9341_DrawFastLine(int x1, int y1, int x2, int y2, uint16_t color) { int dx = abs(x2 - x1); int dy = abs(y2 - y1); TFT_CS_RESET; if (dx > dy) { //ILI9341_SetMAC(0xE8); не делаем, итак такое значение spi16(); ILI9341_SetCursorPosition ( x1, y1, x2, y2);// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд int sum = dx / 2; int add = (y2 > y1) ? 1 : -1; int dx_ = dx; while (dx-- > 0) { if (sum >= dx_) { sum -= dx_; y1 += add; ILI9341_SetStartCursorPosition(x1, y1);// задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); // только 2 байта цвета x1++; sum += dy; } } else { ILI9341_SetMAC(0x88); // меняем направление вывода spi16(); ILI9341_SetCursorPosition ( y1, x1, y2, x2); // задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд int sum = dy / 2; int add = (x2 > x1) ? 1 : -1; int dy_ = dy; while (dy-- > 0) { if (sum >= dy_) { sum -= dy_; x1 += add; ILI9341_SetStartCursorPosition(y1, x1); // задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); // только 2 байта цвета y1++; sum += dx; } ILI9341_SetMAC(0xE8); // возвращаем направление вывода } while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_CS_SET; spi8(); }
Добавлено after 9 minutes 11 seconds: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект Но для полного задротства по скорости все-таки для горизонтальных и вертикальных нужно свои функции юзать: ILI9341_DrawFastLine(0, 10 , 320, 10, RED );= 3720 ФПС ILI9341_DrawFastHLine(0, 10 , 320, RED ); = 4956 ФПС ILI9341_DrawLine(0, 10 , 320, 10, GREEN ); = 403 ФПС
Диагональная линия, наименьший эффект ILI9341_DrawFastLine(0, 0 , 320, 240, RED ); = 560 ФПС ILI9341_DrawLine(0, 0 , 320, 240, GREEN ); = 384 ФПС
Добавлено after 18 minutes 21 second: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект Добавил защиту от дурака чтобы линия не выходила за экран.
Код:
void ILI9341_DrawLine(int x1, int y1, int x2, int y2, uint16_t color) { uint16_t tmp;
/* Check for overflow */ if (x1 >= ILI9341_Opts.Width) { x1 = ILI9341_Opts.Width - 1; } if (x2 >= ILI9341_Opts.Width) { x2 = ILI9341_Opts.Width - 1; } if (y1 >= ILI9341_Opts.Height) { y1 = ILI9341_Opts.Height - 1; } if (y2 >= ILI9341_Opts.Height) { y2 = ILI9341_Opts.Height - 1; }
int dx = abs(x2 - x1); int dy = abs(y2 - y1); TFT_CS_RESET; if (dx > dy) { //ILI9341_SetMAC(0xE8); не делаем, итак такое значение spi16(); ILI9341_SetCursorPosition ( x1, y1, x2, y2);// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд int sum = dx / 2; int add = (y2 > y1) ? 1 : -1; int dx_ = dx; while (dx-- > 0) { if (sum >= dx_) { sum -= dx_; y1 += add; ILI9341_SetStartCursorPosition(x1, y1);// задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); // только 2 байта цвета x1++; sum += dy; } } else { ILI9341_SetMAC(0x88); // меняем направление вывода spi16(); ILI9341_SetCursorPosition ( y1, x1, y2, x2); // задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд int sum = dy / 2; int add = (x2 > x1) ? 1 : -1; int dy_ = dy; while (dy-- > 0) { if (sum >= dy_) { sum -= dy_; x1 += add; ILI9341_SetStartCursorPosition(y1, x1); // задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); // только 2 байта цвета y1++; sum += dx; } ILI9341_SetMAC(0xE8); // возвращаем направление вывода } while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_CS_SET; spi8(); }
Добавлено after 3 hours 1 minute 8 seconds: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект Рано обрадовался, вставил рисовалку линий в осцил и оказалась что там горбатый закрался Рисует только слева на право и сверху вниз, не зря там проверки были. Нужно дорабатывать.
Рано обрадовался, вставил рисовалку линий в осцил и оказалась что там горбатый закрался Рисует только слева на право и сверху вниз, не зря там проверки были. Нужно дорабатывать.
Я для проверки восьмиугольник рисовал, там как раз разные направления задействованы. ps. У тебя в первой ветке x1++, а направление по X может быть разным... То же самое для y++ во второй. Стоп, так в первой ветке направление вывода не меняется, а нужно ведь не просто менять с горизонтального на вертикальный, а с одного из 2х горизонтальных направлений, на одно из двух вертикальных.
Я для проверки восьмиугольник рисовал, там как раз разные направления задействованы. ps. У тебя в первой ветке x1++, а направление по X может быть разным... То же самое для y++ во второй. Стоп, так в первой ветке направление вывода не меняется, а нужно ведь не просто менять с горизонтального на вертикальный, а с одного из 2х горизонтальных направлений, на одно из двух вертикальных.
Да, в этом и косяк, просто я вчера сделал так, проверил. Ну вроде работает, а в обратную сторону то фигушки) Переделал, но что то сложно вышло, не знаю, пытался сделать как в примере с помошью 4х переключений, но не выходит. ну и ладно так работает все равно быстро, хоть и выглядит сложно.
Спойлер
Код:
void ILI9341_SetMAC(uint8_t data){ TFT_CS_RESET; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_RESET; SPI_SendData8(SPI1, ILI9341_MAC); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_SET; SPI_SendData8(SPI1, data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_RESET; SPI_SendData8(SPI1, ILI9341_GRAM);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); TFT_DC_SET; TFT_CS_SET; }
void ILI9341_DrawLine(int x1, int y1, int x2, int y2, uint16_t color) { /* Check for overflow */ if (x1 >= ILI9341_Opts.Width) { x1 = ILI9341_Opts.Width - 1; } if (x2 >= ILI9341_Opts.Width) { x2 = ILI9341_Opts.Width - 1; } if (y1 >= ILI9341_Opts.Height) { y1 = ILI9341_Opts.Height - 1; } if (y2 >= ILI9341_Opts.Height) { y2 = ILI9341_Opts.Height - 1; }
int dx = (x2 - x1); if (dx<0) dx=-dx; int dy = (y2 - y1); if (dy<0) dy=-dy; int x0, y0;
if (dx >= dy) { int addY;
if (x1 > x2) { x0=320-x1; if (y1 > y2){ ILI9341_SetMAC(0x08|(0<<7)|(0<<6)|(1<<5)|(0<<4)); // меняем направление вывода spi16(); TFT_CS_RESET; y0=240-y1; addY = 1; ILI9341_SetCursorPosition ( 320-x1, 240-y1, 320-x2, 240-y2);// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд } else { ILI9341_SetMAC(0x08|(0<<7)|(1<<6)|(1<<5)|(0<<4)); spi16(); TFT_CS_RESET; addY = 1; y0=y1; ILI9341_SetCursorPosition ( 320-x1, y1, 320-x2, y2); }// } else { x0=x1; if (y1 > y2){ ILI9341_SetMAC(0x08|(1<<7)|(0<<6)|(1<<5)|(0<<4)); spi16(); TFT_CS_RESET; y0=240-y1; addY = 1; ILI9341_SetCursorPosition ( x1, 240-y1, x2, 240-y2);}// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд else{ ILI9341_SetMAC (0x08|(1<<7)|(1<<6)|(1<<5)|(0<<4)); spi16(); TFT_CS_RESET; y0=y1; addY = 1; ILI9341_SetCursorPosition ( x1, y1, x2, y2); } } int sum = dx / 2; int dx_ = dx; while (dx-- > 0) { if (sum >= dx_) { sum -= dx_; y0 += addY; ILI9341_SetStartCursorPosition(x0, y0);// задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); // только 2 байта цвета //_delay_ms(10); x0++; sum += dy; } }
int sum = dy / 2; int dy_ = dy; while (dy-- > 0) { if (sum >= dy_) { sum -= dy_; x0 += addX; ILI9341_SetStartCursorPosition(y0, x0); } while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, color); //_delay_ms(10); y0++; sum += dx; } } while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)); spi8(); ILI9341_SetMAC(0xE8); }
Я извиняюсь, ну раз тут вели разговор о рисовании шрифтов.
Было Спойлер
Код:
void ILI9341_Putc(uint16_t x, uint16_t y, char c, FontDef_t *font, uint16_t foreground, uint16_t background) { uint32_t i, b, j;
/* Set coordinates */ ILI9341_x = x; ILI9341_y = y; if ((ILI9341_x + font->FontWidth) > ILI9341_Opts.Width) { //If at the end of a line of display, go to new line and set x to 0 position ILI9341_y += font->FontHeight; ILI9341_x = 0; } for (i = 0; i < font->FontHeight; i++) { b = font->data[(c - 32) * font->FontHeight + i]; for (j = 0; j < font->FontWidth; j++) { if ((b << j) & 0x8000) { ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), foreground); } else { ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), background); } } } ILI9341_x += font->FontWidth;
}
Чуть вкурил и изменил 3 строчки Спойлер
Код:
void ILI9341_Putc(uint16_t x, uint16_t y, char c, FontDef_t *font, uint16_t foreground, uint16_t background) { uint32_t i, b, j;
/* Set coordinates */ ILI9341_x = x; ILI9341_y = y; if ((ILI9341_x + font->FontWidth) > ILI9341_Opts.Width) { //If at the end of a line of display, go to new line and set x to 0 position ILI9341_y += font->FontHeight; ILI9341_x = 0; } ILI9341_SetCursorPosition(ILI9341_x, ILI9341_y, (ILI9341_x + font->FontWidth-1), (ILI9341_y + font->FontHeight-1));
for (i = 0; i < font->FontHeight; i++) { b = font->data[(c - 32) * font->FontHeight + i]; for (j = 0; j < font->FontWidth; j++) { if ((b << j) & 0x8000) { //ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), foreground); while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, foreground); } else { //ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), background); while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); SPI_I2S_SendData16(SPI1, background); } } } ILI9341_x += font->FontWidth; }
5 ФПС, стало 66 Я в шоке, вот неужели сразу нельзя сделать по-человечески и таких же библиотек большинство, где все через точку в тупую рисуется. Теперь шпарит и текст как из пушки
Я в шоке, вот неужели сразу нельзя сделать по-человечески и таких же библиотек большинство, где все через точку в тупую рисуется. Теперь шпарит и текст как из пушки
А это прописная истина, которую многие почему-то ещё и оспаривают - стандартные либы в большинстве своём не фонтан. Никто не сделает лучше, чем мы сами.
Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
Добавлено: Пн дек 26, 2016 15:25:33
Делал вывод через точки - было 30 fps, переделал на алгоритм брезенхема - упало до 9 fps. Печалька. Киньтесь кто-нибудь алгоритмом на асемблере для STM32 для изучения? Спасибо.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения