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

这里写目录标题

  • 一、任务描述
  • 二、任务实施
    • 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; // 设置引脚的输出速度为 50MHzGPIO_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~PE15GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置 GPIO 输出速度为 50MHzGPIO_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  :读输入的IOWirteIo :写输出的IO@Return    : 行列IO输出状态
**********************************************************************/
uint8_t GPIO_KEY_RW(uint16_t ReadIo,uint16_t WirteIo)
{uint16_t Wdata=0,Rdata=0;	//写KeyBordSetOut(KEY_ALL);             //设置IOif(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.rhkb.cn/news/283479.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Elasticsearch 作为向量数据库

在今天的文章中&#xff0c;我们将很快地通过 Docker 来快速地设置 Elasticsearch 及 Kibana&#xff0c;并设置 Elasticsearch 为向量搜索。 拉取 Docker 镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2 docker pull docker.elastic.co/kibana/kiba…

【Bug】记录2024年遇到的Bug以及修复方案

--------------------------------------------------------分割线 2024.3.22------------------------------------------------------- 1、load_sample_image raise AttributeError(“Cannot find sample image: %s” % image_name) AttributeError: Cannot find sample ima…

【wubuntu】披着Win11皮肤主题的Ubuntu系统

wubuntu - 一款外观类似于 Windows 的 Linux 操作系统&#xff0c;没有任何硬件限制。以下是官方的描述 Wubuntu is an operating system based on Ubuntu LTS that has a similar appearance to Windows using the open-source themes. Wubuntu also comes with a set of adva…

计算机网络——数据链路层(数据链路层功能概述)

计算机网络——数据链路层&#xff08;数据链路层功能概述&#xff09; 数据链路层的功能数据链路层的基本概念封装成帧和透明传输 我们之前已经学完了物理层的所有内容&#xff0c;今天开始我们要进入数据链路层的学习&#xff0c;如果有小伙伴对物理层的内容感兴趣的话&#…

MySQL数据库:索引

一、索引&#xff1a; 1. 索引的概念&#xff1a; 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。 使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据…

Kubernetes(k8s)集群健康检查常用的五种指标

文章目录 1、节点健康指标2、Pod健康指标3、服务健康指标4、网络健康指标5、存储健康指标 1、节点健康指标 节点状态&#xff1a;检查节点是否处于Ready状态&#xff0c;以及是否存在任何异常状态。 资源利用率&#xff1a;监控节点的CPU、内存、磁盘等资源的使用情况&#xf…

vue 安装脚手架报错 certificate has expired

vue 安装脚手架的时候报错&#xff0c;报错信息如下&#xff1a; 错误信息&#xff1a;npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired 翻译&#xff1a;npm ERR&#xff01;请求到https://registry.npm.taobao.org…

上位机图像处理和嵌入式模块部署(qmacvisual图像预处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 不管大家是在读书的时候学习的图像处理&#xff0c;还是在后来的工作中&#xff0c;重新学习了图像处理&#xff0c;相信大家对图像预处理的概念并…

【Linux实践室】Linux用户管理实战指南:新建与删除用户操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户命令2.1.1 知识点讲解2.1.2 案…

1Panel应用推荐:DataEase开源数据可视化分析工具

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

html第一次作业

常用标签 0, 骨架&#xff08;&#xff01;tap&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

mysql字段多个值,mybatis/mybatis-plus匹配查询

mysql中有一个字段是字符串类型的&#xff0c;category字段值有多个用逗号分割的&#xff0c;例如&#xff1a;娱乐,时尚美妆,美食 。现在想实现这么一个功能&#xff0c; 前端传参 字符串&#xff0c;美食,娱乐。现在想在mybatis的xml中实现&#xff0c;查询&#xff0c;能查到…

vue3+element Plus form 作为子组件,从父组件如何赋值?

刚开始接触vue3时&#xff0c;碰到一个很low的问题&#xff0c;将form作为子组件&#xff0c;在页面中给form表单项输入内容&#xff0c;输入框不显示值&#xff0c;知道问题出在哪&#xff0c;但因为vue3组合式api不熟悉&#xff0c;不知从哪下手... 效果图&#xff1a; 父组…

华为中心AP 配置入侵防御实验

配置入侵防御示例 组网图形 图1 入侵防御组网图 组网需求配置思路操作步骤中心AP的配置文件 组网需求 如图1所示&#xff0c;某企业部署了WLAN网络&#xff0c;内网用户可以访问Internet的Web服务器。现需要在中心AP上配置入侵防御功能&#xff0c;具体要求如下&#xff1a; 保…

蓝桥杯 2022 省B 李白打酒加强版

这题用递归暴力的方法如下&#xff1a; #include<iostream> #include<bits/stdc.h> using namespace std; int num; int N,M; void dfs(int now,int n,int m) {if(now<0 || n>N ||m>M)return ;if(nN && mM){if(now1)num1;return;}dfs(now-1,n,m1…

InnoDB 缓存

本文主要聊InnoDB内存结构, 先来看下官网Mysql 8.0 InnoDB架构图 MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 如上图所示,InnoDB内存主要包含Buffer Pool, Change Buffer, Log Buffer, Adaptive Hash Index Buffer Pool 其实 buffer pool 就是内存中的…

C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码

1 无向连通图中长度为n环 给定一个无向连通图和一个数n,计算图中长度为n的环的总数。长度为n的循环仅表示该循环包含n个顶点和n条边。我们必须统计存在的所有这样的环。 为了解决这个问题,可以有效地使用DFS(深度优先搜索)。使用DFS,我们可以找到特定源(或起点)的长度…

数据库被.[Goodmorningfriends@onionmail.org].faust勒索病毒加密,能恢复吗?

.faust勒索病毒有什么特点及危害&#xff1f; .faust勒索病毒是一种恶意软件&#xff0c;以其复杂的加密技术和勒索行为而闻名。这种病毒的主要目标是通过加密受害者的数据文件&#xff0c;然后勒索赎金以解密这些文件。它通常通过恶意附件、恶意链接或潜在的不安全下载源传播&…

Linux源码包安装

目录 一、transmission源码包安装 二、 nginx源码包安装 一、transmission源码包安装 1、下载编译环境所需的软件包依赖 2、下载transmision源码包到用户主目录下 https://github.com/transmission/transmission/releases/download/4.0.5/transmission-4.0.5.tar.xz 3、解压…

【PyTorch][chapter 22][李宏毅深度学习][ WGAN]【实战三】

前言&#xff1a; 本篇主要讲两个WGAN的两个例子&#xff1a; 1 高斯混合模型 WGAN实现 2 MNIST 手写数字识别 -WGAN 实现 WGAN 训练起来蛮麻烦的,如果要获得好的效果很多超参数需要手动设置 1&#xff1a; 噪声的维度 2: 学习率 3&#xff1a; 生成器&#xff0c;鉴别器…