Donker 0 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Как задать на ili9341 вертикальную область для заливки цветом шириной в один пиксель, что бы таким образом максимально быстро рисовать вертикальные линии? Спойлер void TFT_Draw_Rect(uint16_t x, uint16_t y, uint16_t length, uint16_t height, uint16_t color) //залитый прямоугольник { /////////////////////////////////////////////////////////////////////////////////////// CS_LOW; uint8_t color_hi = color>>8; uint8_t color_lo = color; uint32_t pixels = length * height; if(1==length){length = X_SIZE - 1;} else{length = length + (x - 1);} if(1==height){height = Y_SIZE - 1;} else{height = height + (y - 1);} //-------------------------------------------------------------------------------------- unsigned long t; t = x; t<<=16; t |= length; //-------------------------------------------------------------- //Column Addres Set RS_LOW; //линия в состоянии посылки команды GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2A; WR_STROBE; RS_HI; ////линия в состоянии посылки данных GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>24); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>16); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>8); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t); WR_STROBE; //-------------------------------------------------------------- t = y; t<<=16; t |= height; //-------------------------------------------------------------- //Page Addres Set RS_LOW; //линия в состоянии посылки команды GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2B; WR_STROBE; RS_HI; ////линия в состоянии посылки данных GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>24); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>16); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>8); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t); WR_STROBE; //-------------------------------------------------------------- //-------------------------------------------------------------- RS_LOW;//линия в состоянии посылки команды GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2C; WR_STROBE; //-------------------------------------------------------------- RS_HI; //линия в состоянии посылки данных //-------------------------------------------------------------- for (uint32_t i=0; i<pixels; i++) { GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| color_hi; WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| color_lo; WR_STROBE; } CS_HI; //////////////////////////////////////////////////////////////////////////////////////// } этот код рисует нормально прямоугольники высотой в 1 пиксель (горизонтальные линии) и любые другие прямоугольники шириной минимум 2 пикселя, а при попытке нарисовать вертикальную линию, рисует её горизонтально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 15 февраля, 2019 Опубликовано 15 февраля, 2019 · Жалоба Уже сам разобрался: Спойлер void TFT_Draw_Rect(uint16_t x, uint16_t y, uint16_t len_x, uint16_t len_y, uint16_t color) //залитый прямоугольник { /////////////////////////////////////////////////////////////////////////////////////// CS_LOW; uint8_t color_hi = color>>8; uint8_t color_lo = color; uint32_t pixels = len_x * len_y; len_x = (len_x + x) - 1; len_y = (len_y + y) - 1; //-------------------------------------------------------------------------------------- unsigned long t; t = x; t<<=16; t |= len_x; //-------------------------------------------------------------- //Column Addres Set RS_LOW; //линия в состоянии посылки команды GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2A; WR_STROBE; RS_HI; ////линия в состоянии посылки данных GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>24); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>16); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>8); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t); WR_STROBE; //-------------------------------------------------------------- t = y; t<<=16; t |= len_y; //-------------------------------------------------------------- //Page Addres Set RS_LOW; //линия в состоянии посылки команды GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2B; WR_STROBE; RS_HI; ////линия в состоянии посылки данных GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>24); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>16); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>8); WR_STROBE; GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t); WR_STROBE; //-------------------------------------------------------------- ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 16 февраля, 2019 Опубликовано 16 февраля, 2019 (изменено) · Жалоба не нужно при каждой итерации цикла выставлять данные на шину их нужно выставить один раз перед циклом, а в цикле просто щелкать стробом. Изменено 16 февраля, 2019 пользователем Zeal0t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 16 февраля, 2019 Опубликовано 16 февраля, 2019 (изменено) · Жалоба А это разве сработает на подключении по 8 битной шине (на 16 битной я бы так и сделал), ведь контроллер будет всё время считывать младший байт и цвет исказится ? Изменено 16 февраля, 2019 пользователем Donker Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 17 февраля, 2019 Опубликовано 17 февраля, 2019 · Жалоба 19 hours ago, Donker said: А это разве сработает на подключении по 8 битной шине (на 16 битной я бы так и сделал), ведь контроллер будет всё время считывать младший байт и цвет исказится ? ой просмотрел что там 8-и битная шина и идет посылка старший/младший байт тогда все верно ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться