|
TFT LCD дисплей. |
|
|
|
Oct 7 2016, 09:44
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Хотелось узнать принцип работы такого дисплея. Он принимает следующие сигнальные линии RED – 8 lines, GREEN – 8 lines, BLUE – 8 lines, CLK, VSYNC, HSYNC, DataEnable. Допустим мы хотим поставить точку по координатам x = 10, y = 20 тогда Выставляем цвет на RGB линиях, VSYNC тикает 10 раз, HSYNC тикает 20 раз, активируем DataEnable. Так ли это или я ошибаюсь?
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Oct 7 2016, 10:41
|
Участник

Группа: Свой
Сообщений: 63
Регистрация: 12-08-15
Из: Санкт-Петербург
Пользователь №: 87 968

|
Цитата(Jenya7 @ Oct 7 2016, 13:25)  судя по диаграме на каждый HSYNC строб перерисуется вся линия. То есть общая картина такая - CLK молотит все время, HSYNC и VSYNC молотят все время а мы только обновляем данные на RGB линиях ? VSYNC - строб для всей картинки HSYNC - строб для строки в картинке de - данные в строке (может полностью совпадать с HSYNC) clk - есть всегда
|
|
|
|
|
Oct 7 2016, 12:36
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Если я смотрю на драйвер со стороны контроллера то я вижу такой код. Код //----------------------------------------------------------------------------- // 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 – запись значения по какому то адресу. А где управление линиями? Где установка цвета?
|
|
|
|
|
Oct 7 2016, 14:45
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(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 модуль. он что автоматически всем управляет? а адрес это что, координаты?
Сообщение отредактировал Jenya7 - Oct 7 2016, 14:58
|
|
|
|
|
Oct 7 2016, 15:03
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(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. спасибо. понемногу проясняется. а адресс? как мы выбираем адрес? и как мы передаем его? у нас ведь нет адресных линий.
|
|
|
|
|
Oct 7 2016, 15:20
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(aaarrr @ Oct 7 2016, 20:11)  У вас есть буфер в ОЗУ. Адрес точки есть <адрес начала буфера> + (Y * <количество точек в строке> + X) * <размер точки в байтах> По моему до меня дошло. Мы обращаемся в адрес микроконтроллера, то есть по сути дела обращаемся к координате пикселя и передаем дату – цвет, который мы хотим записать в данный пиксель. А микроконтроллер сам разруливает сигнальные линии на основе данных которые мы ему записали. Я прав? Единственно что не понятно – эти адресса это адреса регистров? Есть такое определение Код #define FRAME_START_ADDRESS 0x80400000 //Screen in DDR Куда код обращается? К внешней памяти? Или внутренний RAM?
|
|
|
|
|
Oct 7 2016, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Jenya7 @ Oct 7 2016, 18:20)  Единственно что не понятно – эти адресса это адреса регистров? Это адреса в памяти контроллера. Контроллер осуществляет непрерывную развертку LCD, данные для развертки берутся из памяти контроллера. Со стороны программы экран - это просто участок памяти. Цитата(Jenya7 @ Oct 7 2016, 18:20)  Есть такое определение Код #define FRAME_START_ADDRESS 0x80400000 //Screen in DDR Куда код обращается? К внешней памяти? Или внутренний RAM? Комментарий как бы намекает, что это адрес во внешней DDR.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|