Перейти к содержанию
    

Вертикальный прямоугольник в пиксель шириной на ili9341?

Как задать на 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 пикселя, а при попытке нарисовать

вертикальную линию, рисует её горизонтально.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже сам разобрался:

Спойлер

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А это разве сработает на подключении по 8 битной шине (на 16 битной я бы так и сделал),

ведь контроллер будет всё время считывать младший байт и цвет исказится ?

Изменено пользователем Donker

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 hours ago, Donker said:

А это разве сработает на подключении по 8 битной шине (на 16 битной я бы так и сделал),

ведь контроллер будет всё время считывать младший байт и цвет исказится ?

 

ой

просмотрел что там 8-и битная шина и идет посылка старший/младший байт

тогда все верно )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...