HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能

HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能


  • 📺实现效果演示:
    在这里插入图片描述

📘内容提要

  • 📝本文主要实现,通过STM32 HAL库开发,实现的EC11编码器功能,按键结合状态机思想实现的拓展单击、双击、长按的综合功能。单片机硬件上使用了2个外部中断引脚实现。
  • 🗝该功能可以很方便实现移植,例如使用在OLED屏幕显示菜单上。
  • 🔖验证对象:STM32F401
  • 🍁EC11编码器部分的原理图:
    在这里插入图片描述

🛠stm32cubemx配置

  • 🔧将EC11中键引脚配置为输入模式、开启内部上拉模式,其余2个引脚配置为外部中断引脚(一个配置为下降沿中断,另外一个配置为上、下降沿中断,这一点很关键!)。

在这里插入图片描述

✅EC11编码器增减功能,通过外部中断实现

  • 🌿外部中断回调处理函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{/* Prevent unused argument(s) compilation warning */UNUSED(GPIO_Pin);static uint8_t count = 0;static uint8_t b_flag;GPIO_PinState a_value = HAL_GPIO_ReadPin(EC11_A_GPIO_Port, EC11_A_Pin);GPIO_PinState b_value = HAL_GPIO_ReadPin(EC11_B_GPIO_Port, EC11_B_Pin);if(GPIO_Pin == EC11_A_Pin) {if(a_value == RESET && count == 0) {b_flag = 0;if(b_value) b_flag = 1;count = 1;}if(a_value == SET && count == 1) {if(b_value == RESET && b_flag == 1) { //开始逆时针转动test_num--;dir_flag = 1;}if(b_value && b_flag == 0) { //开始顺时针转动test_num++;dir_flag = 0;}count = 0;}}/* EC11中键,按键中断 */// if(GPIO_Pin == EC11_KEY_Pin)// {// key_click_flag = 1;// }
}

📓单击、双击、长按功能实现驱动代码

  • 📝KEY.C
#include "key.h"//代码来源网络 侵权联系删除
/*--------------------------------------------------------------------
|  short click                                                       |
|  ______                   ________                                 |
|     |  \                 /  |                                      |
|     |   \_______________/   |                                      |
|     |     |           |     |                                      |
|     |shake|  < long   |shake|                                      |
|                                                                    |-------------------------------------------------------------------
|  double click                                                      |
|  ______                   _____________                   ____     |
|     |  \                 /  |       |  \                 /  |      |
|     |   \_______________/   |       |   \_______________/   |      |
|     |     |           |     | < max |     |           |     |      |
|     |shake|  < long   |shake|dclick |shake|  any time |shake|      |
|                                                                    |--------------------------------------------------------------------
|  long click                                                        |
|  ______                                           ________         |
|     |  \                                         /  |              |
|     |   \_______________________________________/   |              |
|     |     |                                   |     |              |
|     |shake|             > long click          |shake|              |
|                                                                    |--------------------------------------------------------------------*/#define KEY_STATUS_DOWN_CHECK                0x00       
#define KEY_STATUS_DOWN_SHAKE                0x01
#define KEY_STATUS_DOWN_HANDLE               0x02
#define KEY_STATUS_LONG_CHECK                0x03
#define KEY_STATUS_SHORT_UP_SHAKE            0x04
#define KEY_STATUS_DOUBLE_CHECK              0x05
#define KEY_STATUS_SHORT_UP_HANDLE           0x06
#define KEY_STATUS_DOUBLE_DOWN_SHAKE         0x07
#define KEY_STATUS_DOUBLE_UP_CHECK           0x08
#define KEY_STATUS_DOUBLE_UP_SHAKE           0x09
#define KEY_STATUS_DOUBLE_UP_HANDLE          0x0a
#define KEY_STATUS_LONG_HANDLE               0x0b
#define KEY_STATUS_CONTINUE_CHECK            0x0c
#define KEY_STATUS_LONG_UP_SHAKE             0x0d
#define KEY_STATUS_LONG_UP_HANDLE            0x0e#define KEY_READ_DOWN                        0x00  /* key is pressed          */
#define KEY_READ_UP                          0x01  /* Key isn't pressed       */ #define KEY_BUF_SIZE                         0x10  /* key value buffer size   */struct
{unsigned short value[KEY_BUF_SIZE];unsigned char rd;unsigned char wr;
}key_buf;struct key_dev
{unsigned char status;              /* state machine status                */unsigned char num;                 /* number                              */unsigned short count_ms;           /* ms counter                          */unsigned short long_click_ms;      /* long click check min time           */unsigned short shake_filter_ms;    /* shake filter time                   */unsigned short max_dclick_ms;      /* double click max interval time      */unsigned short continue_send_ms;   /* after long, continue send interval  */unsigned char (*read_key)(void);   /* key read pin status function pointer*/
};/******************************************************************************User Interface [START]
*******************************************************************************/unsigned char key0_read(void)
{if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET){return KEY_READ_DOWN;}else{return KEY_READ_UP;}
}struct key_dev key_dev[] = {{KEY_STATUS_DOWN_CHECK,KEY0_NUM,0,1500,20,300,1000,(unsigned char (*)(void))key0_read,},/*..user add other key ..*/};/******************************************************************************User Interface [END]
*******************************************************************************/static void key_write_value(unsigned short key_val);
static void key_status_down_check(struct key_dev *key_dev);
static void key_status_down_shake(struct key_dev *key_dev);
static void key_status_down_handle(struct key_dev *key_dev);
static void key_status_long_check(struct key_dev *key_dev);
static void key_status_short_up_shake(struct key_dev *key_dev);
static void key_status_double_check(struct key_dev *key_dev);
static void key_status_short_up_handle(struct key_dev *key_dev);
static void key_status_double_down_shake(struct key_dev *key_dev);
static void key_status_double_up_check(struct key_dev *key_dev);
static void key_status_double_up_shake(struct key_dev *key_dev);
static void key_status_double_up_handle(struct key_dev *key_dev);
static void key_status_long_hanle(struct key_dev *key_dev);
static void key_status_continue_check(struct key_dev *key_dev);
static void key_status_long_up_shake(struct key_dev *key_dev);
static void key_status_long_up_handle(struct key_dev *key_dev);/**
description : write key vaule to buffer
param :  key_val - key value , (KEY_EVENT | KEY_NUMBER<<8) 
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_write_value(unsigned short key_val)
{   key_buf.value[key_buf.wr++] = key_val;key_buf.wr %= KEY_BUF_SIZE;/*overflow handle*/if(key_buf.wr == key_buf.rd){key_buf.rd++;key_buf.rd %= KEY_BUF_SIZE;}
}/**
description : read key vaule from buffer
param : None
retval : key_val - key value , (KEY_EVENT | KEY_NUMBER<<8)
author : huohongpeng
data : 2017-03-02
*/
unsigned short key_read_value(void)
{unsigned short key_val;if(key_buf.wr == key_buf.rd){key_val = KEY_EVENT_NULL;}else{key_val = key_buf.value[key_buf.rd++];key_buf.rd %= KEY_BUF_SIZE;}return key_val;
}/**
description : check key whether press down
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_down_check(struct key_dev *key_dev)
{unsigned char key_read;key_read = key_dev->read_key();if(key_read == KEY_READ_DOWN){key_dev->status = KEY_STATUS_DOWN_SHAKE;key_dev->count_ms = 0;}
}/**
description : filter shake after key pressed down
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_down_shake(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_DOWN){key_dev->status = KEY_STATUS_DOWN_HANDLE;}else{key_dev->status = KEY_STATUS_DOWN_CHECK;}
}/**
description : key press down handle after pressed down filter shake  
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_down_handle(struct key_dev *key_dev)
{unsigned short key_val = key_dev->num<<8 | KEY_EVENT_DOWN;key_write_value(key_val);key_dev->status = KEY_STATUS_LONG_CHECK;key_dev->count_ms = 0;}/**
description : check key whether long click   
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_check(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;key_read = key_dev->read_key();if(key_dev->count_ms < key_dev->long_click_ms){if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_SHORT_UP_SHAKE;                 }return;}key_dev->status = KEY_STATUS_LONG_HANDLE;            }/**
description : short cilck key up filter shake   
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_short_up_shake(struct key_dev *key_dev)
{unsigned char key_read;static unsigned short old = 0xffff;if(old == 0xffff){old = key_dev->count_ms;key_dev->count_ms = 0;}key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_DOUBLE_CHECK;key_dev->count_ms = 0;}else{key_dev->status = KEY_STATUS_LONG_CHECK;key_dev->count_ms += old;        }old = 0xffff;
}/**
description : double cilck check. we consider double click event if key pressed down when after short click up and within max double click interval
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_check(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;key_read = key_dev->read_key();if(key_dev->count_ms < key_dev->max_dclick_ms){if(key_read == KEY_READ_DOWN){key_dev->status = KEY_STATUS_DOUBLE_DOWN_SHAKE;key_dev->count_ms = 0;                 }}else{key_dev->status = KEY_STATUS_SHORT_UP_HANDLE;            }}/**
description : short click key up handle
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_short_up_handle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_SHORT;key_write_value(key_val);key_val= key_dev->num<<8 | KEY_EVENT_UP_SHORT;key_write_value(key_val);key_dev->status = KEY_STATUS_DOWN_CHECK;
}/**
description : double click key down filter shake
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_down_shake(struct key_dev *key_dev)
{unsigned char key_read;static unsigned short old = 0xffff;if(old == 0xffff){old = key_dev->count_ms;key_dev->count_ms = 0;}key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_DOWN){unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_DOUBLE;key_write_value(key_val);key_dev->status = KEY_STATUS_DOUBLE_UP_CHECK;key_dev->count_ms = 0;}else{key_dev->status = KEY_STATUS_DOUBLE_CHECK;key_dev->count_ms += old;        }old = 0xffff;
}/**
description : double click key up check
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_up_check(struct key_dev *key_dev)
{unsigned char key_read;key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_DOUBLE_UP_SHAKE;key_dev->count_ms = 0;}
}/**
description : double click key up filter shake
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_up_shake(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_DOUBLE_UP_HANDLE;}else{key_dev->status = KEY_STATUS_DOUBLE_UP_CHECK;}}/**
description : double click key up handle
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_up_handle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_UP_DOUBLE;key_write_value(key_val);key_dev->status = KEY_STATUS_DOWN_CHECK;
}/**
description : long click handle after long click check
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_hanle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_LONG;key_write_value(key_val);key_dev->status = KEY_STATUS_CONTINUE_CHECK;key_dev->count_ms = 0;
}/**
description : continue send short click if long click time overflow
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_continue_check(struct key_dev *key_dev)
{unsigned char key_read;unsigned short key_val;key_dev->count_ms++;key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_LONG_UP_SHAKE;}if(key_dev->count_ms < key_dev->continue_send_ms){return;}if(key_dev->continue_send_ms == 0){return;}key_val= key_dev->num<<8 | KEY_EVENT_SHORT;key_write_value(key_val);key_dev->count_ms = 0;
}/**
description : long click key up filter shake
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_up_shake(struct key_dev *key_dev)
{unsigned char key_read;static unsigned short old = 0xffff;if(old == 0xffff){old = key_dev->count_ms;key_dev->count_ms = 0;}key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_LONG_UP_HANDLE;}else{key_dev->status = KEY_STATUS_CONTINUE_CHECK;key_dev->count_ms += old;      }old = 0xffff;
}/**
description : long click key up filter handle
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_up_handle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_UP_LONG;key_write_value(key_val);key_dev->status = KEY_STATUS_DOWN_CHECK;
}/**
description : run key state machine once every 1ms
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_check_1ms(struct key_dev *key_dev)
{switch(key_dev->status){case KEY_STATUS_DOWN_CHECK :key_status_down_check(key_dev);break;      case KEY_STATUS_DOWN_SHAKE : key_status_down_shake(key_dev);break;           case KEY_STATUS_DOWN_HANDLE : key_status_down_handle(key_dev);break;          case KEY_STATUS_LONG_CHECK : key_status_long_check(key_dev);break;              case KEY_STATUS_SHORT_UP_SHAKE :  key_status_short_up_shake(key_dev);break;case KEY_STATUS_DOUBLE_CHECK :key_status_double_check(key_dev);break;case KEY_STATUS_SHORT_UP_HANDLE :key_status_short_up_handle(key_dev);break;case KEY_STATUS_DOUBLE_DOWN_SHAKE : key_status_double_down_shake(key_dev);break;case KEY_STATUS_DOUBLE_UP_CHECK :key_status_double_up_check(key_dev);break;case KEY_STATUS_DOUBLE_UP_SHAKE :key_status_double_up_shake(key_dev);break;case KEY_STATUS_DOUBLE_UP_HANDLE :key_status_double_up_handle(key_dev);break;         case KEY_STATUS_LONG_HANDLE :key_status_long_hanle(key_dev);break;case KEY_STATUS_CONTINUE_CHECK : key_status_continue_check(key_dev);break;case KEY_STATUS_LONG_UP_SHAKE : key_status_long_up_shake(key_dev);break;case KEY_STATUS_LONG_UP_HANDLE :  key_status_long_up_handle(key_dev);break;default:key_dev->status = key_dev->status;}
}/**
description : run all key state machine once every 1ms
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
call :timer(1ms) interrupt handle 
*/
void key_check_all_loop_1ms(void)
{unsigned char key_num, i;key_num = sizeof(key_dev)/sizeof(struct key_dev);for(i = 0; i < key_num; i++){key_check_1ms(&key_dev[i]);}}
  • 📄KEY.h
#ifndef __key_H
#define __key_H#ifdef __cplusplusextern "C" {
#endif #include "main.h"#define shortmaxclickms (300)
#define shortminclickms (10)
#define longclickms (800)#define KEY_EVENT_NULL                     0x0000  
#define KEY_EVENT_DOWN                     0x0001
#define KEY_EVENT_UP_SHORT                 0x0002  // 短按后松开事件
#define KEY_EVENT_UP_LONG                  0x0003  // 长按后松开事件
#define KEY_EVENT_UP_DOUBLE                0x0004  // 双击后松开事件
#define KEY_EVENT_SHORT                    0x0005
#define KEY_EVENT_LONG                     0x0006
#define KEY_EVENT_DOUBLE                   0x0007#define KEY_READ_DOWN                        0x00  /* key is pressed          */
#define KEY_READ_UP                          0x01  /* Key isn't pressed       */ /******************************************************************************User Interface [START]
*******************************************************************************/#define KEY0_NUM                           0x0001#define KEY0_DOWN               (KEY_EVENT_DOWN      | KEY0_NUM<<8)
#define KEY0_UP_SHORT           (KEY_EVENT_UP_SHORT  | KEY0_NUM<<8)
#define KEY0_UP_LONG            (KEY_EVENT_UP_LONG   | KEY0_NUM<<8)
#define KEY0_UP_DOUBLE          (KEY_EVENT_UP_DOUBLE | KEY0_NUM<<8)
#define KEY0_SHORT              (KEY_EVENT_SHORT     | KEY0_NUM<<8)
#define KEY0_LONG               (KEY_EVENT_LONG      | KEY0_NUM<<8) 
#define KEY0_DOUBLE             (KEY_EVENT_DOUBLE    | KEY0_NUM<<8)/******************************************************************************User Interface [END]
*******************************************************************************/void key_check_all_loop_1ms(void);
unsigned short key_read_value(void);#ifdef __cplusplus
}
#endif#endif

🔱main函数中按键处理内容

#include "stdio.h"
#include "key.h"
int32_t test_num = 0;//支持正负数值增减
uint8_t dir_flag = 2; /*  方向标志 0: 顺时 1: 逆时 2: 未动*/
uint8_t key_click_flag = 0;//EC11 中键unsigned short key_value;int main(void)
{/* USER CODE BEGIN 1 */uint32_t tick2, tick3;/* 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();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */uint32_t Main_Fosc = HAL_RCC_GetSysClockFreq();printf("Main_Fosc:%dHz \r\n", Main_Fosc);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(dir_flag != 2) {switch(dir_flag) {case 0:printf("顺时针转动\r\n");break;case 1:printf("逆时针转动\r\n");break;}dir_flag = 2;printf("num: %d\n", test_num);}if(HAL_GetTick() - tick2 >= 1) {tick2 = HAL_GetTick();key_check_all_loop_1ms();}/* Key按键按下查询 */if(HAL_GetTick() - tick3 >= 10) {tick3 = HAL_GetTick();key_value = key_read_value();if(key_value == KEY0_UP_SHORT) {	//单击事件HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);// 实现单击KEYtest_num++;printf("Press 单击,num:%d\r\n", test_num);} else if(key_value == KEY0_UP_DOUBLE) {	//双击事件HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);test_num += 2;printf("\r\nDouble Press 双击,num:%d\r\n", test_num);} else if(key_value == KEY0_LONG) {	//长按事件printf("\r\nLong Press 长按\r\n");// 实现长按KEYtest_num = 0;//清除编码器计数值printf("按键计数清零,num:%d\r\n", test_num);}}}/* USER CODE END 3 */
}

📚工程源码

链接:https://pan.baidu.com/s/1zTMkY8iEGSCu_gSavR_I3A?pwd=4m2q 
提取码:4m2q

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

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

相关文章

Linux之快速入门(CentOS 7)

文章目录 一、Linux目录结构二、常用命令2.1 切换用户2.2查看ip地址2.3 cd2.4 目录查看2.5 查看文件内容2.6 创建目录及文件2.7 复制和移动2.8 其他2.9 tar3.0 which3.1 whereis3.2 find&#xff08;这个命令尽量在少量用户使用此软件时运行&#xff0c;因为此命令是真的读磁盘…

计数排序(六)——计数排序及排序总结

目录 一.前言 二.归并小补充 三.计数排序 操作步骤&#xff1a; 代码部分&#xff1a; 四.稳定性的概念&#xff1a; 五.排序大总结&#xff1a; ​六.结语 一.前言 我们已经进入排序的尾篇了&#xff0c;本篇主要讲述计数排序以及汇总各类排序的特点。码字不易&#x…

【JavaScript 漫游】【002】JS 的数据类型总览

文章简介 本文为【JavaScript 漫游】专栏的第 002 篇文章&#xff0c;主要记录了笔者学习 JS 数据类型中所了解的基本知识点。 ES5 的数据类型有哪些如何区分 ES5 的数据类型null 和 undefined 的相同点和不同点布尔值的转换规则parseInt 和 parseFloat 的基本用法 作为 JS …

使用plotly dash 画3d圆柱(Python)

plotly3D &#xff08;3d charts in Python&#xff09;可以画3维图形 在做圆柱的3D装箱项目&#xff0c;需要装箱的可视化&#xff0c;但是Mesh &#xff08;3d mesh plots in Python&#xff09;只能画三角形&#xff0c;所以需要用多个三角形拼成一个圆柱&#xff08;想做立…

网站小程序分类目录网源码系统+会员注册登录功能 附带完整的搭建教程

随着互联网的发展&#xff0c;小程序分类目录网站已经成为了人们获取各类信息的重要渠道。而在这个领域中&#xff0c;罗峰给大家分享一款网站小程序分类目录网源码系统以其强大的功能和易用性&#xff0c;脱颖而出。本系统集成了会员注册登录功能&#xff0c;让用户能够更加便…

【git】git update-index --assume-unchanged(不改动.gitignore实现忽略文件)

文章目录 原因分析&#xff1a;添加忽略文件(取消跟踪)的命令&#xff1a;取消忽略文件(恢复跟踪)的命令&#xff1a;查看已经添加了忽略文件(取消跟踪)的命令&#xff1a; 原因分析&#xff1a; 已经维护的项目&#xff0c;文件已经被追踪&#xff0c;gitignore文件不方便修…

Layui + Echarts 5.0

Layui 怎么整合最新版本的 Echarts 5.0&#xff0c;Echarts 4 升级到 5后&#xff0c;有了很大改变&#xff0c;新的配置项4是无法兼容的&#xff0c;所以想要使用新的功能&#xff0c;都需要升级&#xff01; 新建一个echarts.js文件 layui.define(function (exports) {// 这…

Optional lab: Linear Regression using Scikit-LearnⅠ

scikit-learn是一个开源的、可用于商业的机器学习工具包&#xff0c;此工具包包含本课程中需要使用的许多算法的实现 Goals In this lab you will utilize scikit-learn to implement linear regression using Gradient Descent Tools You will utilize functions from sci…

微服务技术总结

微服务&#xff01; SrpingClound 微服务主要解决项目拆分后所产生的一系列问题。SpringClound主要解决服务的治理问题 单体VS分布式 单体&#xff1a;部署简单、成本低 缺点&#xff1a;服务耦合度高 2兼容1 服务拆分注意事项 远程调用分析 提供者&#xff1a;服务的提供方…

QT 使用XML保存操作记录

文章目录 1 实现程序保存操作记录的思路2 XML文档基本结构3 QDomDocument实现XML读写3.1 QDomDocument实现生成XML文件3.2 QDomDocument实现读取XML文件 4 QXmlStreamWriter实现读写4.1 QXmlStreamWriter实现生成XML4.2 QXmlStreamWriter实现读取XML 1 实现程序保存操作记录的思…

【大数据】Flink 架构(三):事件时间处理

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…

04.对象树

一、引入 1.QT实现输出"hello world" 使用QT编写"hello world"程序&#xff0c;有两种实现方式&#xff1a; &#xff08;1&#xff09;直接在生成的ui文件中&#xff0c;拖入一个label控件&#xff0c;双击控件编辑内容即可实现 &#xff08;2&#xff0…

【CSS】flex布局用法解析,快速上手flex布局,flex:1是什么意思?肯定看的懂好吧?

一、flex布局 flex 是 flexible box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 flex 布局。 采用 flex 布局的元素&#xff0c;称为 flex 容器&#xff08;flex container&#xff09;&#xff0c;…

计算机视觉:高级图像处理,满足您的所有需求。

一、说明 特征提取是机器学习管道中的关键步骤&#xff0c;可增强模型在不同数据集上的泛化和良好表现能力。特征提取方法的选择取决于数据的特征和机器学习任务的具体要求。本文揭示图像处理的数学原理&#xff0c;实现增强的计算机视觉 二、关于计算机视觉的普遍问题 在计算机…

CSS基础细节学习

目录 一.CSS--网页的美容师 二.语法规范及选择器的介绍 一.CSS--网页的美容师 CSS是层叠样式表( Cascading Style Sheets )的简称&#xff0c;有时我们也会称之为CSS样式表或级联样式表。 CSS是也是一种标记语言&#xff0c;CSS主要用于设置HTML页面中的文本内容(字体、大小…

Linux:共享内存VS消息队列VS信号量

文章目录 共享内存的通信速度消息队列msggetmsgsndmsgrcvmsgctl 信号量semgetsemctl 内核看待ipc资源单独设计的模块ipc资源的维护 本篇主要是基于共享内存&#xff0c;延伸出对于消息队列和信号量&#xff0c;再从内核的角度去看这三个模块实现进程间通信 共享内存的通信速度…

2024 新年HTML5+Canvas制作3D烟花特效(附源码)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

RK3568 Android 13 系统裁剪

android 13 系统裁剪是个大工程&#xff0c;裁剪也是需要大量的测试&#xff0c;才能保证系统的稳定性&#xff0c;以下是RK官方给出的裁剪方案&#xff0c;有兴趣的可以去看一下&#xff0c;对裁剪不是要求过高的可以根据官方的建议&#xff0c;对系统进行裁剪: Rockchip And…

专科拿到季军:微茫星火,奋起直追!

Datawhale干货 作者&#xff1a;“不啻微茫”团队&#xff0c;季军方案 前 言 大家好&#xff0c;我们是 飞桨星河社区 X 智海Mo平台 AI 大模型创意应用大赛 获奖团队——"不啻微茫"&#xff0c;很荣幸能有机会与大家分享这次比赛经验&#xff0c;我们从零开始的过程…

【CanvasKeyFrames - HTML5 Canvas 图片序列帧播放工具】

前言 一、CanvasKeyFrames 是什么&#xff1f; 用来做canvas动画的工具。 二、使用步骤 效果如图&#xff1a;上下波动的线条 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; 在html中引入&#xff1a; <script src"canvas-keyframes.js"><…