nRF52笔记(26)QSPI接口液晶显示屏

article/2025/10/25 10:32:13

1 平台条件

硬件:nrf52840
软件:sdk17.0

2 QSPI概述

QSPI 外设支持使用 SPI 与外部闪存设备进行通信

此处列出了 QSPI 外设的主要特性:
• 单/双/四通道 SPI 输入/输出
• 2–32 MHz 可配置时钟频率
• 从/到外部闪存的单字读/写访问
• 用于块读写传输的 EasyDMA
• 高达 16 MB/秒的 EasyDMA 读取速率
• 就地执行 (XIP),用于直接从外部闪存执行程序
在这里插入图片描述
在 Nordic nRF52/nRF53 系列上,QSPI 可以支持两种不同的模式。

Flash / XIP操作(需要遵循flash协议)
发送自定义指令(限制使用QSPI上的1-wire发送数据)。

在指令集上,它支持与外部闪存设备的操作码。

在这里插入图片描述

1.1 用于 LCD 的 QSPI 接口

基本上,QSPI 接口有 6 个 GPIO 引脚。
在这里插入图片描述
使用屏幕: hannstar 360×360 with GalaxyCore Controller resolution for testing.

2 代码设置

2.1 初始化

初始化 QSPI 模块
将所有 6 个 GPIO 引脚配置为高驱动输出。

#define LCD_QSPI_RESET_PIN NRF_GPIO_PIN_MAP(0,27)
#define LCD_QSPI_CSN_PIN   NRF_GPIO_PIN_MAP(0,26)
#define LCD_QSPI_SCK_PIN   NRF_GPIO_PIN_MAP(0,02)
#define LCD_QSPI_IO0_PIN   NRF_GPIO_PIN_MAP(1,15)
#define LCD_QSPI_IO1_PIN   NRF_GPIO_PIN_MAP(1,14)
#define LCD_QSPI_IO2_PIN   NRF_GPIO_PIN_MAP(1,13)
#define LCD_QSPI_IO3_PIN   NRF_GPIO_PIN_MAP(1,12)static void config_qspi_pin_high_drive(void)
{nrf_gpio_cfg(LCD_QSPI_SCK_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_SENSE_HIGH);nrf_gpio_cfg(LCD_QSPI_CSN_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_NOPULL,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO0_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO1_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO2_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO3_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);
}

LCD demo 320×240 @ nRF52840 之后,我想描述如何使用 QSPI 接口驱动更大的 LCD 显示器,例如 360 x 360 分辨率 @ nRF52840。

QSPI 四路串行外设接口
QSPI 外设支持使用 SPI 与外部闪存设备进行通信。

此处列出了 QSPI 外设的主要特性:
• 单/双/四通道 SPI 输入/输出
• 2–32 MHz 可配置时钟频率
• 从/到外部闪存的单字读/写访问
• 用于块读写传输的 EasyDMA
• 高达 16 MB/秒的 EasyDMA 读取速率
• 就地执行 (XIP),用于直接从外部闪存执行程序

在 Nordic nRF52/nRF53 系列上,QSPI 可以支持两种不同的模式。

Flash / XIP操作(需要遵循flash协议)
发送自定义指令(限制使用QSPI上的1-wire发送数据)。
在指令集上,它支持与外部闪存设备的操作码。

用于 LCD 的 QSPI 接口
基本上,QSPI 接口有 6 个 GPIO 引脚。

在这篇博客中,我将使用显示器制造商的瀚宇360×360 和GalaxyCore Controller 分辨率进行测试。

初始化 QSPI 模块
将所有 6 个 GPIO 引脚配置为高驱动输出。

#define LCD_QSPI_RESET_PIN NRF_GPIO_PIN_MAP(0,27)
#define LCD_QSPI_CSN_PIN   NRF_GPIO_PIN_MAP(0,26)
#define LCD_QSPI_SCK_PIN   NRF_GPIO_PIN_MAP(0,02)
#define LCD_QSPI_IO0_PIN   NRF_GPIO_PIN_MAP(1,15)
#define LCD_QSPI_IO1_PIN   NRF_GPIO_PIN_MAP(1,14)
#define LCD_QSPI_IO2_PIN   NRF_GPIO_PIN_MAP(1,13)
#define LCD_QSPI_IO3_PIN   NRF_GPIO_PIN_MAP(1,12)static void config_qspi_pin_high_drive(void)
{nrf_gpio_cfg(LCD_QSPI_SCK_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_SENSE_HIGH);nrf_gpio_cfg(LCD_QSPI_CSN_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_NOPULL,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO0_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO1_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO2_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);nrf_gpio_cfg(LCD_QSPI_IO3_PIN,NRF_GPIO_PIN_DIR_INPUT,NRF_GPIO_PIN_INPUT_DISCONNECT,NRF_GPIO_PIN_PULLDOWN,NRF_GPIO_PIN_H0H1,NRF_GPIO_PIN_NOSENSE);
}

初始化 QSPI 模块并将其配置为 24 位地址/32MHz 时钟。

void qspi_lcd_GC9c01_init(void)
{if (!m_is_qspi_init){uint32_t err_code;nrf_drv_qspi_config_t qspi_lcd_config = NRF_DRV_QSPI_DEFAULT_CONFIG;//config.phy_if.sck_freq  = NRF_QSPI_FREQ_32MDIV1;        //NRF_QSPI_FREQ_32MDIV8; //32MHzqspi_lcd_config.phy_if.sck_freq  = NRF_QSPI_FREQ_32MDIV1;        //NRF_QSPI_FREQ_32MDIV8; //32MHz//qspi_lcd_config.phy_if.sck_freq  = NRF_QSPI_FREQ_32MDIV8;//NRF_QSPI_FREQ_32MDIV8; //8MHzqspi_lcd_config.pins.csn_pin     = LCD_QSPI_CSN_PIN;qspi_lcd_config.pins.sck_pin     = LCD_QSPI_SCK_PIN;qspi_lcd_config.pins.io0_pin     = LCD_QSPI_IO0_PIN;qspi_lcd_config.pins.io1_pin     = LCD_QSPI_IO1_PIN;qspi_lcd_config.pins.io2_pin     = LCD_QSPI_IO2_PIN;qspi_lcd_config.pins.io3_pin     = LCD_QSPI_IO3_PIN;err_code = nrf_drv_qspi_init(&qspi_lcd_config, qspi_lcd_handler, NULL);APP_ERROR_CHECK(err_code);NRF_LOG_INFO("QSPI LCD Init");NRF_QSPI->IFCONFIG0 |= (QSPI_IFCONFIG0_PPSIZE_512Bytes << QSPI_IFCONFIG0_PPSIZE_Pos);m_is_qspi_init = true;}else{NRF_LOG_ERROR("QSPI LCD has already initialized!");APP_ERROR_CHECK(-1);}
}

2.2 读写操作

基本上,LCD 上有 2 个操作。

LCD 命令代码(例如 LCD 初始化代码)。
LCD Data write(将数据写入LCD屏)。

(1)LCD命令模式
在这里插入图片描述
(2)LCD写命令

static uint32_t drv_GC9c01_bus_writeCmd(const uint8_t cmd)
{return send_qspi_cinstr_w0d(cmd);
}
static uint32_t drv_GC9c01_bus_writeCmdByte(const uint8_t cmd, const uint8_t data)
{uint32_t err_code = NRF_SUCCESS;err_code  = send_qspi_cinstr_w1d(cmd, data);return err_code;
}

(3)LCD初始化代码

static void configure_lcd()
{drv_GC9c01_bus_writeCmd(0xfe);drv_GC9c01_bus_writeCmd(0xef);drv_GC9c01_bus_writeCmdByte(0x80, 0x11);drv_GC9c01_bus_writeCmdByte(0x81, 0x70);drv_GC9c01_bus_writeCmdByte(0x82, 0x09);drv_GC9c01_bus_writeCmdByte(0x83, 0x03);drv_GC9c01_bus_writeCmdByte(0x84, 0x20);drv_GC9c01_bus_writeCmdByte(0x85, 0x42);drv_GC9c01_bus_writeCmdByte(0x86, 0xfc);drv_GC9c01_bus_writeCmdByte(0x87, 0x09);drv_GC9c01_bus_writeCmdByte(0x89, 0x10);drv_GC9c01_bus_writeCmdByte(0x8a, 0x4f);drv_GC9c01_bus_writeCmdByte(0x8c, 0x59);drv_GC9c01_bus_writeCmdByte(0x8d, 0x51);drv_GC9c01_bus_writeCmdByte(0x8e, 0xae);drv_GC9c01_bus_writeCmdByte(0x8f, 0xf3);drv_GC9c01_bus_writeCmdByte(0x36, 0x00);drv_GC9c01_bus_writeCmdByte(0x3a, 0x05);drv_GC9c01_bus_writeCmdByte(0xec, 0x77);uint8_t parmater1_buffer[] = {0x01, 0x80, 0x00, 0x00, 0x00, 0x00};send_qspi_cinstr_long_frame_word(0x74, parmater1_buffer, 6);drv_GC9c01_bus_writeCmdByte(0x98, 0x3e);drv_GC9c01_bus_writeCmdByte(0x99, 0x3e);drv_GC9c01_bus_writeCmdByte(0xc3, 0x2A);drv_GC9c01_bus_writeCmdByte(0xc4, 0x18);send_qspi_cinstr_w1d_2data(0xa1,0x01,0x04);send_qspi_cinstr_w1d_2data(0xa2,0x01,0x04);drv_GC9c01_bus_writeCmdByte(0xa9, 0x1c);send_qspi_cinstr_w1d_2data(0xa5,0x11,0x09);drv_GC9c01_bus_writeCmdByte(0xb9, 0x8a);drv_GC9c01_bus_writeCmdByte(0xa8, 0x5e);drv_GC9c01_bus_writeCmdByte(0xa7, 0x40);drv_GC9c01_bus_writeCmdByte(0xaf, 0x73);drv_GC9c01_bus_writeCmdByte(0xae, 0x44);drv_GC9c01_bus_writeCmdByte(0xad, 0x38);drv_GC9c01_bus_writeCmdByte(0xa3, 0x5d);drv_GC9c01_bus_writeCmdByte(0xc2, 0x02);drv_GC9c01_bus_writeCmdByte(0xc5, 0x11);drv_GC9c01_bus_writeCmdByte(0xc6, 0x0e);drv_GC9c01_bus_writeCmdByte(0xc7, 0x13);drv_GC9c01_bus_writeCmdByte(0xc8, 0x0d);drv_GC9c01_bus_writeCmdByte(0xcb, 0x02);send_qspi_cinstr_w1d_2data(0x7c,0xb6,0x26);drv_GC9c01_bus_writeCmdByte(0xac, 0x24);drv_GC9c01_bus_writeCmdByte(0xf6, 0x80);send_qspi_cinstr_w1d_2data(0xb5,0x09,0x09);send_qspi_cinstr_w1d_4data(0x60, 0x38,0x0b,0x5b,0x56);send_qspi_cinstr_w1d_4data(0x63, 0x3a,0xe0,0x5b,0x56);uint8_t parmater2_buffer[] = {0x38, 0x0d, 0x72, 0xdd, 0x5b, 0x56};send_qspi_cinstr_long_frame_word(0x64, parmater2_buffer, 6);uint8_t parmater3_buffer[] = {0x38, 0x11, 0x72, 0xe1, 0x5b, 0x56};send_qspi_cinstr_long_frame_word(0x66, parmater3_buffer, 6);uint8_t parmater4_buffer[] = {0x3b, 0x08, 0x08, 0x00, 0x08, 0x29,0x5b};send_qspi_cinstr_long_frame_word(0x68, parmater4_buffer, 7);uint8_t parmater5_buffer[] = {0x00,0x00,0x00,0x07,0x01,0x13,0x11,0x0b, \0x09,0x16,0x15,0x1d,0x1e,0x00,0x00,0x00, \0x00,0x00,0x00,0x1e,0x1d,0x15,0x16,0x0a, \0x0c,0x12,0x14,0x02,0x08,0x00,0x00,0x00};send_qspi_cinstr_long_frame_word(0x6e, parmater5_buffer, 32);drv_GC9c01_bus_writeCmdByte(0xbe, 0x11);uint8_t parmater6_buffer[] = {0xcc, 0x0c, 0xcc, 0x84, 0xcc, 0x04,0x50};send_qspi_cinstr_long_frame_word(0x6c, parmater6_buffer, 7);drv_GC9c01_bus_writeCmdByte(0x7d, 0x72);drv_GC9c01_bus_writeCmdByte(0x7e, 0x38);uint8_t parmater7_buffer[] = {0x02,0x03,0x09,0x05,0x0c,0x06,0x09,0x05,0x0c,0x06};send_qspi_cinstr_long_frame_word(0x70, parmater7_buffer, 10);send_qspi_cinstr_w1d_4data(0x90, 0x06,0x06,0x05,0x06);send_qspi_cinstr_w1d_3data(0x93, 0x45,0xff,0x00);uint8_t parmater8_buffer[] = {0x45, 0x09, 0x08, 0x08, 0x26, 0x2a};send_qspi_cinstr_long_frame_word(0xf0, parmater8_buffer, 6);uint8_t parmater9_buffer[] = {0x43, 0x70, 0x72, 0x36, 0x37, 0x6f};send_qspi_cinstr_long_frame_word(0xf1, parmater9_buffer, 6);uint8_t parmater10_buffer[] = {0x45, 0x09, 0x08, 0x08, 0x26, 0x2a};send_qspi_cinstr_long_frame_word(0xf2, parmater10_buffer, 6);uint8_t parmater11_buffer[] = {0x43, 0x70, 0x72, 0x36, 0x37, 0x6f};send_qspi_cinstr_long_frame_word(0xf3, parmater11_buffer, 6);drv_GC9c01_bus_writeCmd(0xfe);drv_GC9c01_bus_writeCmd(0xee);// User Command Set (UCS = CMD1)------------------------------------------//       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_WRITE_CMD_MODE_PAGE, 0x00);//tearing effect line on--------------------------------------------------//       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_TEARING_EFFECT_ON, 0x00);// Interface Pixel Format-------------------------------------------------//       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_INTERFACE_PIXEL_FORMAT, 0x55);// 0x55 -> 565// Set_DSPI Mode----------------------------------------------------------//       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_SET_DSPI_MODE, 0x80);// Write display brightness-----------------------------------------------//GC9c01_drv_SetBrightness(0xCC);// Sleep-out and Display on-----------------------------------------------GC9c01_DRV_SLEEP_OUT();nrf_delay_ms(120);GC9c01_DRV_DISPLAY_ON();nrf_delay_ms(20);GC9c01_drv_setColRowPosition(0, 0);NRF_LOG_INFO("After %s", __func__);
}

2.3 写入 LCD 数据

它使用 Opcode = 0x32 PP4O 来写入 LCD 数据。
在这里插入图片描述

static uint32_t gc9c01_bus_lcd_write_buffer(uint8_t *p_tx_buffer, uint32_t len, uint32_t addr)
{uint32_t err_code = 0;m_finished = false;err_code = nrf_drv_qspi_write(p_tx_buffer, len, addr);if(err_code != NRFX_SUCCESS){// NRF_LOG_INFO("error code= 0x%x",err_code);}WAIT_FOR_PERIPH();return err_code;
}static void BMP_picture_show(uint32_t delay, const uint16_t *p_data)
{uint32_t err_code;uint32_t * p_color;uint32_t i,k;uint32_t tran_size,now_size=0;uint32_t remain_size = GC9c01_DRV_ALL_SIZE;//NRF_LOG_INFO("%s block_dx = %d, Color=%04x", __func__, a block_dx, color);//static uint8_t __ALIGN(4) bank_buf[QSPI_PAG_SIZE];tran_size = QSPI_PAG_SIZE;memcpy(&m_buffer_tx[0], (uint8_t *)&p_data[0]+tran_size, tran_size);err_code = gc9c01_bus_lcd_write_buffer(m_buffer_tx, QSPI_PAG_SIZE, 0x002C00);remain_size -= tran_size;now_size=tran_size;while (remain_size){if (remain_size > QSPI_PAG_SIZE){tran_size = QSPI_PAG_SIZE;}else{tran_size = remain_size;}memcpy(m_buffer_tx, (uint8_t *)&p_data[0]+now_size, tran_size);now_size += tran_size;err_code = gc9c01_bus_lcd_write_buffer(&m_buffer_tx[0], tran_size, 0x003C00);remain_size -= tran_size;}nrf_delay_ms(delay);
}

效果展示
在这里插入图片描述


http://chatgpt.dhexx.cn/article/n27nGfjY.shtml

相关文章

MPC5744-LINFlexD

目录 一、基本介绍1.功能2.时钟源3.外设控制器4.中断向量5.基地址 二、寄存器介绍1.LIN控制寄存器1 LINFlexD_LINCR12.LIN中断使能寄存器LINFlexD_LINIER3.LIN状态寄存器LINFlexD_LINSR4.LIN错误状态寄存器LINFlexD_LINESR5.UART控制寄存器LINFlexD_UARTCR6.UART状态寄存器LINF…

MP2456的芯片的学习

本章将讲述MP2456的特征、性能、参数、应用电路、以及使用时的注意事项。小白总结&#xff0c;如有错误&#xff0c;请大神指教。 目录 一、MP2456的特征 二、MP2456的性能和参数 四、MP2456使用时的注意事项 五、名词解释 一、MP2456的特征 &#xff08;1&#xff09;MP…

硬件电路-MP2451组成的电压反转/极性反转电路设计

板上要集成一个18V供电的模拟信号处理电路&#xff0c;包括线圈驱动、小信号拾取、滤波、二级放大等部分。因此&#xff0c;需要板上提供18V电源。正负电压需要分开控制&#xff0c;因为正电压需要兼作485传感器供电&#xff0c;此时关闭负电压部分节省耗电以及保护模拟端。 b…

MP2451的应用电路

电阻R32和电阻R23是怎么实现的电压&#xff0c;FB口的输出是0.8V。 正确的计算应该是&#xff1a; 0.8/10*(1027)这样就是输出的电压。 SS14是大电流二极管&#xff0c;可以用5819完全替代。还有续流二极管。 SS14是40V的耐压&#xff0c;SS12是20V的耐压。 8050可以替代BC8…

MP2451问题记录

数据手册 https://pan.baidu.com/s/1ggJs0y3 MP2451应用电路如下图 在我自己的应用电路中R1120K&#xff0c;R224k 问题一、 电源输出0.42V V(FB)手册中应等于0.8V&#xff0c;但在测试中发现该引脚电压仅为0.07V 0.07 * (12024) / 24 0.42V 判断是芯片损坏 问题二、FB引脚输…

MP2451的BUCK电路

5V的稳压模块经常会用得到&#xff0c;普通的AMS1117-5.0虽然电压输出非常稳定&#xff0c;但是只适合低压降&#xff0c;小电流的场合。笔者曾经用AMS1117-5.0把8.4V稳压到5V,电流160mA&#xff08;8.4V端&#xff09;&#xff0c;芯片一会儿就非常烫手了&#xff0c;即使并联…

MP2451使用注意事项

MP2451使用注意事项 MP2451是一个高速2M的高效的降压芯片&#xff0c;提供0.6A的电流输出&#xff0c;输入电压范围3.3V-36V可调&#xff0c;有关闭芯片引脚&#xff0c;关闭电流3uA&#xff0c;用起来还不错&#xff0c;分享一下经验&#xff0c;如下原理图已经制成了板子&am…

类间关系和内部类和数组

Final关键词 定义Pepole类&#xff0c;运用了final修饰方法eat()&#xff0c;该方法不能被改写&#xff0c;但可以随类进行继承。 用final修饰的类&#xff0c;不能有子类。 内部成员类定义方式 外部类.成员类 对象名 new 外部类&#xff08;&#xff09;.new 内部类。 局部…

UML六种关系图示(过目不忘版)

图中&#xff0c;从左到右分别是依赖、关联、聚合、组合、实现、继承六种关系在UML图中的画法&#xff0c;有箭头&#xff0c;有菱形&#xff0c;有三角&#xff0c;他们为什么这么画呢&#xff0c;之间有什么联系呢&#xff0c;这要从全局来看。 首先&#xff0c;依赖关联关系…

类图有哪些关系?

此刻是最佳时间&#xff0c;抓住当下&#xff01;最近在学习设计模式的时候&#xff0c;时常要用到类图及它们的关联&#xff0c;所以学习了UML类图及类图之间的关系&#xff0c;转载记录一下。 首先我们需要知道什么是类图。 类图&#xff08;ClassDiagram&#xff09;是UML图…

UML中的六种关系

UML关系 1、依赖关系 是一种使用关系&#xff0c;它是对象之间耦合度最弱的一种关联方式&#xff0c;是临时性的关联。 在代码中&#xff0c;某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类&#xff08;被依赖类&#xff09;中的某些方法来完成一…

UML的六大关系

关联关系 单向关联 双向关联 自关联 聚合关系 聚合关系是关联关系的一种&#xff0c;是强关联关系&#xff0c;是整体和部分之间的关系 聚合关系通过成员对象来实现的&#xff0c;其中成员对象是整体对象的一部分&#xff0c;但是成员对象可以脱离整体对象而独立存在。例如&…

部分和问题

题目来源 挑战程序设计竞赛&#xff08;第二版&#xff09; 语言 C/C 题目 部分和问题 描述 给定整数 a1, a2, ..., an&#xff0c;判断是否可以从中选出若干数&#xff0c;使它们的和恰好为 k。 样例1 输入&#xff1a; n 4 a {1, 2, 4, 7}; k 13 输出&#xff1a…

【UML】2.部分与整体的媒介:关系

UML模块中的任何事物都不是独立存在的&#xff0c;他们之间存在着一定的关系。下面就对这些关系&#xff0c;分类了解一下。 一&#xff0e;概念 【关联】Association 两个类存在某种语义上的联系&#xff0c;关联有单向关联和双向关联。 【聚合】Aggregation 类之间是整体…

干货!基于部分-整体关系的概念、关系和物理场景认知推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 人类视觉感知的一个关键方面是能够将视觉场景解析为单个对象并进一步分解为对象部分&#xff0c;形成部分-整体层次结构。这种复合结构可以产生丰富的语义概念和关系&#xff0c;从而在视觉信号的解释和组织以及…

设计模式.组合模式(整体和部分关系, 树和Node,透明组合和完全组合)

抽象角度看 一棵树有很多节点&#xff0c;根据位置可以分为&#xff1a;根节点&#xff0c;中间节点&#xff0c;叶子节点 所有的节点都是树节点 这两句话转换为代码就是&#xff1a; 你可以有三个Node类&#xff0c;RootNode&#xff0c;TempNode&#xff0c;LeafNode。当然…

HINSTANCE (句柄相关)

在win32下与HMODULE是相同的东西&#xff0c;在Win32下还存在主要是因为win16   程序使用HINSTANCE来区别task。   区别&#xff1a;   Handle 是代表系统的内核对象&#xff0c;如文件句柄&#xff0c;线程句柄&#xff0c;进程句柄。   HMODULE 是代表应用程序载入的…

为什么需要传递HINSTANCE给CreateWindow?

Win32中有两个API函数&#xff0c;CreateWindow和RegisterClass。它们有一个HINSTANCE参数&#xff0c;很多人对这个参数不是很理解&#xff0c;今天就来讲一讲。 窗口类的名称还不足以唯一地确定这个窗口类。每一个进程都会拥有它自己的窗口类列表&#xff0c;而在这个列表中…

HINSTANCE数据类型

作者&#xff1a;马 岩&#xff08;Furzoom&#xff09; &#xff08;http://www.cnblogs.com/furzoom/&#xff09;版权声明&#xff1a;本文的版权归作者与博客园共同所有。转载时请在明显地方注明本文的详细链接&#xff0c;未经作者同意请不要删除此段声明&#xff0c;感谢…

【引用】HINSTANCE

在win32下与HMODULE是相同的东西&#xff0c;在Win32下还存在主要是因为win16 程序使用HINSTANCE来区别task。 区别&#xff1a; Handle 是代表系统的内核对象&#xff0c;如文件句柄&#xff0c;线程句柄&#xff0c;进程句柄。 HMODULE 是代表应用程序载入的模块&#xff0c;…