Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TFT LCD дисплей.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Jenya7
Хотелось узнать принцип работы такого дисплея. Он принимает следующие сигнальные линии
RED – 8 lines, GREEN – 8 lines, BLUE – 8 lines, CLK, VSYNC, HSYNC, DataEnable.
Допустим мы хотим поставить точку по координатам x = 10, y = 20 тогда
Выставляем цвет на RGB линиях, VSYNC тикает 10 раз, HSYNC тикает 20 раз, активируем DataEnable. Так ли это или я ошибаюсь?
x893
Ошибаетесь
стр 15 и далее
Jenya7
Цитата(x893 @ Oct 7 2016, 15:04) *
Ошибаетесь
стр 15 и далее

судя по диаграме на каждый HSYNC строб перерисуется вся линия. То есть общая картина такая - CLK молотит все время, HSYNC и VSYNC молотят все время а мы только обновляем данные на RGB линиях ?
yuravg
Цитата(Jenya7 @ Oct 7 2016, 13:25) *
судя по диаграме на каждый HSYNC строб перерисуется вся линия. То есть общая картина такая - CLK молотит все время, HSYNC и VSYNC молотят все время а мы только обновляем данные на RGB линиях ?

VSYNC - строб для всей картинки
HSYNC - строб для строки в картинке
de - данные в строке (может полностью совпадать с HSYNC)
clk - есть всегда
x893
Цитата(yuravg @ Oct 7 2016, 13:41) *
VSYNC - строб для всей картинки
HSYNC - строб для строки в картинке
de - данные в строке (может полностью совпадать с HSYNC)
clk - есть всегда

DE обычно меньше - так как есть зоны черные слева - справа
и сверху-снизу тоже есть области
Но это все в контроллере задается.
Jenya7
Если я смотрю на драйвер со стороны контроллера то я вижу такой код.
Код
//-----------------------------------------------------------------------------
  // FUNCTION:    D4DLCDHW_SendDataWord_K70LCDC
  // SCOPE:       Low Level Driver API function
  // DESCRIPTION: The function send the one 16 bit variable into LCD  
  //
  // PARAMETERS:  unsigned long addr          address to write data
  //                            unsigned short value    variable to send
  //
  // RETURNS:     none
  //-----------------------------------------------------------------------------
  static void D4DLCDHW_WriteData_K70LCDC(unsigned long addr, D4D_COLOR value)
  {      
    #if D4D_COLOR_SYSTEM  == D4D_COLOR_SYSTEM_RGB565
        *((unsigned long*)addr) =((value & 0xf800)<<8)|((value & 0x07e0)<<5)|((value & 0x001F)<<3);    
    #elif D4D_COLOR_SYSTEM == D4D_COLOR_SYSTEM_RGB888
        *((unsigned long*)addr) = value;
    #endif    
  }

Это запись в LCD – запись значения по какому то адресу. А где управление линиями? Где установка цвета?
Andrew Su
Добрый день.
Приведенный вами фрагмент программы записывает в ячейку видеопамяти значение пиксела(точки) на экране.
Если установлено D4D_COLOR_SYSTEM_RGB565, то
пиксел имеет 16 бит, из них
5 бит red составляющей цвета, 6 бит - green составляющей цвета и 5 бит blue составляющей цвета.
Если установлено D4D_COLOR_SYSTEM_RGB888, то все составляющие по 8 бит и пиксел, соответственно 24 бита.
Сигналами VSYNC, HSYNC, DE управляет видеоконтроллер, к которому подключен дисплей. Он же выдает CLK.
aaarrr
Цитата(Jenya7 @ Oct 7 2016, 15:36) *
Это запись в LCD – запись значения по какому то адресу. А где управление линиями? Где установка цвета?

Это для экрана со встроенным контроллером и интерфейсом 8080/6800.
Jenya7
Цитата(aaarrr @ Oct 7 2016, 19:02) *
Это для экрана со встроенным контроллером и интерфейсом 8080/6800.

я не знаю какой интерфейс у дисплея. но это его функции управления. дисплей определяется в конфигурационном файле
Код
//low level driver for Kinetis K70 MCU LCDC peripherial
#define D4D_LLD_LCD_HW d4dlcdhw_k70_lcdc

ну и
Код
// the main structure that contains low level driver api functions
  // the name fo this structure is used for recognizing of configured low level driver of whole D4D
  // so this name has to be used in main configuration header file of D4D driver to enable this driver
  const D4DLCDHWFB_FUNCTIONS d4dlcdhw_k70_lcdc =
  {
    D4DLCDHW_Init_K70LCDC,    
    D4DLCDHW_WriteData_K70LCDC,
    D4DLCDHW_ReadData_K70LCDC,
    D4DLCDHW_GetFbDescriptor_K70LCDC,
    D4DLCDHW_PinCtl_K70LCDC,
    D4DLCD_FlushBuffer_K70LCDC,
    D4DLCDHW_DeInit_K70LCDC
  };

а D4DLCDHW_WriteData_K70LCDC мы уже видели.
кстати там можно выбрать и 8080/6800.
Код
/ d4dlcdhw_gpio6800_8b - low level hw interface driver for gpio drived parallel 8b 6800 bus
// d4dlcdhw_gpio8080_8b - low level hw interface driver for gpio drived parallel 8b 8080 bus
// d4dlcdhw_gpio8080_byte_8b - low level hw interface driver for gpio drived parallel 8b 8080 bus


Ну допустим со стороны дисплея есть SDRAM и мы пишем в адрес памяти. Но как? По каким линиям? Вот демонстрационный пример
CODE
/********************************************************************/
/*
* Display Red, Green, Blue, and White in each quadrant of the screen. Enable the
* graphic window to be displayed or not displayed, which will be a black rectangle
*/
void lcdc_color_demo()
{
color_demo_data(); //Create the frame buffer data for background plane and graphic window
color_demo_gw_setup(); //Initialize the graphic window registers for this demo

// set LCD Screen Start Address
LCDC_LSSAR = FRAME_START_ADDRESS;

// set LCD graphic window start address
LCDC_LGWSAR = GW_START_ADDRESS;

SIM_MCR|=SIM_MCR_LCDSTART_MASK; //Start LCDC

while(1)
{
in_char(); //Wait for input
LCDC_LGWCR&=~LCDC_LGWCR_GWE_MASK; //Turn off graphic window
in_char(); //Wait for input
LCDC_LGWCR|=LCDC_LGWCR_GWE_MASK; //Turn on graphic window
}

}

/*
* Create a frame buffer with the data to display on the LCD
*/
void color_demo_data()
{
int *pointer32;
int i,n;

/*
* Create the frame buffer so that the screen will be divided into 4 quadrants
* of a different color:
* RG
* BW
*/
pointer32=(int *)FRAME_START_ADDRESS;

//Loop through top half of screen
for(i=0;i<SCREEN_YSIZE/2;i++)
{
//One half will be red
for(n=0;n<SCREEN_XSIZE/2;n++)
{
*pointer32=0x00FF0000; //Red
pointer32++;
}

//One half will be green
for(n=0;n<SCREEN_XSIZE/2;n++)
{
*pointer32=0x0000FF00; //Green
pointer32++;
}
}

//Loop through bottom half of screen
for(i=0;i<SCREEN_YSIZE/2;i++)
{
//One half will be blue
for(n=0;n<SCREEN_XSIZE/2;n++)
{
*pointer32=0x000000FF; //Blue
pointer32++;
}

//One half will be white
for(n=0;n<SCREEN_XSIZE/2;n++)
{
*pointer32=0x00FFFFFF; //White
pointer32++;
}
}

/* Create a graphic window filled with the color black*/
pointer32=(int *)GW_START_ADDRESS;
for(i=0;i<GW_BUFFER_SIZE/4;i++)
{
*pointer32=0x00000000; //Black
pointer32++;
}
}

/*
* Initialize the graphic window registers to create a graphic window in the
* middle of the screen
*/
void color_demo_gw_setup()
{
// set LCD graphic window size
LCDC_LGWSR =
LCDC_LGWSR_GWW(GW_XSIZE/16) |
LCDC_LGWSR_GWH(GW_YSIZE);

// set LCD graphic window virtual page width
LCDC_LGWVPWR = GW_XSIZE;

// set LCD graphic window panning offset (not used in 24bpp mode)
LCDC_LGWPOR = 0;

// set LCD graphic window position so that the GW will cover up the middle of screen
LCDC_LGWPR =
LCDC_LGWPR_GWXP(SCREEN_XSIZE/4) |
LCDC_LGWPR_GWYP(SCREEN_YSIZE/4);

// set LCD graphic window control
LCDC_LGWCR =
LCDC_LGWCR_GWAV(0xff) | // alpha-transparent value (0xFF is opaque)
LCDC_LGWCR_GWE_MASK;
}

в color_demo_data() перебираются адреса и заноситься дата. а где управление линиями? в MK70FN1M0Vyy12 есть встроенный LCD модуль. он что автоматически всем управляет? а адрес это что, координаты?
aaarrr
Цитата(Jenya7 @ Oct 7 2016, 17:45) *
я не знаю какой интерфейс у дисплея. но это его функции управления. дисплей определяется в конфигурационном файле

Наврал я в предыдущем сообщении. Интерфейс у вашего экрана RGB, про цвет и управление Andrew Su написал.
Jenya7
Цитата(Andrew Su @ Oct 7 2016, 18:35) *
Добрый день.
Приведенный вами фрагмент программы записывает в ячейку видеопамяти значение пиксела(точки) на экране.
Если установлено D4D_COLOR_SYSTEM_RGB565, то
пиксел имеет 16 бит, из них
5 бит red составляющей цвета, 6 бит - green составляющей цвета и 5 бит blue составляющей цвета.
Если установлено D4D_COLOR_SYSTEM_RGB888, то все составляющие по 8 бит и пиксел, соответственно 24 бита.
Сигналами VSYNC, HSYNC, DE управляет видеоконтроллер, к которому подключен дисплей. Он же выдает CLK.

спасибо. понемногу проясняется. а адресс? как мы выбираем адрес? и как мы передаем его? у нас ведь нет адресных линий.
aaarrr
Цитата(Jenya7 @ Oct 7 2016, 18:03) *
а адресс? как мы выбираем адрес? и как мы передаем его? у нас ведь нет адресных линий.

У вас есть буфер в ОЗУ. Адрес точки есть <адрес начала буфера> + (Y * <количество точек в строке> + X) * <размер точки в байтах>
Jenya7
Цитата(aaarrr @ Oct 7 2016, 20:11) *
У вас есть буфер в ОЗУ. Адрес точки есть <адрес начала буфера> + (Y * <количество точек в строке> + X) * <размер точки в байтах>

По моему до меня дошло. Мы обращаемся в адрес микроконтроллера, то есть по сути дела обращаемся к координате пикселя и передаем дату – цвет, который мы хотим записать в данный пиксель. А микроконтроллер сам разруливает сигнальные линии на основе данных которые мы ему записали. Я прав? Единственно что не понятно – эти адресса это адреса регистров?
Есть такое определение
Код
#define FRAME_START_ADDRESS 0x80400000  //Screen in DDR

Куда код обращается? К внешней памяти? Или внутренний RAM?
aaarrr
Цитата(Jenya7 @ Oct 7 2016, 18:20) *
Единственно что не понятно – эти адресса это адреса регистров?

Это адреса в памяти контроллера. Контроллер осуществляет непрерывную развертку LCD,
данные для развертки берутся из памяти контроллера.

Со стороны программы экран - это просто участок памяти.

Цитата(Jenya7 @ Oct 7 2016, 18:20) *
Есть такое определение
Код
#define FRAME_START_ADDRESS 0x80400000  //Screen in DDR

Куда код обращается? К внешней памяти? Или внутренний RAM?

Комментарий как бы намекает, что это адрес во внешней DDR.
Jenya7
Цитата(aaarrr @ Oct 7 2016, 20:30) *
Это адреса в памяти контроллера. Контроллер осуществляет непрерывную развертку LCD,
данные для развертки берутся из памяти контроллера.

Со стороны программы экран - это просто участок памяти.


Комментарий как бы намекает, что это адрес во внешней DDR.

я понял. спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.