【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

news2024/9/27 9:28:48

这里写目录标题

  • 一、任务描述
  • 二、任务实施
    • 1、SingleKey工程文件夹创建
    • 2、函数编辑
      • (1)主函数编辑
      • (2)LED IO初始化函数(LED_Init())
      • (3)开发板矩阵键盘IO初始化(ExpKeyBordInit())
      • (3)开发板矩阵按键LED控制(ExpKeyBordInit())
      • (4)键盘IO(PE12-PE15)设置为输入模式函数(KeyBordSetIn())
      • (5)键盘IO(PE8-PE11)设置为输出模式函数(KeyBordSetOut())
      • (6)矩阵键盘行列读写操作函数(GPIO_KEY_RW())
      • (7)矩阵键盘键值扫描函数(KeyBoardScan())
    • 3、宏定义
      • (1)源文件添加头文件
      • (2)按键头文件编辑
    • 4、知识链接
      • (1)GPIO_SetBits()
      • (2)GPIO_ResetBits()
      • (3)GPIO_ReadOutputData()
      • (4)GPIO_ReadInputData()
    • 5、工程测试


STM32资料包:
百度网盘下载链接:链接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888
提取码:8888


一、任务描述

在这里插入图片描述

二、任务实施

观察电路图,DK1-DK16按键有按下PE8 - PE11端口下拉输入,PE12-PE15输出,按键按下从而组合成16种控制led灯。
请添加图片描述
参考排列组合,如同KE1按下时,PE8为与PE12导通。
请添加图片描述

1、SingleKey工程文件夹创建

步骤1:复制工程模板“1_Template”重命名为“4_KeyBoard”
在这里插入图片描述
步骤2:修改项目工程名,先删除projects文件夹内除了Template.uvprojx文件外的所有内容并修改为“KeyBoard.uvprojx”。并删除output/obj和output/lst中的所有文件。
在这里插入图片描述
步骤3:运行“KeyBoard.uvprojx”打开目标选项“Options for Target”中的“Output”输出文件,并修改可执行文件名称为“KeyBoard”点击“OK”保存设置。最后点击“Rebuild”编译该工程生成KeyBoard文件。
在这里插入图片描述
步骤4:复制“2_LEDTest”中的"1_LED"文件复制到hardware中。
请添加图片描述
步骤5:新建“2_KeyBoard”文件,并在该文件夹下新建“KeyBoard.c”和“KeyBoard.h”两个文件。
请添加图片描述
步骤6:工程组文件中添加“led.c”和“KeyBoard.c”文件。
在这里插入图片描述
步骤7:目标选项添加添加头文件路径
在这里插入图片描述

2、函数编辑

(1)主函数编辑

在这里插入图片描述
步骤1:端口初始化准备

	//函数初始化,端口准备
	delay_init();     //启动滴答定时器,延时函数
	LED_Init();       //板载LED初始化
    ExpKeyBordInit(); //开发板按键初始化

在这里插入图片描述

步骤2:循环工作代码编辑,读取按键并判断按键模式,按下则点亮led灯,否则LED灯熄灭

	while(1)
	{
		KeyValue = ExpKeyScan(0);
		switch(KeyValue)
		{
			case 1:LED_MODE1(KeyValue);
				break;
			case 2:LED_MODE1(KeyValue);
				break;
			case 3:LED_MODE1(KeyValue);
				break;
			case 4:LED_MODE1(KeyValue);
				break;
			case 5:LED_MODE1(KeyValue);
				break;
			case 6:LED_MODE1(KeyValue);
				break;
			case 7:LED_MODE1(KeyValue);
				break;
			case 8:LED_MODE1(KeyValue);
				break;
			case 9:LED_MODE1(KeyValue);
				break;
			case 10:LED_MODE1(KeyValue);
				break;
			case 11:LED_MODE1(KeyValue);
				break;
			case 12:LED_MODE1(KeyValue);
				break;
			case 13:LED_MODE1(KeyValue);
				break;
			case 14:LED_MODE1(KeyValue);
				break;
			case 15:LED_MODE1(KeyValue);
				break;
			case 16:LED_MODE1(KeyValue);
				break;
		}
		
	}

请添加图片描述

(2)LED IO初始化函数(LED_Init())

/*********************************************************************
 @Function  : 开发板LED IO初始化
 @Parameter : N/A 
 @Return    : N/A
**********************************************************************/
void ExpLEDInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; // 定义 GPIO 初始化结构体变量
    
    /* 时钟使能 */	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟
    
    /* 引脚配置 */	
    GPIO_InitStructure.GPIO_Pin = LED_ALL; // D1-D8->PA0-PA7 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚的输出速度为 50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure); // 应用以上配置到 GPIOA 上
    
    GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
}

在这里插入图片描述

(3)开发板矩阵键盘IO初始化(ExpKeyBordInit())

初始化PE8 - PE15端口,并为推挽输出。

/*********************************************************************
 @Function  : 矩阵键盘IO初始化
 @Parameter : None 
 @Return    : None
**********************************************************************/
void ExpKeyBordInit(void)
{
 	GPIO_InitTypeDef  GPIO_InitStructure;
	
	/*时钟使能*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	
	/*引脚配置*/
    GPIO_InitStructure.GPIO_Pin = KEY_ALL;           // 将开发板四个按键连接到PE8~PE15
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置 GPIO 输出速度为 50MHz
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出		 
    GPIO_Init(GPIOE, &GPIO_InitStructure);	
	
	/*引脚初始电平设置*/
	GPIO_SetBits(GPIOE,KEY_ALL);
}

在这里插入图片描述

(3)开发板矩阵按键LED控制(ExpKeyBordInit())

初始化PE8 - PE15端口,并为推挽输出。

/*********************************************************************
 @Function  : 开发板矩阵按键LED控制
 @Parameter : KeyValue:矩阵按键状态 
                每一位表示一个矩阵按键的状态,每位按键对于相应led模式
 @Return    : N/A
**********************************************************************/
void LED_MODE1(uint32_t KeyValue)
{
	switch(KeyValue)
	{
		case 1:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED1 = 0;delay_ms(1000);
			break;
		case 2:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED2 = 0;delay_ms(1000);
		  break;
		case 3:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED3 = 0;delay_ms(1000);
			break;
		case 4:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED4 = 0;delay_ms(1000);
		  break;
		case 5:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED5 = 0;delay_ms(1000);
			break;
		case 6:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED6 = 0;delay_ms(1000);
		  break;
		case 7:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED7 = 0;delay_ms(1000);
			break;
		case 8:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED8 = 0;delay_ms(1000);
		  break;
		case 9:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED1 = 0;
		  LED2 = 0;delay_ms(1000);
			break;
		case 10:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED3 = 0;
		  LED4 = 0;delay_ms(1000);
		  break;
		case 11:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED5 = 0;
		  LED6 = 0;delay_ms(1000);
		  break;
		case 12:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  LED7 = 0;
		  LED8 = 0;delay_ms(1000);
			break;
		case 13:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  delay_ms(1000);
		  break;
		case 14:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
		  for(int i = 0;i < 8;i++)
			{
			    PAout(i) = 0;
				  delay_ms(500);
			}
			for(int i = 0;i < 8;i++)
			{
			    PAout(i) = 1;
					delay_ms(500);
			}
		  break;
		case 15:
			GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
			break;
	}
	
}


在这里插入图片描述

(4)键盘IO(PE12-PE15)设置为输入模式函数(KeyBordSetIn())

将指定的 GPIO 引脚设置为输入模式,并启用下拉输入。

/*********************************************************************
 @Function  : 键盘IO设置为输入模式
 @Parameter : KEYIO :要设置的IO
 @Return    : N/A
**********************************************************************/
void KeyBordSetIn(uint16_t KEYIO)
{
 	GPIO_InitTypeDef  GPIO_InitStructure;
	/*时钟使能*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	/*引脚配置*/
  GPIO_InitStructure.GPIO_Pin = KEYIO;	           
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;     //下拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);	
}

在这里插入图片描述

(5)键盘IO(PE8-PE11)设置为输出模式函数(KeyBordSetOut())

将指定的 GPIO 引脚设置为输入模式,并启用下拉输入

/*********************************************************************
 @Function  : 键盘IO设置为输出模式
 @Parameter : KEYIO :要设置为输出模式的GPIO引脚
 @Return    : N/A
**********************************************************************/
void KeyBordSetOut(uint16_t KEYIO)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 使能GPIOE时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

    /* 配置引脚为输出模式 */
    GPIO_InitStructure.GPIO_Pin = KEYIO;    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}

在这里插入图片描述

(6)矩阵键盘行列读写操作函数(GPIO_KEY_RW())

从矩阵键盘中读取按键状态,通过设置特定的 GPIO 引脚为输入或输出模式,并根据参数设置写入行或列,并且根据读取的输入和输出数据返回一个表示按键状态的字节值

/*********************************************************************
 @Function  : 矩阵键盘行列读写操作
 @Parameter : ReadIo  :读输入的IO
							WirteIo :写输出的IO
 @Return    : 行列IO输出状态
**********************************************************************/
uint8_t GPIO_KEY_RW(uint16_t ReadIo,uint16_t WirteIo)
{
	uint16_t Wdata=0,Rdata=0;	
	//写
	KeyBordSetOut(KEY_ALL);             //设置IO
	if(WirteIo==0x0f00)
		GPIO_SetBits(GPIOE,KEY_LINE);   //写行		 
	else 
		GPIO_ResetBits(GPIOE,KEY_LIST); //写列		
	Wdata = GPIO_ReadOutputData(GPIOE); //读输出	
	Wdata &= WirteIo;                   //取有效区域
	
	//读
	KeyBordSetIn(ReadIo);               //设置IO 
	Rdata = GPIO_ReadInputData(GPIOE);  //读输入
	Rdata &= ReadIo;                    //取有效区域
	
	//状态返回	
	Rdata |= Wdata;                     //合并两次读取的数据
	return (uint8_t)(Rdata>>8);         //移位返回
}

在这里插入图片描述

(7)矩阵键盘键值扫描函数(KeyBoardScan())

扫描矩阵键盘的按键状态,通过检测行列按键的组合来确定按下的具体按键,并在按键按下后进行一定的延时消抖处理,最终返回表示按键值的一个字节。

/*********************************************************************
 @Function  : 矩阵键盘键值扫描
 @Parameter : N/A
 @Return    : 键值
**********************************************************************/
uint8_t KeyBoardScan(void)
{
	uint8_t KeyValue=0,Key=0;
	uint8_t a = 0;

	if(GPIO_KEY_RW(KEY_LIST,KEY_LINE)!=0x0f)    //读取按键是否按下
	{
		delay_ms(10);//延时10ms进行消抖
		if(GPIO_KEY_RW(KEY_LIST,KEY_LINE)!=0x0f)//再次检测键盘是否按下
		{
			//测试列
			Key = GPIO_KEY_RW(KEY_LIST,KEY_LINE);
			switch(Key)
			{
				case(0x1F):	KeyValue=1;break;//1列
				case(0x2F):	KeyValue=2;break;//2列
				case(0x4F): KeyValue=3;break;//3列
				case(0x8F):	KeyValue=4;break;//4列
			}
			//测试行
			Key = GPIO_KEY_RW(KEY_LINE,KEY_LIST);
			switch(Key)
			{
				case(0x0E):	KeyValue=KeyValue;break;   //1行
				case(0x0D):	KeyValue=KeyValue+4;break; //2行
				case(0x0B): KeyValue=KeyValue+8;break; //3行
				case(0x07):	KeyValue=KeyValue+12;break;//4行
			}
			 //松手检测		
			while((a<50)&&(Key!=0x00))	
			{
				delay_ms(5);
				Key = GPIO_KEY_RW(KEY_LINE,KEY_LIST);
			  a+=1;
			}				
		}
	}
	return KeyValue;
}

在这里插入图片描述

3、宏定义

(1)源文件添加头文件

步骤1:按键功能文件中添加相关头文件,源文件报错消失部分

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include ".\delay\delay.h"
#include "SingleKey.h"

在这里插入图片描述

步骤2:主函数添加所需的led和KeyBoard头文件,主源文件部分报错消失

/***********Hardweare***************/
#include "led.h"
#include "KeyBoard.h"

在这里插入图片描述

(2)按键头文件编辑

点击编译显示报错
在这里插入图片描述
步骤1:创建一个宏定义保护

#ifndef _SINGLEKEY_H
#define _SINGLEKEY_H





#endif

在这里插入图片描述

步骤2:添加宏定义

/******************矩阵键盘IO预定义********************/
#define  KEY_LINE 	GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10  | GPIO_Pin_11  	//行

#define  KEY_LIST 	GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14  | GPIO_Pin_15 	//列

#define  KEY_ALL  	GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10  | GPIO_Pin_11 | \
										GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14  | GPIO_Pin_15		//行和列
//行列操作定义
#define RLine_WList  0 //读行写列
#define RList_WLine  1 //读列写行

在这里插入图片描述

步骤3:添加函数声明

void    ExpKeyBordInit(void);    //矩阵键盘IO初始化
uint8_t KeyBoardScan(void);      // 矩阵键盘键值扫描

在这里插入图片描述
步骤4:添加数据类型和宏的头文件

#include <stdint.h>
//键值枚举
enum KeyBoard
{
	KEY_NO=0,
    KEY_K1,
	KEY_K2,
	KEY_K3,
	KEY_K4,
	KEY_K5,
	KEY_K6,
	KEY_K7,
	KEY_K8,
	KEY_K9,
	KEY_K10,
	KEY_K11,
	KEY_K12,
	KEY_K13,
	KEY_K14,
	KEY_K15,
	KEY_K16
};

在这里插入图片描述

4、知识链接

(1)GPIO_SetBits()

将指定的 GPIO 引脚设置为高电平(或逻辑“1”)状态

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

(2)GPIO_ResetBits()

将指定的 GPIO 引脚设置为低电平(或逻辑“0”)状态

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

(3)GPIO_ReadOutputData()

这个函数用于读取配置为输出的 GPIO(通用输入/输出)引脚的当前状态。换句话说,它读取当前从配置为输出的 GPIO 引脚驱动出去的数据。

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

GPIOx:指定要读取输出数据的 GPIO 端口,如 GPIOA、GPIOB 等

(4)GPIO_ReadInputData()

相反,这个函数用于读取配置为输入的 GPIO 引脚的当前状态。它读取当前在配置为输入的 GPIO 引脚上检测到的数据。

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

GPIOx:指定要读取输出数据的 GPIO 端口,如 GPIOA、GPIOB 等

5、工程测试

在这里插入图片描述

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

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

相关文章

HCIA-Datacom H12-811 更新

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 在WLAN发展历史中&#xff0c;初级移动办公时代的主要无线协议标准不包括以下哪项&#xff1f; A. 802.11ac B. 802.11g C. 802.11b D. 802.11a 答案&#xff1a;A OSPF协议在进行主从关系选举…

Apipost智能Mock功能详解

在接口开发过程中&#xff0c;Mock功能可以帮助开发者快速测试和验证接口的正确性和稳定性&#xff0c;以便快速迭代和修复问题。Apipost推出智能Mock功能&#xff0c;可以在智能期望中填写一些触发条件&#xff0c;开启后&#xff0c;Apipost会根据已设置的触发条件&#xff0…

Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QTextBrowser组件-简单的文本浏览器 ​2.2 QGraphicsView组件-简单的图像浏览器 Display Widgets将分为两篇文章介绍 文章1&#xff08;Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件-CSDN…

MyBatis是纸老虎吗?(五)

最近看到这样一则消息《全球首位AI工程师诞生&#xff0c;“码农”未来会消失&#xff1f;》&#xff0c;文章提到百度董事长兼首席执行官李彦宏认为未来将不会存在“程序员”这种职业。行业大佬的这种说法&#xff0c;让我异常恐慌。难道程序员就这样被淘汰了&#xff1f;AI真…

YOLOv8 | 注意力机制 | ShuffleAttention注意力机制 提升检测精度

YOLOv8成功添加ShuffleAttention ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;http://t.csdnimg.cn/1Aqzu YOLOv8涨点专栏…

力扣236 二叉树的最近公共祖先 Java版本

文章目录 题目描述代码 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

PDF文件如何以数字进行批量重命名?以数字重命名的PDF文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的PDF文件&#xff0c;如文档、报告、合同等。为了更高效地管理这些文件&#xff0c;一个有效的方式就是对它们进行批量命名。批量命名不仅能提高文件的组织性&#xff0c;还能节省大量时间。下面&#xff0c;我们将详细介绍…

【数据分析案列】--- 北京某平台二手房可视化数据分析

一、引言 本案列基于北京某平台的二手房数据&#xff0c;通过数据可视化的方式对二手房市场进行分析。通过对获取的数据进行清冼&#xff08;至关重要&#xff09;&#xff0c;对房屋价格、面积、有无电梯等因素的可视化展示&#xff0c;我们可以深入了解北京二手房市场的特点…

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…

飞桨AI应用@riscv OpenKylin

在riscv编译安装飞桨PaddlePaddle参见&#xff1a; 算能RISC-V通用云编译飞桨paddlepaddleopenKylin留档_在riscv下进行paddlelite源码编译-CSDN博客 安装好飞桨&#xff0c;就可以用飞桨进行推理了。刚开始计划用ONNX推理&#xff0c;但是在算能云没有装上&#xff0c;所以最…

C语言——程序拷贝文件

问题如下&#xff1a; 写一个程序拷贝文件&#xff1a; 使用所学文件操作&#xff0c;在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读…

服务器中了.[hpssupfast@mailfence.com].Elbie勒索病毒,数据还能恢复吗?

引言&#xff1a; .[hpssupfastmailfence.com].Elbie勒索病毒是一种网络攻击病毒&#xff0c;它会在感染用户的计算机系统中放置恶意软件&#xff0c;该软件会对用户的文件进行加密并要求支付赎金以解密文件。这种病毒通常通过网络钓鱼、木马植入等方式传播&#xff0c;利用用户…

【Ubuntu 22.04 LTS】安装vmware提示没有兼容的gcc

在ubuntu 22.04 上运行wmware时显示找不到兼容的gcc 这里要求的是12.3.0版本&#xff0c;我查看了自己的gcc版本是上面的11.4.0 在ask ubuntu上找到了解决方法 尝试了这一条 三条命令执行完成之后&#xff0c;再次运行vm&#xff0c;没有提示gcc的问题 点击install下载相应模…

Unity vision pro模拟器开发教程-附常见问题解决方案

前言 庄生晓梦迷蝴蝶&#xff0c;望帝春心托杜鹃 废话 去年苹果发布会上&#xff0c;推出了Vision Pro这一款XR产品。并且宣布Unity作为其主要合作伙伴&#xff0c;负责开发XR的开发产品。 这消息一出&#xff0c;当晚Unity的股价直接被熔断。产品发布之后&#xff0c;一直等…

深度强化学习(九)(改进策略梯度)

深度强化学习&#xff08;九&#xff09;&#xff08;改进策略梯度&#xff09; 一.带基线的策略梯度方法 Theorem: 设 b b b 是任意的函数, b b b与 A A A无关。把 b b b 作为动作价值函数 Q π ( S , A ) Q_\pi(S, A) Qπ​(S,A) 的基线, 对策略梯度没有影响: ∇ θ J …

实例:NX二次开发使用链表进行拉伸功能(链表相关功能练习)

一、概述 在进行批量操作时经常会利用链表进行存放相应特征的TAG值&#xff0c;以便后续操作&#xff0c;最常见的就是拉伸功能。这里我们以拉伸功能为例子进行说明。 二、常用链表相关函数 UF_MODL_create_list 创建一个链表&#xff0c;并返回链表的头指针。…

Codeforces Round #936 (Div. 2)B~D

1946B - Maximum Sum 可以想到&#xff0c;每次都将最大连续子序列放到该子序列的最后&#xff0c;也就是每一轮都能将最大连续子序列倍增一次填到数组中&#xff0c;最终求结果 // Problem: B. Maximum Sum // Contest: Codeforces - Codeforces Round 936 (Div. 2) // URL: …

【Flink】Flink 中的时间和窗口之窗口其他API的使用

1. 窗口的其他API简介 对于一个窗口算子而言&#xff0c;窗口分配器和窗口函数是必不可少的。除此之外&#xff0c;Flink 还提供了其他一些可选的 API&#xff0c;可以更加灵活地控制窗口行为。 1.1 触发器&#xff08;Trigger&#xff09; 触发器主要是用来控制窗口什么时候…

算法系列--动态规划--子序列(2)

&#x1f495;"你可以说我贱&#xff0c;但你不能说我的爱贱。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(2),包含了关于子序列问题中较难的几道题目(尤其是通过二维状…

uni-app打包证书android

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 Android证书的生成是自助和免费的&#xff0c;不需要审批或付费。 可以使用JRE环境中的keytool命令生成。 以下是windows平台生成证…