【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、工程测试
相关文章:

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)
这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑(1)主函数编辑(2)LED IO初始化函数(LED_Init())(3)开发板矩阵键盘IO初始化(ExpKeyBordInit())&…...

乐优商城(九)数据同步RabbitMQ
1. 项目问题分析 现在项目中有三个独立的微服务: 商品微服务:原始数据保存在 MySQL 中,从 MySQL 中增删改查商品数据。搜索微服务:原始数据保存在 ES 的索引库中,从 ES 中查询商品数据。商品详情微服务:做…...

XSS-labs详解
xss-labs下载地址https://github.com/do0dl3/xss-labs 进入靶场点击图片,开始我们的XSS之旅! Less-1 查看源码 代码从 URL 的 GET 参数中取得 "name" 的值,然后输出一个居中的标题,内容是 "欢迎用户" 后面…...
设计模式——模板方法模式封装.net Core读取不同类型的文件
1、模板方法模式 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 特点:通过把不变的行为搬移到超类,去除子类中重复的代…...
[思考记录]技术欠账
最近对某开发项目做回顾梳理,除了进一步思考整理相关概念和问题外,一个重要的任务就是清理“技术欠账”。 这个“技术欠账”是指在这个项目的初期,会有意无意偏向快速实现,想先做出来、用起来,进而在实现过程中做出…...

React - 实现菜单栏滚动
简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单,内容区域会自动滚动到对应卡片。内容区域滑动,指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…...

线性筛选(欧拉筛选)-洛谷P3383
#include <bits/stdc.h> using namespace std; int main() {std::ios::sync_with_stdio(false); cin.tie(nullptr); //为了加速int n, q;cin >> n >> q; vector<int>num(n 1); //定义数字表vector<int>prime; //定义素数表数组num[1] …...

企业微信可以更换公司主体吗?
企业微信变更主体有什么作用?当我们的企业因为各种原因需要注销或已经注销,或者运营变更等情况,企业微信无法继续使用原主体继续使用时,可以申请企业主体变更,变更为新的主体。企业微信变更主体的条件有哪些࿱…...

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

Golang案例开发之gopacket抓包三次握手四次分手(3)
文章目录 前言一、理论知识三次握手四次分手二、代码实践1.模拟客户端和服务器端2.三次握手代码3.四次分手代码验证代码完整代码总结前言 TCP通讯的三次握手和四次分手,有很多文章都在介绍了,当我们了解了gopacket这个工具的时候,我们当然是用代码实践一下,我们的理论。本…...

如何减少pdf的文件大小?pdf压缩工具介绍
文件发不出去,有时就会耽误工作进度,文件太大无法发送,这应该是大家在发送PDF时,常常会碰到的问题吧,那么PDF文档压缩大小怎么做呢?因此我们需要对pdf压缩后再发送,那么有没有好用的pdf压缩工具…...

TypeScript基础类型
string、number、bolean 直接在变量后面添加即可。 let myName: string Tomfunction sayHello(person: string) {return hello, person } let user Tom let array [1, 2, 3] console.log(sayHello(user))function greet(person: string, date: Date): string {console.lo…...

长安链智能合约标准协议第二草案——BNS与DID协议邀请社区用户评审
长安链智能合约标准协议 在智能合约编写过程中,不同的产品及开发人员对业务理解和编程习惯不同,即使同一业务所编写的合约在具体实现上也可能有很大差异,在运维或业务对接中面临较大的学习和理解成本,现有公链合约协议规范又不能完…...

安防监控视频汇聚平台EasyCVR接入海康Ehome设备,设备在线但视频无法播放是什么原因?
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

【Python + Django】表结构创建
以员工管理系统为例。 事前呢,我们先把项目和app创建出来,详细步骤可以看我同栏目的第一篇、第二篇文章。 我知道你们是不会下来找的,就把链接贴在下面吧: 【Python Django】启动简单的文本页面-CSDN博客 【Python Django】…...

解锁编程潜能:ChatGPT如何革新软件开发
目录 一、背景 二、功能描述 三、总结 一、背景 在这个飞速发展的数字时代,软件开发的效率和质量成了衡量一个开发者能力的重要标准。随着人工智能技术的不断进步,越来越多的开发者开始寻找能够提升工作效率的新方法。我就是其中之一,最近…...

内网使用rustdesk进行远程协助
文章目录 前言一、搭建rustdesk中继服务器二、搭建文件下载服务器三、创建引导脚本四、使用 前言 内网没有互联网环境,没法使用互联网上有中继服务器的远程协助工具,如teamviewer、todesk、向日癸等;在内网进行远程维护可以自己搭建中继服务…...

linux内核input子系统概述
目录 一、input子系统二、关键数据结构和api2.1 数据结构2.1.1 input_dev2.1.2 input_handler2.1.3 input_event2.1.4 input_handle 2.2 api接口2.2.1 input_device 相关接口input_device 注册流程事件上报 2.2.2 input handle 相关接口注册 handle指定 handle 2.2.3 input han…...
【解决报错】vi/vim修改文件时报错:Found a swap file by the name xxxxx
目录 报错内容报错原因解决方法 报错内容 vim打开文件提示: Found a swap file by the name xxxxx报错原因 使用vi或vim编辑器编写代码时由于网络不稳定(或其他种种原因)断开了连接,编辑好的代码没有运行和保存,再次…...

BRAM底层原理详细解释(1)
目录 一、原语 二、端口简述 2.1 端口简介 2.2 SDP端口映射 三、端口信号含义补充说明 3.1 字节写使能(Byte-Write Enable)- WEA and WEBWE: 3.2 地址总线—ADDRARDADDR and ADDRBWRADDR 3.3 数据总线—DIADI, DIPADIP, DIBDI, and D…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...