day05(单片机)SPI+数码管

news2024/11/27 22:30:14

目录

SPI+数码管

SPI通信

SPI总线介绍

字节交换原理

时序单元

​​​​​​​SPI模式

模式0

模式1

模式2

模式3

数码管

介绍

74HC595芯片分析

​​​​​​​原理图分析

​​​​​​​cubeMX配置​​​​​​​

程序编写

硬件SPI

​​​​​​​软件SPI

作业:


SPI+数码管

SPI通信

SPI总线介绍

SPI接口是Motorola 首先提出的全双工三线/四线同步串行外围接口采用主从模式(Master Slave)架构。

时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信。

SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间,要求通讯速率较高的场合。

一主多从的同步串行全双工通信

Master 主机 Slave 从机

MISO 主机输入从机输出 MOSI 主机输出从机输入 SS Slave Select(片选线)从机选择

SCK system clock 时钟

所有的输出口在输出的时候要配置成推挽输出,这样在没有外部上拉电阻的情况的也可以有较强的输出高低电平的能力。但需要考虑一点:当主机跟从机3进行通信的时候,从机2和从机1的MISO线如果是推挽输出(推挽必输出高电平或低电平的一种)那肯定会影响主机跟从机三的正常通信,所以为了消去这一影响,让从机SS片选线为高电平,即非选中状态时对应从机输出口置为高阻态,这样既不是高电平也不是低电平不会影响主机跟所选中从机的正常通信。

字节交换原理

字节交换基于位交换的

位交换分为两部分:移出 移入

移出:就是把当前移位寄存器的最高位写到信号线上,然后整体往左移动一位

移入(采样):读取信号线的状态,然后把读到的状态放到寄存器的最低位

移入 主机和从机同时进行

移出 主机和从机同时进行

移入和移出的时机是由时钟线控制约定的,约定好第几个边沿一起移出,第几个边沿一起移入。

​​​​​​​时序单元

•起始条件:SS从高电平切换到低电平

•终止条件:SS从低电平切换到高电平

​​​​​​​SPI模式

由CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,因此通常主机要按照从机支持的模式去设置

CPOL: 时钟极性

CPHA: 时钟相位

模式0

模式1

模式2

模式3

数码管

介绍

LED数码管(LED Segment Displays)是由8个发光二极管构成,并按照一定的图形及排列封装在一起的显示器件。其中7个LED构成7笔字形,1个LED构成小数点(固有时成为八段数码管)。

LED数码管有两大类,一类是共阴极接法,另一类是共阳极接法,共阴极就是7段的显示字码共用一个电源的负极,是高电平点亮,共阳极就是7段的显示字码共用一个电源的正极,是低电平点亮。

我们对数码管所要显示的每个数字和字母进行编码,然后在编程时,将编码放在一个数组上,需要显示什么数字或者字母,从数组里面提取相应的编码就可显示所要显示的字符了。

如图,要显示数字“5”时,编码为0x6D。如果数码管为共阳极,只需要对共阴极的编码做一个取反操作即可。

74HC595芯片分析

一定好好看此文章

一文搞懂74HC595芯片(附使用方法)_74hc595芯片引脚图及功能-CSDN博客

​​​​​​​原理图分析

我们本次所使用的是一款四段共阴极八位数码管,每个数码管的使能相对独立,各个数码管使用对应的三极管(NPN)进行使能控制。

由于数码管所需的管脚较多,我们使用SPI总线+74HC595(背过)芯片实现对数码管的控制。

(注:图中SPI4对应的即为SPI2)

74HC595是一款8位串行输入、并行输出的位移寄存器,在本次项目中,使用其将SPI串行传递过来的数据并行发送给对应数码管与显示位。SER为数据输入引脚。

位信号为:

SPI2_NSS——PB12(锁存,可设置为Output,低-》高就可以命令595芯片并行输出)

SPI2_SCK——PB13(SPI时钟)

SPI2_MISO——PB14(主机输入从机输出)---对本例子不重要

SPI2_MOSI——PB15(主机输出从机输入)

​​​​​​​cubeMX配置

程序编写

硬件SPI

/* USER CODE BEGIN 0 */
//定义一个保存了所有数字显示状态的数组
const uint8_t number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字显示

//定义一个用于保存想要显示的数字的变量
volatile uint16_t show_number = 0x1234;	//使用volatile使变量不被优化,每次都刷新读取

//数码管显示函数
void led_dispaly()
{
	uint8_t which_where_data[2] = {0x00, 0x00};		//创建一个用于保存段选与位选的数组
	
	//使用switch进行判断,由于一次只能点亮一个,需要引入一个变量进行自增,循环对应各数码管
	static uint8_t choose = 0;		//用于位循环
	
	switch(choose)
	{
		case 0:
			which_where_data[0] = 0x08;	//1-4位顺序为 0x01	0x02	0x04	0x08
			which_where_data[1] = number[show_number & 0x000F];	//将想要显示的数字与之相&,就相当于盖上了其他位
		
			//SPI传输函数,参数为使用的SPI通道、要传输的数据、数据长度、超时时间
			HAL_SPI_Transmit(&hspi2,which_where_data,2,10);
		
			//进行锁存操作,等效于写入一高一低电平
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
			HAL_Delay(1);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
		
			choose++;	//移动至下一位
		break;
		case 1:
			which_where_data[0] = 0x04;	//1-4位顺序为 0x01	0x02	0x04	0x08
			which_where_data[1] = number[show_number>>4 & 0x000F];	// >>4	取第三位

			//SPI传输函数,参数为使用的SPI通道、要传输的数据、数据长度、超时时间
			HAL_SPI_Transmit(&hspi2,which_where_data,2,10);
			//进行锁存操作,等效于写入一高一低电平
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
			HAL_Delay(1);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
			choose++;	//移动至下一位
		break;
		case 2:
			which_where_data[0] = 0x02;	//1-4位顺序为 0x01	0x02	0x04	0x08
			which_where_data[1] = number[show_number>>8 & 0x000F];
			//SPI传输函数,参数为使用的SPI通道、要传输的数据、数据长度、超时时间
			HAL_SPI_Transmit(&hspi2,which_where_data,2,10);		
			//进行锁存操作,等效于写入一高一低电平
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
			HAL_Delay(1);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
		
			choose++;	//移动至下一位
		break;
		case 3:
			which_where_data[0] = 0x01;//1-4位顺序为 0x01	0x02	0x04	0x08
		which_where_data[1] = number[show_number>>12 & 0x000F];	
			//SPI传输函数,参数为使用的SPI通道、要传输的数据、数据长度、超时时间
			HAL_SPI_Transmit(&hspi2,which_where_data,2,10);	
			//进行锁存操作,等效于写入一高一低电平
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
			HAL_Delay(1);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
			choose = 0;	//移动循环
		break;
	}	
}
/* USER CODE END 0 */
​​​​​​​软件SPI

1.先配置引脚为输出模式

2.右键改名字

改成如下

/* USER CODE BEGIN 0 */
void led_dispaly (uint8_t Bit,uint8_t Seg)//0x01  0x66  第一个管写4
{
	int i=0;
	for(i=0;i<8;i++)
	{
		HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, SPI2_MOSI_Pin, (Bit & 0x80) ? 1 : 0);
		HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_SET);
	     Bit<<=1;  
		HAL_Delay(1);
	}	
	for(i=0;i<8;i++)
	{
		HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB, SPI2_MOSI_Pin, (Seg & 0x80) ? 1 : 0);
		HAL_GPIO_WritePin(GPIOB,SPI2_SCK_Pin,GPIO_PIN_SET);
	  Seg<<=1;
		HAL_Delay(1);
	}		
     HAL_GPIO_WritePin(GPIOB, SPI2_NSS_Pin, 0);
     HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOB, SPI2_NSS_Pin, 1);
}


/* USER CODE END 0 */

作业:

通过串口发送相应的数字来控制数码管的输出,个位数

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include<stdlib.h>
#include<string.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void SystemPower_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* Configure the System Power */
  SystemPower_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	char buf[5]={0};
		uint8_t i=0;
	const uint8_t number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字显示
	uint8_t shi=0;
	uint8_t gewei=0;	
	uint8_t send[2]={0};
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_UART_Receive(&huart1,buf,5,8);//每次运行到此处,等3ms看看有没有数据发送过来
				i=atoi(buf);
		//取出i的十位和个位
				shi=i/10;
				gewei=i%10;
		//将十位显示在1号管0x01
		send[0]=0x01;   //    0001
		send[1]=number[shi];
		HAL_SPI_Transmit(&hspi2,send,2,100);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,0);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,1);
		
		//将个位显示在2号管0x02
		send[0]=0x02;  
		send[1]=number[gewei];
		HAL_SPI_Transmit(&hspi2,send,2,100);//向74HC595串行输出
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,0);//产生上升沿,并行输出
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,1);

  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE4) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_PCLK3;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief Power Configuration
  * @retval None
  */
static void SystemPower_Config(void)
{

  /*
   * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
   */
  HAL_PWREx_DisableUCPDDeadBattery();
/* USER CODE BEGIN PWR */
/* USER CODE END PWR */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

key1来控制数码管的数字显示,按一下+1,大于15归零

  /* USER CODE BEGIN 2 */
	uint8_t i=0;
	const uint8_t number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字显示
	uint8_t shi=0;
	uint8_t gewei=0;	
	uint8_t send[2]={0};
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)==0)
		{
				while(!HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9));
				i++;
			if(i>15)
			{
				i=0;
			}
		}
		//取出i的十位和个位
		shi=i/10;
		gewei=i%10;
		//将十位显示在1号管0x01
		send[0]=0x01;   //    0001
		send[1]=number[shi];
		HAL_SPI_Transmit(&hspi2,send,2,100);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,0);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,1);
		
		//将个位显示在2号管0x02
		send[0]=0x02;  
		send[1]=number[gewei];
		HAL_SPI_Transmit(&hspi2,send,2,100);//向74HC595串行输出
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,0);//产生上升沿,并行输出
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,1);
  }

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

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

相关文章

越学越爽!4小时从零入门大模型教程,2024最详细的学习路线,让你少走99%弯路!(大模型/LLM/Agent/提示工程)

第一阶段&#xff1a;基础理论入门 目标&#xff1a;了解大模型的基本概念和背景。 内容&#xff1a; 人工智能演进与大模型兴起。 大模型定义及通用人工智能定义。 GPT模型的发展历程。 第二阶段&#xff1a;核心技术解析 目标&#xff1a;深入学习大模型的关键技术和工…

论文速读:简化目标检测的无源域适应-有效的自我训练策略和性能洞察(ECCV2024)

中文标题&#xff1a;简化目标检测的无源域适应&#xff1a;有效的自我训练策略和性能洞察 原文标题&#xff1a;Simplifying Source-Free Domain Adaptation for Object Detection: Effective Self-Training Strategies and Performance Insights 此篇文章为论文速读&#xff…

小白入门学习计算机辅助工具--Git和Github

虽然平时大家都有听过Github&#xff0c;但这实际上要分为Git和Github&#xff0c;我们可以简单理解为前者是用于本地&#xff0c;后者是远程端。下面我们来看看一些基本的操作。 Github创建仓库 让我们先从Github开始&#xff0c;点击右边的绿色按钮new进入创建库界面&#x…

【C++】哈希表封装 unordered_map 和 unordered_set 的实现过程

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

攀拓(PAT)- 程序设计(乙级)2024年春季考试

题目来源&#xff1a;https://pintia.cn/market/item/1767454903977603072 B-1 题目要求 2024 这个数字&#xff0c;可以由 n n n个互不相同的正偶数和 m m m个互不相同的正奇数组合出来吗&#xff1f;本题就请你回答这个问题。 输入格式&#xff1a; 输入在一行中给出一个…

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55 前面我们讲述了几种BootLoader中的命令&#xff0c;包括获取软件版本号、获取帮助、获取芯片ID、读取Flash保护Level。 下面我们来介绍一下BootLoader中最重要的功能之一—跳转&#xff01;就像BootLoader词汇中的Boot…

VTK知识学习(2)-环境搭建

1、c方案 1.1下载源码编译 官网获取源码。 利用Cmake进行项目构建。 里面要根据实际使用的情况配置相关的模块哟&#xff0c;这个得你自行研究下了。 CMAKEINSTALLPREFIX--这个选项的值表示VTK的安装路径&#xff0c;默认的路径是C:/Program Files/VTK。该选项的值可不作更…

Chrome(谷歌浏览器中文版)下载安装(Windows 11)

目录 Chrome_10_30工具下载安装 Chrome_10_30 工具 系统&#xff1a;Windows 11 下载 官网&#xff1a;https://chrome.google-zh.com/&#xff0c;点击立即下载 下载完成&#xff08;已经下过一遍所以点了取消&#xff09; 安装 解压&#xff0c;打开安装包 点击下一步…

如何在算家云搭建Aatrox-Bert-VITS2(音频生成)

一、模型介绍 ‌ Aatrox - Bert -VITS2 模型是一种基于深度学习的语音合成系统&#xff0c;结合了 BERT 的预训练能力和 VITS2 的微调技术&#xff0c;旨在实现高质量的个性化语音合成。 二、模型搭建流程 1. 创建容器实例 进入算家云的“应用社区”&#xff0c;点击搜索找到…

232转485模块测试

概述 常用的PLC一般会有两个左右的232口&#xff0c;以及两个左右的485口&#xff0c;CAN口等&#xff0c;但是PLC一般控制的设备可能会有很多&#xff0c;会超出通讯口的数量&#xff0c;此时我们一般会采用一个口接多个设备&#xff0c;这种情况下要注意干扰等因素&#xff0…

静态数组类型无法用“=“给整个静态数组赋值

基础知识&#xff1a; 什么是静态数组类型&#xff1f; 在 C 中&#xff0c;静态数组是一种在编译时大小固定的数组。这意味着一旦声明&#xff0c;静态数组的大小就不能改变。 ------ 你可以声明一个静态数组并选择性地初始化它&#xff1a; int arr[10]; // 声明一个包…

使用 Python 调用云 API 实现批量共享自定义镜像

本文介绍如何通过 Python SDK 调用 API 接口&#xff0c;通过子用户批量共享云服务器自定义镜像。若您具备类似需求&#xff0c;或想了解如何使用 SDK&#xff0c;可参考本文进行操作。 前提条件 已创建子用户&#xff0c;并已具备云服务器及云 API 所有权限。 创建子用户请…

【旷视科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件

在现代地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;有许多大家耳熟能详的GIS软件。它们各自具有独特的优势&#xff0c;适用于不同的行业需求和使用场景。在众多企业和开发者面前&#xff0c;如何选择合适的 GIS 软件成为了一个值得深入思考的问题。今天&#xff…

【Spring】Spring Web MVC基础入门~(含大量例子)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;什么是Spring Web MVC 1&#xff1a;Servlet 2&#xff1a;总结 二&#xff1a;MVC …

数组类算法【leetcode】

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 二分查找 用于有序数组中&#xff0c;没有重复的数组。…

24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的&#xff0c;共有m个数据(x,x,...,x)。我们希望将这m个数据的维度从n维降到k维&#xff0c;希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失&#xff0c;但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表…

wxWidgets布局管理及XRC界面使用解惑

wxWidgets布局&#xff0c;通常就是wxBoxSizer&#xff0c;当然还有别的Sizer&#xff0c;就像Qt中的Layout一样&#xff0c;各种布局管理类。只是如今的wxWidgets尚未发展起来&#xff0c;一般其他的你用的比较少&#xff0c;因为这个最简单&#xff0c;最容易布局&#xff0c…

【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 062 &#xff0c;文末自助获取源码 \color{red}{T062&#xff0c;文末自助获取源码} T062&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

【循环引用及格式化输出】

垃圾回收机制 当一个值在内存中直接引用跟间接引用的量为0时&#xff0c;&#xff08;即这个值没有任何入口可以找到它&#xff09;那么这个值就会被清空回收♻️&#xff0c;释放内存空间&#xff1b; 列表在内存中的存储方式 1&#xff09;引用计数的两种方式 x "ea…