【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; // 设置引脚的输出速度为 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.mfbz.cn/a/482333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM本地方法

本地方法接口 NAtive Method就是一个java调用非java代码的接口 本地方法栈&#xff08;Native Method Statck&#xff09; Java虚拟机栈用于管理Java方法的调用&#xff0c;而本地方法栈用于管理本地方法的调用。 本地方法栈&#xff0c;也是线程私有的。 允许被实现成固定或…

Matlab|基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究

目录 1 主要内容 目标函数 计算步骤 节点系统 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序完全复现文献《A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading》&#xff0c;建立了一个考虑碳排放交易的最优模型&am…

【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作

目录 1 MySQL分组查询与子查询 1.1 数据分组查询 1.2 过滤分组 1.3 分组结果排序 1.4 select语句中子句的执行顺序 1.5 子查询 2 MySQL表的联结操作 2.1 关系表 2.2 表联结 2.3 笛卡尔积 2.4 内部联结 2.5 外联结 2.6 自联结 2.7 组合查询 1 MySQL分组查询与子查询…

Java学习路线一条龙

说在前面 讲真&#xff0c;虽然我是正规计算机专业出身&#xff0c;但十多年来&#xff0c;Java这语言和它那一大堆配套的工具、框架&#xff0c;变化得太快了。 我也是一边学新的&#xff0c;一边扔旧的&#xff0c;忙得不可开交。 现在回想起来&#xff0c;走过的弯路、浪费…

2024年【危险化学品经营单位安全管理人员】新版试题及危险化学品经营单位安全管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员新版试题考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安…

C++默认构造函数(二)

目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…

ngrok实现内网穿透

在使用jenkins进行自动化部署时&#xff0c;需要设置github的webhook钩子来触发构建&#xff0c;由于jenkins运行在自己的电脑上&#xff0c;因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…

微信小程序开发学习笔记——4.2showModal和showLoading界面交互操作

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p27&vd_source9b149469177ab5fdc47515e14cf3cf74 一、showModal 显示模态对话框 1、属性 https:/…

电商爬虫系统|电商数据采集|电商API商品数据采集

1、基本的说明 当初为了在几个电商网站抓取商品信息数据搭建的系统。该系统主要用来抓取电商网站上面的一百个左右品类的商品的价格信息、商品信息和折扣信息等。抓取的电商网站主要是某宝和某东。其他的电商网站抓取信息的方式无外乎这两种。跟其他的示例代码不同&#xff0c…

【redis】服务器架构演进

架构演进 单机架构应用数据分离架构应⽤服务集群架构读写分离 / 主从分离架构冷热分离架构垂直分库微服务架构 单机架构 所有的应用服务、业务所需的数据、业务处理等都在一台服务器上。 在初期&#xff0c;用户访问量很少&#xff0c;对服务器的的性能和安全没有很高的要求&am…

抖音视频无水印批量下载软件|爬虫视频采集工具

抖音视频无水印批量下载软件&#xff0c;轻松实现视频提取和下载 概述&#xff1a; 想要快速、方便地提取和下载抖音视频无水印&#xff1f;我们的抖音视频无水印批量下载软件将是您的得力助手&#xff01;不仅支持通过关键词批量提取视频&#xff0c;还可以针对特定视频进行提…

Linux安装Nacos

安装前必要准备 准备Java环境 &#xff0c;8以上的版本&#xff0c;mysql&#xff08;集群相关信息&#xff09;&#xff0c;nginx&#xff08;进行代理&#xff09; 安装Nacos 首先我们要有一个nacos的包&#xff0c;我们可以在线下载&#xff0c;也可以提前下载好&#xf…

IRIS 和 Caché 是什么关系

我们都知道真正一个数据库通常是 2 个部分组成的&#xff0c;存储和进程。 Cach Cach 的定义就是一个数据库&#xff0c;在这个数据库中有存储和进程。 与我们常用的 MySQL 来说&#xff0c;我们安装好 MySQL 后我们就可以通过客户端进行连接了&#xff0c;同时我们还可以通过…

二叉树的链式结构和遍历(下)

又见面了&#xff0c;小伙伴们。今天我们继续来学习二叉树&#xff0c;今天的内容相对来说比较容易理解&#xff0c;前提是需要你们自己动手画图才会好理解。眼过千遍不如手过一遍。所以小伙伴们要多动手哦。直接开始今天的学习吧 1.二叉树链式结构的实现 1.1 前置说明 在学习…

Stability AI发布Stable Video 3D模型:可从单张图像创建多视图3D视频,视频扩散模型史诗级提升!

Stability AI发布了Stable Video 3D (SV3D)&#xff0c;这是一种基于稳定视频扩散的生成模型&#xff0c;推动了3D技术领域的发展&#xff0c;并大大提高了质量和视图一致性。 该版本有两个版本: SV3D_u:该变体基于单图像输入生成轨道视频&#xff0c;无需相机调节。 SV3D_p:扩…

鸿蒙Harmony应用开发—ArkTS(@Link装饰器:父子双向同步)

子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 限制条件 Link装饰器不能在Entry装饰的自定义组件中使用…

伊理威科技:抖音开网店新手刚做选啥品

在数字浪潮中&#xff0c;抖音不仅是展示才艺的舞台&#xff0c;更是创业者的新天地。新手若想在这片热土上开垦网店&#xff0c;选品便是首要课题。选择产品如同种下希望的种子&#xff0c;既要考量土壤肥沃度&#xff0c;也得预测风雨适宜期。 兴趣与专长是选品的罗盘。热爱所…

STM32之HAL开发——RCC外设CubeMX配置时钟

RCC外设介绍 RCC是Reset and Clock Control (复位和时钟控制)的缩写&#xff0c;它是STM32内部的一个重要外设&#xff0c;负责管理各种时钟源和时钟分频&#xff0c;以及为各个外设提供时钟使能。RCC模块可以通过寄存器操作或者库函数来配置。 RCC是复位和时钟控制模块&#…

GeoAI 简明教程

想象一下&#xff0c;能够在野火发生后立即发现它&#xff0c;可视化全球人口变化&#xff0c;或者立即从地图中提取线条。 GeoAI&#xff0c;即地理空间人工智能&#xff0c;是指地理信息系统 (GIS)、人工智能 (AI) 和机器学习 (ML) 的交叉点。 这个领域正在彻底改变我们与世界…

数据结构 - 二叉树非递归遍历

文章目录 前言一、前序二、中序三、后序 前言 本文实现二叉树的前中后的非递归遍历&#xff0c;使用栈来模拟递归。 文字有点简略&#xff0c;需要看图和代码理解 树节点&#xff1a; typedef char DATA; //树节点 typedef struct Node {DATA data; //数据struct Node* left…
最新文章