LCD基础概念(三):LCD RGB之PCLK、VS、HS、DE

RGB之PCLK、VS、HS、DE

1.Pixel clock像素时钟

  • Pixel clock,也叫RGB clock,也叫Dot clock,一般会简写为pclk。
  • 只要是数字信号处理电路,就必须有时钟信号。在液晶面板中,像素时钟是一个非常重要的时钟信号。像素时钟信号的频率与液晶面板的分辨率有关,分辨率越高,像素时钟信号的频率也越高。
  • 无论对TTL接口液晶面板,还是对LVDS接口面板,像素时钟信号都有两方面作用:
    • 指挥RGB信号按顺序传输,数字RGB信号在像素时钟信号的作用下,按照一定的顺序,由驱动板传输到液晶面板中,使各电路按照一定的节拍协调地工作。
    • 确保数据传输的正确性。无论是驱动板电路,还是液晶面板电路,在读取数字RGB信号时,都是在像素时钟的作用与控制下进行的,各电路只有在像素时钟的下降沿(或上升沿)到来时才对数字RGB数据进行读取,以确保读取数据的正确性。

2.HS与VS同步脉冲信号

  • 行同步信号(HS或HSYNC)和场同步信号(VS或VSYNC)
  • 行同步信号(HS)的作用是选择出液晶面板上有效行信号区间
  • 场同步信号(VS)的作用是选择出液晶面板上有效场信号区间
  • 行场同步信号的共同作用,可将选择出液晶面板上的有效视频信号区间。
  • 需注意:液晶显示器中使用的同步信号是一个不包含消隐信号的两电平信号,而CRT显示器彩电中的同步信号是一个包含消隐信号的三电平信号。这是因为液晶显示器处理的是数字信号,数字信号只能有两种电平,高电平1和低电平0。

3.DE信号

有效数据选通信号也称数据使能信号,在液晶显示器电路中其表示符号有多种,如DEN、DE等,一般称其为DE信号。

  • 设立DE信号的意义
    在输入到液晶显示器的视频信号中,有效视频信号(有效RGB信号)只占信号周期中的一部分,而信号的行消隐和场消隐期间并不包含有效的视频数据。因此,液晶显示器中的有关电路在处理视频信号时,必须将包含有效视频信号的区间和不包含有效视频信号的消隐区间区分开来。为了区分有效和无效视频信号,在液晶显示器电路中设置了DE信号。

  • DE信号及其产生
    在液晶显示器中不能处理三电平的同步/消隐信号,因此,单独设立了一个DE信号。就是说在数字视频信号的电路,一般都需要DE信号。

  • DE与HS、VS的关系,以及前肩后肩的概念:
    在这里插入图片描述

  • DE与RGB数据信号之间的关系:
    在这里插入图片描述
    在这里插入图片描述

  • DE信号与数据读取之间的关系:
    在这里插入图片描述
    DE信号与在像素时钟DCLK的作用下读取RGB数据的示意图。从图上可看出,只有当DE信号在高电平期间,且在像素时钟DCLK为下降沿时(为啥是下降沿?待查),相关电路才能对RGB数据进行读取,以确保读取数据的正确性。

  • DE信号与显示画面之间的关系:
    在这里插入图片描述
    (4)在液晶面板的TTL和LVDS接口中,包括的信号主要有RGB数据信号、像素时钟信号DCLK、行同步信号HS、场同步信号VS及有效显示数据选通信号DE。所有液晶面板都需要输入RGB数据和像素时钟DCLK,但其使用同步信号的方式却不同。

  • 仅使用DE同步信号液晶面板
    这种液晶面板不需要输入行同步信号HS和场同步信号VS,只需要输入DE作为同步信号使用即能正常工作。液晶面板的行同步信号输人端和场同步信号端一般都需要接低电平,否则不能正常工作。

  • 同时使用DE/HS/VS同步信号液晶面板
    这种液晶面板需要同时输入有效显示数据选通信号DE、行同步信号HS、场同步信号VS才能正常工作。

  • 液晶面板单像素/奇偶像素数据输入模式及信号定时(不懂??待理解)
    液晶显示器驱动板向液晶面板传送RGB数据信号的方式有两种:一种为单像素模式(单路方式);另一种为奇偶双像素模式(双路方式),将RGB数据分为奇数像素和偶数像素两路向液晶面板传送。
    在这里插入图片描述

参考

  • 23
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32F103C8T6的I2C接口控制LCD1602的程序实现。 首先,需要在STM32CubeMX中配置I2C引脚和时钟,使能I2C总线。然后,使用HAL库提供的函数来控制LCD1602。 ```c #include "stm32f1xx_hal.h" #include "lcd1602.h" I2C_HandleTypeDef hi2c1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); lcd1602_init(&hi2c1); lcd1602_write_string(&hi2c1, "Hello, world!"); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); } void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); while ((HAL_GetTick() - tickstart) < Delay) { } } void Error_Handler(void) { __disable_irq(); while (1) { } } ``` lcd1602.h: ```c #ifndef __LCD1602_H__ #define __LCD1602_H__ #include "stm32f1xx_hal.h" #define LCD1602_ADDRESS 0x4E void lcd1602_init(I2C_HandleTypeDef *hi2c); void lcd1602_write_string(I2C_HandleTypeDef *hi2c, char *string); #endif ``` lcd1602.c: ```c #include "lcd1602.h" void lcd1602_init(I2C_HandleTypeDef *hi2c) { uint8_t init_data[] = {0x38, 0x08, 0x01, 0x06, 0x0C}; HAL_I2C_Master_Transmit(hi2c, LCD1602_ADDRESS, init_data, sizeof(init_data), HAL_MAX_DELAY); HAL_Delay(100); } void lcd1602_write_string(I2C_HandleTypeDef *hi2c, char *string) { uint8_t data[2]; while (*string) { data[0] = 0x40; data[1] = *string++; HAL_I2C_Master_Transmit(hi2c, LCD1602_ADDRESS, data, sizeof(data), HAL_MAX_DELAY); } } ``` 这个程序使用I2C总线向LCD1602发送数据,通过初始化LCD1602以及写入字符串的函数来实现控制LCD1602。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值