Да я согласен и не против. А можно вопрос, вы уже делали эти функции или пока в теории?) Просто зачем изобретать велосипед, когда один приличный форумчанин может поделиться такой библиотекой? А то мы сейчас 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 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Можно еще вот эти функции 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 для изучения? Спасибо.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения