:mod:`lcd` --- lcd扩展板驱动 ================================ .. module:: lcd :synopsis: lcd扩展板驱动 ``lcd`` 模块用于驱动 SPI LCD、24 位并行 LCD、MIPI DSI LCD、HDMI 输出和 Display Port 输出。 驱动 128x160 LCD 扩展板的示例用法:: import sensor, lcd # Setup camera. 设置摄像机。 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QQVGA2) # 特用于LCD液晶显示屏的128x160分辨率。 sensor.skip_frames() lcd.init() # Show image. 显示图像 while(True): lcd.display(sensor.snapshot()) 函数 --------- .. function:: lcd.init([type=lcd.LCD_SHIELD, [width=128, [height=160, [framesize=lcd.FWVGA, [refresh=60, [triple_buffer=False, [bgr=False]]]]]]]) 初始化附加的lcd扩展板。 ``type`` 表示应该如何初始化 lcd 模块: * `lcd.LCD_NONE`:什么都不做。 * `lcd.LCD_SHIELD`: 初始化一个 SPI LCD 显示器。 使用引脚 P0、P2、P3、P6、P7 和 P8。 * `lcd.LCD_DISPLAY`:初始化驱动高分辨率显示器的 LCD 模块。 * `lcd.LCD DISPLAY WITH HDMI`:初始化驱动高分辨率显示器和 HDMI 输出。 * `lcd.LCD_DISPLAY_ONLY_HDMI`:初始化仅驱动HDMI输出。 ``width`` 是 `lcd.LCD_SHIELD` 模式下的 SPI LCD 的宽度。 默认情况下,这是 128 以匹配 OpenMV 128x160 LCD液晶显示屏。 ``height`` 是 `lcd.LCD_SHIELD` 模式下的 SPI LCD 的高度。 默认情况下,这是 160 以匹配 OpenMV 128x160 LCD液晶显示屏。 ``framesize`` LCD_DISPLAY* 模式中支持的标准分辨率之一。 ``refresh`` 以赫兹为单位设置 LCD 刷新率。特别是,它控制 SPI LCD 扩展板时钟和高分辨率显示时钟。 如果您在驱动外部显示器时遇到带宽问题,您可以降低此值以降低内存带宽要求。 或者,如果所有系统组件都允许更快的屏幕更新,您可以提高此值。 ``triple_buffer`` 如果为 True,则在 `lcd.LCD_SHIELD` 模式下以 3 倍的显示 RAM 为代价对屏幕进行非阻塞更新。 在 LCD_DISPLAY* 模式下,triple_buffer 始终打开。 ``bgr`` 在 `lcd.LCD_SHIELD` 中设置为 True 以交换红色和蓝色通道。 .. function:: lcd.deinit() 取消初始化 lcd 模块、内部/外部硬件和 I/O 引脚。 .. function:: lcd.width() 返回在 `lcd.init()` 期间设置的屏幕宽度。 .. function:: lcd.height() 返回在 `lcd.init()` 期间设置的屏幕高度。 .. function:: lcd.type() 返回在 `lcd.init()` 期间设置的屏幕类型。 .. function:: lcd.triple_buffer() 返回是否启用了在 `lcd.init()` 期间设置的三重缓冲。 .. function:: lcd.bgr() 返回在 `lcd.init()` 期间设置的红色和蓝色通道是否交换。 .. function:: lcd.framesize() 返回在 `lcd.init()` 期间设置的帧大小。 .. function:: lcd.refresh() 返回在 `lcd.init()` 期间设置的刷新率。 .. function:: lcd.set_backlight(value) 设置 lcd 背光调光值。 0(关)到 255(开)。 在 ``lcd.LCD_SHIELD`` 模式下,它控制 P5 上的 DAC 以提供调光值。 如果设置为0 P5被拉低,如果设置为255 P5未初始化,假设 SPI LCD 扩展板的背光在默认情况下始终打开。 在 LCD_DISPLAY* 模式下,它控制标准背光调光电路的 PWM 信号。 .. function:: lcd.get_backlight() 返回 lcd 背光调光值。 .. function:: lcd.get_display_connected() 在 LCD_DISPLAY_*_HDMI 模式下,如果连接了外部显示器,则返回。 这个函数可以在 `lcd.init()` 之前调用,这样你就可以控制你如何初始化这个模块。 .. function:: lcd.register_hotplug_cb(callback) 在 LCD_DISPLAY_*_HDMI 模式下,注册一个 ``callback`` 函数,每当连接的外部显示器的状态发生变化时都会调用该函数。新状态将作为参数传递。 如果您使用此方法,请不要再调用 `lcd.get_display_connected()` ,直到通过传递 ``None`` 作为此方法的回调来禁用回调。 .. function:: lcd.get_display_id_data() 在 LCD_DISPLAY_*_HDMI 模式下,此函数将外部显示器 EDID 数据作为 bytes() 对象返回。 验证 EDID 标头、校验和并将所有部分连接成一个 bytes() 对象已为您完成。 然后,您可以通过 `遵循本指南`__来解析此信息。 这个函数可以在 `lcd.init()` 之前调用,这样你就可以控制你如何初始化这个模块。 .. function:: lcd.send_frame(dst_addr, src_addr, bytes) 在 LCD_DISPLAY_*_HDMI 模式下,此函数在 HDMI-CEC 总线上向 ``dst_addr`` 发送一个数据包,其中包含源 ``src_addr`` 和数据 ``bytes``。 .. function:: lcd.receive_frame(dst_addr, timeout=1000) 在 LCD_DISPLAY_*_HDMI 模式下,此函数等待 ``timeout`` 毫秒以接收地址 ``dst_addr`` 的 HDMI-CEC 帧。 如果接收到的帧是针对 ``dst_addr`` 的,则返回 True,否则返回 False。超时时会抛出 `OSError` 异常。 .. function:: lcd.register_receive_cb(callback, dst_addr) 在 LCD_DISPLAY_*_HDMI 模式下注册一个 ``callback`` ,它将在接收到 HDMI-CEC 帧时调用。 如果 HDMI-CEC 帧是用于 ``dst_addr`` 的,回调将接收一个 True 或 False 参数。 如果您使用此方法,请不要再调用 `lcd.receive_frame()` ,直到通过传递 ``None`` 作为此方法的回调来禁用回调。 .. function:: lcd.received_frame_src_addr() 在 LCD_DISPLAY_*_HDMI 模式下,如果 `lcd.receive_frame()` 或 `lcd.register_receive_cb()` 中的回调返回 True, 则返回接收到的 HDMI-CEC 帧源地址。当为 HDMI-CEC 总线启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.received_frame_bytes() 在 LCD_DISPLAY_*_HDMI 模式下,如果 `lcd.receive_frame()` 或 `lcd.register_receive_cb()` 中的回调返回 True, 则将接收到的 HDMI-CEC 帧数据负载作为字节对象返回。当为 HDMI-CEC 总线启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.update_touch_points() 在 LCD_DISPLAY* 模式下,此函数读取触摸屏状态并返回触摸点数 (0-5)。 .. function:: lcd.register_touch_cb(callback) 在 LCD_DISPLAY* 模式下,此函数注册一个回调,该回调将在发生触摸事件时接收触摸点数 (0-5)。 如果您使用此方法,请不要再调用 `lcd.update_touch_points()` ,直到通过传递 ``None`` 作为此方法的回调来禁用回调。 .. function:: lcd.get_gesture() 在 LCD_DISPLAY* 模式下,这将返回当前的触摸手势。 这是 LCD_GESTURE_* 之一。 当为触摸屏启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.get_points() 在 LCD_DISPLAY* 模式下,这将返回当前的触摸点数 (0-5)。 当为触摸屏启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.get_point_flag(index) 在 LCD_DISPLAY* 模式下,这将返回 ``index`` 处点的当前触摸点状态。 这是 LCD_FLAG_* 之一。 当为触摸屏启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.get_point_id(index) 在 LCD_DISPLAY* 模式下,它返回 ``index`` 点的当前触摸点 ``id``。 接触点 ``id`` 是一个数值,允许您跟踪接触点,因为它可能会在添加和删除点时返回的接触点列表中移动。 当为触摸屏启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.get_point_x_position(index) 在 LCD_DISPLAY* 模式下,这将返回 ``index`` 点的当前触摸点 x 位置。 这是屏幕上触摸点的 x 像素位置。 当为触摸屏启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.get_point_y_position(index) 在 LCD_DISPLAY* 模式下,这将返回 ``index`` 点的当前触摸点 y 位置。 这是屏幕上触摸点的 y 像素位置。 当为触摸屏启用回调时,不应再调用此方法,除非在回调内部。 .. function:: lcd.display(image, [x=0, [y=0, [x_scale=1.0, [y_scale=1.0, [roi=None, [rgb_channel=-1, [alpha=256, [color_palette=None, [alpha_palette=None, [hint=0, [x_size=None, [y_size=None]]]]]]]]]]]]) 显示一个 ``image`` ,其左上角从位置 x, y 开始。您可以单独传递 x, y ,作为元组 (x, y) 或两者都不传递。 ``x_scale`` 控制显示图像在 x 方向(浮点数)的缩放比例。如果此值为负,则图像将水平翻转。 ``y_scale`` 控制显示图像在 y 方向(浮点数)的缩放比例。如果此值为负,则图像将垂直翻转。 ``roi`` 是要显示的图像的感兴趣区域矩形元组 (x, y, w, h)。这允许您仅提取 ROI 中的像素以进行缩放。 ``rgb_channel`` 是从 RGB565 图像(如果传递)中提取并在显示器上呈现的 RGB 通道(0=R、G=1、B=2)。 例如,如果您传递 ``rgb_channel=1`` 这将提取 RGB565 图像的绿色通道并以灰度显示。 ``alpha`` 控制图像的不透明程度。值 256 显示不透明图像,而小于 256 的值生成黑色透明图像。 0 生成完美的黑色图像。 ``color_palette`` 如果不是 ``-1`` 可以是 `sensor.PALETTE_RAINBOW`、`sensor.PALETTE_IRONBOW`, 或总共 256 像素的 RGB565 图像,用作任何输入灰度值的颜色查找表图像。如果使用,这将在 ``rgb_channel`` 提取之后应用。 ``alpha_palette`` 如果不是 ``-1`` 可以是总共 256 像素的 GRAYSCALE 图像,用作 alpha 调色板, 它调制以像素像素级别显示的输入图像的 ``alpha`` 值,允许您根据像素的灰度值精确控制像素的 alpha 值。 alpha 查找表中的 255 像素值是不透明的,任何小于 255 的像素值都会变得更透明,直到 0。 如果使用,则在 ``rgb_channel`` 提取之后应用。 ``hint`` 可以是标志的逻辑 OR: * `image.AREA`:与最近邻的默认值相比,在缩小时使用区域缩放。 * `image.BILINEAR`:使用双线性缩放而不是最近邻缩放的默认值。 * `image.BICUBIC`:使用双三次缩放与最近邻缩放的默认值。 * `image.CENTER`:将显示在 (x, y) 上的图像居中。 * `image.EXTRACT_RGB_CHANNEL_FIRST`:缩放前进行 rgb_channel 提取。 * `image.APPLY_COLOR_PALETTE_FIRST`:缩放前应用调色板。 如果没有传递 ``x_scale`` 来指定要显示的图像的大小,则可以传递 ``x_size`` 并且 ``x_scale`` 将自动确定传递的输入图像大小。 如果 ``y_scale`` 或 ``y_size`` 都没有指定,那么 ``y_scale`` 内部将设置为等于 ``x_size`` 以保持纵横比。 如果没有传递 ``y_scale`` 以指定要显示的图像的大小,则可以传递 ``y_size`` 并且 ``y_scale`` 将自动确定传递的输入图像大小。 如果 ``x_scale`` 或 ``x_size`` 都没有指定,那么 ``x_scale`` 内部将设置为等于 ``y_size`` 以保持纵横比。 不支持压缩图像。 .. function:: lcd.clear([display_off=False]) 将液晶屏清空为黑色。 ``display_off`` 如果为 True 则关闭显示逻辑而不是将帧 LCD 帧缓冲区清除为黑色。 您还应该在此之后关闭背光以确保屏幕变黑,因为当只有背光打开时,许多显示器都是白色的。 常数 --------- .. data:: lcd.LCD_NONE 当此模块未初始化时由 `lcd.type()` 返回。 .. data:: lcd.LCD_SHIELD 用于初始化 SPI LCD 驱动模式下的 LCD 模块。 .. data:: lcd.LCD_DISPLAY 用于初始化驱动高分辨率显示器的 LCD 模块。 .. data:: lcd.LCD_DISPLAY_WITH_HDMI 用于初始化驱动高分辨率显示器的 LCD 模块,带有二级镜像 HDMI 输出。 .. data:: lcd.LCD_DISPLAY_ONLY_HDMI 用于初始化驱动 HDMI 输出的 LCD 模块。 .. data:: lcd.QVGA LCD_DISPLAY* 模式的分辨率为 320x240。 .. data:: lcd.TQVGA LCD_DISPLAY* 模式的分辨率为 240x320。 .. data:: lcd.FHVGA LCD_DISPLAY* 模式的分辨率为 480x272。 .. data:: lcd.FHVGA2 LCD_DISPLAY* 模式的分辨率为 480x128。 .. data:: lcd.VGA LCD_DISPLAY* 模式的分辨率为 640x480。 .. data:: lcd.THVGA LCD_DISPLAY* 模式的分辨率为 320x480。 .. data:: lcd.FWVGA LCD_DISPLAY* 模式的分辨率为 800x480。 .. data:: lcd.FWVGA2 LCD_DISPLAY* 模式的分辨率为 800x320。 .. data:: lcd.TFWVGA LCD_DISPLAY* 模式的分辨率为 480x800。 .. data:: lcd.TFWVGA2 LCD_DISPLAY* 模式的分辨率为 480x480。 .. data:: lcd.SVGA LCD_DISPLAY* 模式的分辨率为 800x600。 .. data:: lcd.WSVGA LCD_DISPLAY* 模式的分辨率为 1024x600。 .. data:: lcd.XGA LCD_DISPLAY* 模式的分辨率为 1024x768。 .. data:: lcd.SXGA \ LCD_DISPLAY* 模式的分辨率为 1280x1024。 .. data:: lcd.SXGA2 LCD_DISPLAY* 模式的分辨率为 1280x400。 .. data:: lcd.UXGA LCD_DISPLAY* 模式的分辨率为 1600x1200。 .. data:: lcd.HD LCD_DISPLAY* 模式的分辨率为 1280x720。 .. data:: lcd.FHD LCD_DISPLAY* 模式的分辨率为 1920x1080。 .. note:: 使用此设置在 `lcd.init()` 中使用 30 Hz 的 `refresh`。 STM32H7 无法在 60 Hz 下驱动 1080p。 .. data:: lcd.LCD_GESTURE_MOVE_UP 触摸屏向上移动手势。 .. data:: lcd.LCD_GESTURE_MOVE_LEFT 触摸屏向左移动手势。 .. data:: lcd.LCD_GESTURE_MOVE_DOWN 触摸屏向下移动手势。 .. data:: lcd.LCD_GESTURE_MOVE_RIGHT 触摸屏向右移动手势。 .. data:: lcd.LCD_GESTURE_ZOOM_IN 触摸屏放大手势。 .. data:: lcd.LCD_GESTURE_ZOOM_OUT 触摸屏缩小手势。 .. data:: lcd.LCD_GESTURE_NONE 触摸屏没有手势。 .. data:: lcd.LCD_FLAG_PRESSED 触摸点被按下。 .. data:: lcd.LCD_FLAG_RELEASED 触点被释放。 .. data:: lcd.LCD_FLAG_MOVED 触摸点被移动。