F103ZET6使用FSMC和HAL点亮ILI9341

news2024/11/17 15:34:53

前言

将标准库下的ILI9341驱动移植到使用CubeMX生成的HAL库环境,并成功运行。

一、STM32CubeMX生成框架

(一)配置RCC、SYS和时钟树

参见常规配置。

(二)配置FSMC

1、原理图引脚定义

 LCD8080接口使用的引脚主要分为3类:

(一)对应关系由STM32内部硬件原理定义,参见STM32F103xE 数据手册 表5 引脚定义
  PD14   ------> FSMC_D0
  PD15   ------> FSMC_D1
  PD0    ------> FSMC_D2
  PD1    ------> FSMC_D3
  PE7    ------> FSMC_D4
  PE8    ------> FSMC_D5
  PE9    ------> FSMC_D6
  PE10   ------> FSMC_D7
  PE11   ------> FSMC_D8
  PE12   ------> FSMC_D9
  PE13   ------> FSMC_D10
  PE14   ------> FSMC_D11
  PE15   ------> FSMC_D12
  PD8    ------> FSMC_D13
  PD9    ------> FSMC_D14
  PD10   ------> FSMC_D15
(二)
  PE2    ------> FSMC_A23 地址输入(重要DC)(不同板子可能不同)
  PD4    ------> FSMC_NOE RD读使能
  PD5    ------> FSMC_NWE WR写使能
  PG12   ------> FSMC_NE4 片选(重要)(不同板子可能不同)
(三)
  PG11   ------> LCD_RST 复位
  PG6    ------> LCD_BK  背光

1)16个数据引脚;由《STM32F103xCDE_数据手册》中的引脚定义决定;

2)4个FSMC功能引脚:片选(CS/NE)、数据/命令选择(RS或D/CX)、读使能(RD/NOW),写使能(WR/NWE)

3)2个LCD功能引脚:背光控制引脚(LCD_BL),复位引脚(RESET)

根据原理图选择NE4(PG12),后续FSMC_NORSRAM_BANK4

	#define 		ILI9341_CMD_ADDR  		(__IO uint16_t*)(0x6c000000)
	#define 		ILI9341_DATA_ADDR  		(__IO uint16_t*)(0x6d000000)

根据原理图选择地址线选择A23(PE2)。

2、CubeMX配置

 注:本处可能只用到address setup time 和 data setup time ,一般采用十六进制设置为0x01和0x04或0x02和0x05。

3、控制液晶屏时使用的地址(重要)

计算地址的过程如下:
(1) 由于 本工程的硬件设计中使用的是 FSMC_NE4 作为 8080_CS 片选信号【见原理图】
所以首先可以确认地址范围,当访 问 0X6C00 0000 ~ 0X6FFF FFFF 地址时, FSMC 均会对外产生片选有效的访问时序;

 

(2) 本工程中使用 FSMC_A23 地址线作为命令 / 数据选择线 RS 信号【见原理图】
所以在以上地址范围内, 再选择出使得 FSMC_A23 输出高电平的地址,即可控制表示数据,选择出使得 FSMC_A23 输出低电平的地址,即可控制表示命令
要使 FSMC_A23 地址线为高电平,实质是 输出地址信号的第 23 位为 1 即可 ,使用 0X6C00
0000~0X6FFF FFFF 内的任意地址,作如下运算:
设置地址的第 23 位为 1 0X6C00 0000 |= (1«23) = 0x6C80 0000
要使 FSMC_A23 地址线为低电平,实质是 输出地址信号的第 23 位为 0 即可 ,使用 0X6C00
0000~0X6FFF FFFF 内的任意地址,作如下运算:
设置地址的第 23 位为 0 0X6C00 0000 &= ~ (1«23) = 0x6C00 0000
(3) 但是,以上方法计算的地址还不完全正确,根据《 STM32 参考手册》对 FSMC 访问 NOR
FLASH 的说明,见下图 STM32 内部访问地址时使用的是内部 HADDR 总线,它是
要转换到外部存储器的内部 AHB 地址线,它是字节地址 (8 ) ,而存储器访问不都是按字
节访问,因此接到存储器的地址线依存储器的数据宽度有所不同。

注:上图来源于《STM32 参考手册》中对 HADDR FSMC 地址线的说明

在本工程中使用的是 16 位的数据访问方式,所以 HADDR FSMC_A 的地址线连接
关系会左移一位,如 HADDR1 FSMC_A0 对应、HADDR2 FSMC_A1 对应。
因 此,当 FSMC_A0 地址线为 1 时,实际上内部地址的第 1 位为 1 FSMC_A1 地址线为
1 时,实际上内部地址的第 2 位为 1 。同样地,当希望 FSMC_A23 地址输出高电平或
低电平时,需要重新调整计算公式
要使 FSMC_A23 地址线为高电平,实质是访问内部 HADDR 地址的第 (23+1) 位为 1 即可,
使用 0X6C00 0000~0X6FFF FFFF 内的任意地址,作如下运算:
使 FSMC_A23 地址线为高电平:0X6C00 0000 |= (1«(23+1)) = 0x6D00 0000
要使 FSMC_A23 地址线为低电平,实质是访问内部 HADDR 地址的第 (23+1) 位为 0 即可,
使用 0X6C00 0000~0X6FFF FFFF 内的任意地址,作如下运算:
使 FSMC_A23 地址线为低电平:0X6C00 0000 &= ~ (1«(23+1)) = 0x6C00 0000
根据最终的计算结果,总结如下:
STM32 访问内部的 0x6D00 0000 地址时, FSMC 自动输出 时序,且使得与液晶屏的数据/ 命令选择线 RS( D/CX) 相连的 FSMC_A23 输出高电平,使得液 晶屏会把传输过程理解为数据传输;类似地,当 STM32 访问内部的 0X6C00 0000 地址时, FSMC 自动输出时序,且使得与液晶屏的数据/ 命令选择线 RS( D/CX) 相连的 FSMC_A23 输出低电平, 使得液晶屏会把传输过程理解为命令传输,因此定义如下:
	#define 		ILI9341_CMD_ADDR  		(__IO uint16_t*)(0x6c000000)
	#define 		ILI9341_DATA_ADDR  		(__IO uint16_t*)(0x6d000000)

(三)配置相关GPIO和UART

PG11为LCD复位,PG6为LCD背光控制,因此必须配置;

PB0、1、5为 板子的LED,不同板子可能不同,根据实际配置。

使能UART1,即PA9(TX)和PA10(RX),用于串口打印调试。

 最后在Project&Configuration中生成代码。

二、修改相关代码

(一)FSMC部分

其中fsmc.c文件中的执行顺序:

HAL_FSMC_MspInit==>HAL_SRAM_MspInit==>MX_FSMC_Init ==>HAL_SRAM_Init

1)HAL_FSMC_MspInit()

完成FSMC时钟使能,FSMC直接使用到的GPIO配置和初始化

static void HAL_FSMC_MspInit(void){
  /* USER CODE BEGIN FSMC_MspInit 0 */

  /* USER CODE END FSMC_MspInit 0 */
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if (FSMC_Initialized) {
    return;
  }
  FSMC_Initialized = 1;

  /* Peripheral clock enable */
  __HAL_RCC_FSMC_CLK_ENABLE();

  /** FSMC GPIO Configuration
  PE2   ------> FSMC_A23
  PE7   ------> FSMC_D4
  PE8   ------> FSMC_D5
  PE9   ------> FSMC_D6
  PE10   ------> FSMC_D7
  PE11   ------> FSMC_D8
  PE12   ------> FSMC_D9
  PE13   ------> FSMC_D10
  PE14   ------> FSMC_D11
  PE15   ------> FSMC_D12
  PD8   ------> FSMC_D13
  PD9   ------> FSMC_D14
  PD10   ------> FSMC_D15
  PD14   ------> FSMC_D0
  PD15   ------> FSMC_D1
  PD0   ------> FSMC_D2
  PD1   ------> FSMC_D3
  PD4   ------> FSMC_NOE
  PD5   ------> FSMC_NWE
  PG12   ------> FSMC_NE4
  */
  /* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9
                          |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13
                          |GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
                          |GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /* USER CODE BEGIN FSMC_MspInit 1 */
printf("\n================HAL_FSMC_MspInit is OK=================\n");
  /* USER CODE END FSMC_MspInit 1 */
}

2)MX_FSMC_Init()

完成FSMC功能配置和时序结构体配置

void MX_FSMC_Init(void)
{
  /* USER CODE BEGIN FSMC_Init 0 */

  /* USER CODE END FSMC_Init 0 */

  FSMC_NORSRAM_TimingTypeDef Timing = {0};

  /* USER CODE BEGIN FSMC_Init 1 */

  /* USER CODE END FSMC_Init 1 */

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FSMC_NORSRAM_DEVICE;
  hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FSMC_NORSRAM_BANK4;
  hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;//FSMC_MEMORY_TYPE_NOR //FSMC_MEMORY_TYPE_SRAM
  hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  //hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
  /* Timing */
  Timing.AddressSetupTime = 0x01;
  Timing.AddressHoldTime = 0x00;
  Timing.DataSetupTime = 0x04;//0x08
  Timing.BusTurnAroundDuration = 0x0;
  Timing.CLKDivision = 0x0;
  Timing.DataLatency = 0x0;
  Timing.AccessMode = FSMC_ACCESS_MODE_A;//FSMC_ACCESS_MODE_B // FSMC_ACCESS_MODE_A
  /* ExtTiming */

  if (HAL_SRAM_Init(&hsram1, &Timing, &Timing) == HAL_OK)
  {
    printf("\n================MX_FSMC_Init is OK=================\n");
		//Error_Handler( );
  }
	else
		Error_Handler( );

  /** Disconnect NADV
  */

  __HAL_AFIO_FSMCNADV_DISCONNECTED();

  /* USER CODE BEGIN FSMC_Init 2 */

  /* USER CODE END FSMC_Init 2 */
}

(二)UART部分

串口重定向

int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口DEBUG_USART */
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}

(三)ILI9341初始化

1、CMD/ADDR定义和读写函数封装

注:CMD和DATA地址计算见上。

	#define 		ILI9341_CMD_ADDR  		(__IO uint16_t*)(0x6c000000)
	#define 		ILI9341_DATA_ADDR  		(__IO uint16_t*)(0x6d000000)
__inline void ILI9341_Write_Cmd ( uint16_t usCmd )
{
	 *ILI9341_CMD_ADDR = usCmd;	
//	* ( __IO uint16_t * ) ( ILI9341_CMD_ADDR ) = usCmd;
}


/**
  * @brief  向ILI9341写入数据
  * @param  usData :要写入的数据
  * @retval 无
  */	
__inline void ILI9341_Write_Data ( uint16_t usData )
{
	* ILI9341_DATA_ADDR = usData;
//	* ( __IO uint16_t * ) ( ILI9341_DATA_ADDR ) = usData;
	
}


/**
  * @brief  从ILI9341读取数据
  * @param  无
  * @retval 读取到的数据
  */	
 uint16_t ILI9341_Read_Data ( void )
{
	return ( *ILI9341_DATA_ADDR );
//	return ( * ( __IO uint16_t * ) ( ILI9341_DATA_ADDR ) );
	
}

2、ILI9341初始化

void ILI9341_Init(void)
{
	//ILI9341_GPIO_Config();
	//ILI9341_FSMC_Config();
	
	ILI9341_BackLed_Control(ENABLE);
	ILI9341_Rst();
	ILI9341_REG_Config();
	
	ILI9341_GramScan(LCD_SCAN_MODE);
	printf("\n================ILI9341_Init is OK=================\n");
}

三、GUI绘制

(一)编写液晶屏的绘制像素点函数

/**
* @brief 在 ILI9341 显示器上以某一颜色填充像素点
* @param ulAmout_Point :要填充颜色的像素点的总数目
* @param usColor :颜色
* @retval 无
*/
static __inline void ILI9341_FillColor ( uint32_t ulAmout_Point, uint16_t usColor )
{
uint32_t i = 0;
/* memory write */
ILI9341_Write_Cmd ( CMD_SetPixel );
for ( i = 0; i < ulAmout_Point; i ++ )
ILI9341_Write_Data ( usColor );
}


static uint16_t CurrentTextColor = BLACK;//前景色
static uint16_t CurrentBackColor = WHITE;//背景色
/**
* @brief 设定 ILI9341 的光标坐标
* @param usX :在特定扫描方向下光标的 X 坐标
* @param usY :在特定扫描方向下光标的 Y 坐标
* @retval 无
*/
static void ILI9341_SetCursor ( uint16_t usX, uint16_t usY )
{
ILI9341_OpenWindow ( usX, usY, 1, 1 );
}


/**
* @brief 对 ILI9341 显示器的某一点以某种颜色进行填充
* @param usX :在特定扫描方向下该点的 X 坐标
* @param usY :在特定扫描方向下该点的 Y 坐标
* @note 可使用 LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors 函数设置颜色
* @retval 无
*/
void ILI9341_SetPointPixel ( uint16_t usX, uint16_t usY )
{
if ( ( usX < LCD_X_LENGTH ) && ( usY < LCD_Y_LENGTH ) ) {
ILI9341_SetCursor ( usX, usY );
ILI9341_FillColor ( 1, CurrentTextColor );
}
}

(二)利用描点函数制作各种不同的液晶显示应用

/**
* @brief 在 ILI9341 显示器上画一个矩形
* @param usX_Start :在特定扫描方向下矩形的起始点 X 坐标
* @param usY_Start :在特定扫描方向下矩形的起始点 Y 坐标
* @param usWidth:矩形的宽度(单位:像素)
* @param usHeight:矩形的高度(单位:像素)
* @param ucFilled :选择是否填充该矩形
* 该参数为以下值之一:
* @arg 0 : 空心矩形
* @arg 1 : 实心矩形
* @note 可使用 LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors 函数设置颜色
* @retval 无
*/
void ILI9341_DrawRectangle ( uint16_t usX_Start, uint16_t usY_Start,
uint16_t usWidth, uint16_t usHeight, uint8_t ucFilled )
{
    if ( ucFilled ) 
    {
        ILI9341_OpenWindow ( usX_Start, usY_Start, usWidth, usHeight );
        ILI9341_FillColor ( usWidth * usHeight ,CurrentTextColor);
    } 
    else 
    {
        ILI9341_DrawLine ( usX_Start, usY_Start,
        usX_Start + usWidth - 1, usY_Start );
        ILI9341_DrawLine ( usX_Start, usY_Start + usHeight - 1,
        usX_Start + usWidth - 1, usY_Start + usHeight - 1 );
        ILI9341_DrawLine ( usX_Start, usY_Start, usX_Start,
        usY_Start + usHeight - 1 );
        ILI9341_DrawLine ( usX_Start + usWidth - 1, usY_Start,
        usX_Start + usWidth - 1, usY_Start + usHeight - 1 );
    }
}

后续如设置扫描方向,LCD初始化,main函数等可参考相关资料,在此不再赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/546621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】线性表 ⑤ ( 双循环链表 | 双循环链表特点 | 双循环链表插入操作处理 | 代码示例 - 使用 Java 实现 双循环链表 )

文章目录 一、双循环链表二、双循环链表特点三、双循环链表插入操作处理四、代码示例 - 使用 Java 实现 双循环链表 一、双循环链表 " 双循环链表 " 是 在 单循环链表 的基础上 , 在每个 节点 中 , 新增一个 指针 , 指向 该节点 的 前驱节点 ; 双向循环链表 每个 节…

头歌计算机组成原理实验—运算器设计(8)第8关:乘法流水线设计

第8关&#xff1a;乘法流水线设计 实验目的 学生掌握运算流水线基本概念&#xff0c;理解将复杂运算步骤细分成子过程的思想&#xff0c;能够实现简单的乘法运算流水线。 视频讲解 实验内容 在 Logisim 中打开 alu.circ 文件&#xff0c;在6位补码阵列乘法器中利用5位阵列乘…

React学习笔记三-模块与组件的理解

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第三篇&#xff0c;主要介绍react中的模块与组件。 目录 1.模块与组件 1.1模块 1.2组件 1.3模块化 1.4组件化 2.React面向组件编程 2.1函数式组件 2.2类组件 2.2.1类知识的复…

防火墙(一)

防火墙知识 一、iptables概述二、四表五链四表五链iptables防火墙的使用方法 三、示例操作四、规则的匹配通用匹配&#xff1a;隐含匹配&#xff1a;端口匹配&#xff1a; --sport源端口、--dport目的端口TCP标志位匹配&#xff1a;ICMP类型匹配&#xff1a;显示匹配&#xff1…

Windows 安装MySQL 8.0 超详细教程(mysql 8.0.30)

目录 一、删除以前安装的MySQL服务 1、查找以前是否装有mysql 2、删除mysql &#xff08;1&#xff09;停止mysql服务&#xff1a; &#xff08;2&#xff09;删除mysql服务&#xff1a; 3.检查mysql是否已删除 二、下载mysql二进制包 三、解压二进制包&#xff0c;编辑…

一图看懂 setuptools 模块:一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 setuptools 模块&#xff1a;一个功能齐全、积极维护且稳定的库&#xff0c;旨在方便打包Python项目&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;…

第一个 Rust 程序

目录 必要知识代码示例 Cargo 教程[Rust 输出到命令行](https://www.runoob.com/rust/rust-println.html)资料 必要知识 Rust 语言代码文件后缀名为 .rs 使用 rustc 命令编译 .rs 文件 rustc runoob.rs # 编译 runoob.rs 文件编译后会生成 可执行文件 例如&#xff1a; …

『python爬虫』26. selenium与超级鹰处理复杂验证码的处理(保姆级图文)

目录 1. 图片选择类验证码2. 滑块验证码3. 滑块出错&#xff0c;不加载总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1. 图片选择类验证码 我们这里查看超级鹰文档 图片验证码返回的是一个 dic 结构为 x1,y1…

【SAM系列】An Alternative to WSSS? An Empirical Study of SAM on WSSS Problems

论文链接&#xff1a;https://arxiv.org/pdf/2305.01586.pdf 论文代码&#xff1a;暂无 目的 WSSS旨在弱标签的情况下&#xff0c;生成高质量的分割伪标签&#xff0c;然后用于全监督的语义分割训练。本文探索用SAM来生成伪标签来替代WSSS方案。 为什么不直接用SAM分割而利用…

《面试1v1》synchronized

源码都背下来了&#xff0c;你给我看这 我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你好&#xff0c;我看到你的简历上写着你熟悉 Java 中的 “synchronized” 关键字。你能给我讲讲它的作…

chatgpt赋能Python-python3反转字符串

Python3反转字符串技巧&#xff1a;让你的代码更高效&#xff01; 你是否曾经在编程时需要对字符串进行反转&#xff0c;但却不知从何入手&#xff1f;Python3提供了简单易用的方法&#xff0c;帮助你更快地反转字符串。本文将介绍Python3中字符串反转的方法以及如何在代码中利…

chatgpt赋能Python-python3如何安装numpy

如何安装numpy&#xff1f; 介绍 在Python编程中&#xff0c;NumPy是使用最广泛的库之一。NumPy是数学和科学计算中的核心模块&#xff0c;主要用于处理数字数据&#xff0c;包括数组计算、线性代数、傅里叶变换、随机数生成等任务。在Python编程中&#xff0c;使用NumPy可以…

chatgpt赋能Python-python3小游戏

Python3小游戏&#xff1a;为你的休闲时光增添乐趣 如果你正处于寻找一款简单好玩的小游戏&#xff0c;那么Python3小游戏将是你的不二之选。作为一名有10年Python编程经验的工程师&#xff0c;我可以说Python3小游戏是一款非常有趣、挑战性适中、易于上手的游戏。接下来&…

工作流 jbpm(图文并茂)

文章目录 1 工作流概述2 jBPM概述3 jBPM开发环境搭建及其配置3.1 准备工作3.2 搭建jBPM开发环境3.3 加入jar包 4 系统数据库表介绍4.1 建表4.2 数据库逻辑关系4.2.1 资源库与运行时的表4.2.2 历史数据表 4.3 表结构4.4 流程操作与数表交互说明 5 相关概念6 流程图说明6.0 快速上…

【学习笔记】Rider调试unity【 联调、断点调试等】(决定弃用vscode了)

目录 一 弃用vscode原委二 Rider调试Unity2.1 启动调试2.2 pausepoint 暂停点2.2.1 使用pausepoint2.2.2 pausepoint&#xfeff;与breakpoint的区别 2.3 不同run configuration区别 三 Rider编辑3.1 补充 四 总结 转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.n…

头歌计算机组成原理实验—运算器设计(4)第4关:16位快速加法器设计

第4关&#xff1a;16位快速加法器设计 实验目的 帮助学生理解成组进位产生函数&#xff0c;成组进位传递函数的概念&#xff0c;熟悉 Logisim 平台子电路的概念&#xff0c;能利用前述实验封装好的4位先行进位子电路以及4位快速加法器子电路构建16位、32位、64位快速加法器&a…

Android 12.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(一)

1.前言 在12.0的系统rom定制化开发中,在原生系统SystemUI下拉状态栏的通知栏的背景是白色四角的背景,由于在产品设计中,需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景,然后通过systemui的通知流程,设置默认下拉状态栏UI中的通知…

java+nodejs+vue+python+php家教信息管理系统

任何网友都可以自由地查看、搜索、发布该家教信息平台的信息。该平台是区别于传统的家教中介的服务平台。学生可以免费查看网站上的家教信息&#xff0c;挑选适合自己的家教&#xff1b;教师可以免费查看网站上的需求信息&#xff0c;挑选适合自己的学生&#xff1b;学生可以发…

chatgpt赋能Python-python3安装scrapy

Python3安装Scrapy&#xff1a;提高爬虫效率的关键 如果你正在从事数据科学、数据分析工作&#xff0c;或者需要收集并存储某些特定网站的数据&#xff0c;Scrapy是一个值得尝试的Python3框架。Scrapy是一个开源的Web爬虫框架&#xff0c;可以方便、高效、快速地对数据进行收集…

Rust每日一练(Leetday0005) 罗马数字、公共前缀、三数之和

目录 13. 罗马数字转整数 Roman to Integer &#x1f31f; 14. 最长公共前缀 Longest Common Prefix &#x1f31f; 15. 三数之和 3Sum &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日…