当前位置: 首页 > news >正文

嵌入式51单片机04-矩阵按键系列

文章目录

    • 矩阵按键
      • 一、矩阵按键基础知识
      • 二、矩阵按键系列代码
        • 1. 矩阵按键操作(显示数字)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果
        • 2. 矩阵按键操作(控制数码管)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果
        • 3. 矩阵按键操作(电子密码锁)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果

矩阵按键

一、矩阵按键基础知识

  • 矩阵按键工作原理

    • 逐行扫描:通过高四位轮流输出低电平来对矩阵键盘进行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过判断低四位数据中哪一位为零来判断哪一个按键被按下。

    • 逐列扫描:通过低四位轮流输出低电平来对矩阵键盘进行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过判断高四位数据中哪一位为零来判断哪一个按键被按下。

    • 行列扫描:高四位全部输出低电平,低四位输出高电平。当接收到数据,低四位不全部为高电平时,说明有按键按下,然后通过接收的数据值,判断哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是哪一行有按键按下,这样就能确定是哪一个按键被按下。

  • 矩阵按键原理图
    在这里插入图片描述

  • LCD1602原理图
    在这里插入图片描述

二、矩阵按键系列代码

1. 矩阵按键操作(显示数字)

(1)仿真电路图

在这里插入图片描述

(2)源代码

LCD1602.c

#include <REGX52.H>
#include "LCD1602.h"//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line    行位置,范围:1~2* @param  Column  列位置,范围:1~16* @param  Char    要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endif

Delay.c

void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

MatrixKey.c

#include <REGX52.H>
#include "Delay.h"/*** @brief  矩阵键盘读取按键键码* @param  无* @retval KeyNumber 按下按键的键码值如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0*/
unsigned char MatrixKey()
{unsigned char KeyNumber=0;P1=0xFF;P1_3=0;if(P1_7==0){ Delay(20); while(P1_7==0); Delay(20); KeyNumber=1;}if(P1_6==0){ Delay(20); while(P1_6==0); Delay(20); KeyNumber=5;}if(P1_5==0){ Delay(20); while(P1_5==0); Delay(20); KeyNumber=9;}if(P1_4==0){ Delay(20); while(P1_4==0); Delay(20); KeyNumber=13;}P1=0xFF;P1_2=0;if(P1_7==0){ Delay(20); while(P1_7==0); Delay(20); KeyNumber=2;}if(P1_6==0){ Delay(20); while(P1_6==0); Delay(20); KeyNumber=6;}if(P1_5==0){ Delay(20); while(P1_5==0); Delay(20); KeyNumber=10;}if(P1_4==0){ Delay(20); while(P1_4==0); Delay(20); KeyNumber=14;}P1=0xFF;P1_1=0;if(P1_7==0){ Delay(20); while(P1_7==0); Delay(20); KeyNumber=3;}if(P1_6==0){ Delay(20); while(P1_6==0); Delay(20); KeyNumber=7;}if(P1_5==0){ Delay(20); while(P1_5==0); Delay(20); KeyNumber=11;}if(P1_4==0){ Delay(20); while(P1_4==0); Delay(20); KeyNumber=15;}P1=0xFF;P1_0=0;if(P1_7==0){ Delay(20); while(P1_7==0); Delay(20); KeyNumber=4;}if(P1_6==0){ Delay(20); while(P1_6==0); Delay(20); KeyNumber=8;}if(P1_5==0){ Delay(20); while(P1_5==0); Delay(20); KeyNumber=12;}if(P1_4==0){ Delay(20); while(P1_4==0); Delay(20); KeyNumber=16;}return KeyNumber;
}

MatrixKey.h

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "MatrixKey.h"unsigned char KeyNum;void main()
{LCD_Init();LCD_ShowString(1,5,"20230423");while(1){KeyNum = MatrixKey();if(KeyNum){LCD_ShowNum(2,1,KeyNum,2);}}
}
(3)实验结果

2. 矩阵按键操作(控制数码管)

(1)仿真电路图

在这里插入图片描述

(2)源代码

LCD1602.c :与上述同名文件相同

LCD1602.h :与上述同名文件相同

Delay.c: 与上述同名文件相同

Delay.h :与上述同名文件相同

MatrixKey.c: 与上述同名文件相同

MatrixKey.h :与上述同名文件相同

smg.c

#include "smg.h"
#include <REGX52.H>
#include "Delay.h"sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;unsigned int smgduan[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void smg_duan(unsigned char lsa,unsigned char lsb,unsigned char lsc)
{LSA = lsa;LSB = lsb;LSC = lsc;
}void DigDisplay()  
{unsigned int i;for(i = 0;i < 8;i++){switch(i)	 {case(0):LSA = 0; LSB = 0; LSC = 0; P3 = smgduan[9]; break;case(1):LSA = 1; LSB = 0; LSC = 0; P3 = smgduan[1]; break;case(2):LSA = 0; LSB = 1; LSC = 0; P3 = smgduan[4]; break;case(3):LSA = 1; LSB = 1; LSC = 0; P3 = smgduan[0]; break;case(4):LSA = 0; LSB = 0; LSC = 1; P3 = smgduan[3]; break;case(5):LSA = 1; LSB = 0; LSC = 1; P3 = smgduan[2]; break;case(6):LSA = 0; LSB = 1; LSC = 1; P3 = smgduan[0]; break;case(7):LSA = 1; LSB = 1; LSC = 1; P3 = smgduan[2]; break;}Delay(20); P3 = 0x00;}
}

smg.h

#ifndef __SMG_H__
#define __SMG_H__extern unsigned int smgduan[];void smg_duan(unsigned char lsa,unsigned char lsb,unsigned char lsc);
void DigDisplay(void);#endif

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "MatrixKey.h"
#include "smg.h"unsigned char KeyNum;void main()
{smg_duan(1,1,1);LCD_Init();LCD_ShowString(1,5,"20230423");while(1){KeyNum = MatrixKey();if(KeyNum){LCD_ShowNum(2,1,KeyNum,2);P3 = smgduan[KeyNum];}}
}
(3)实验结果

3. 矩阵按键操作(电子密码锁)

(1)仿真电路图

在这里插入图片描述

(2)源代码

LCD1602.c :与上述同名文件相同

LCD1602.h :与上述同名文件相同

Delay.c :与上述同名文件相同

Delay.h :与上述同名文件相同

MatrixKey.c :与上述同名文件相同

MatrixKey.h :与上述同名文件相同

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"unsigned char KeyNum;
unsigned int Password,Count;void main()
{LCD_Init();LCD_ShowString(1,1,"Password:");while(1){KeyNum=MatrixKey();if(KeyNum){if(KeyNum<=10)	//如果S1~S10按键按下,输入密码{if(Count<4)	//如果输入次数小于4{Password*=10;				//密码左移一位Password+=KeyNum%10;		//获取一位密码Count++;	//计次加一}LCD_ShowNum(2,1,Password,4);	//更新显示}if(KeyNum==11)	//如果S11按键按下,确认{if(Password==2345)	//如果密码等于正确密码{LCD_ShowString(1,14,"OK ");	//显示OKLCD_ShowString(2,1,"open 202352188" );Delay(3000);LCD_ShowString(2,1,"              " );}else				//否则{LCD_ShowString(1,14,"ERR");	//显示ERRDelay(2000);}LCD_ShowString(1,14,"   ");	Password=0;		//密码清零Count=0;		//计次清零LCD_ShowNum(2,1,Password,4);	//更新显示}if(KeyNum==12)	//如果S12按键按下,取消{Password=0;		//密码清零Count=0;		//计次清零LCD_ShowNum(2,1,Password,4);	//更新显示}}}
}
(3)实验结果

相关文章:

嵌入式51单片机04-矩阵按键系列

文章目录 矩阵按键一、矩阵按键基础知识二、矩阵按键系列代码1. 矩阵按键操作&#xff08;显示数字&#xff09;&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果 2. 矩阵按键操作&#xff08;控制数码管&#xff09;&am…...

某安全对抗行走APP逆向分析

1.定位url 抓包: https://api5.xxxx.com/xxx-rest-service/message/fun_getnearby 看一下参数: opentime:时间戳 reqdata:base64编码 sign 未知,需要解密 # -*- coding: utf-8 -*- # @Author : Codeooo # @Time : 2022-10-14import frida, sysm199a = "&qu…...

数据库基础篇 《11.数据处理之增删改》

目录 1. 插入数据 1.1 实际问题 1.2 方式1&#xff1a;VALUES的方式添加 1.3 方式2&#xff1a;将查询结果插入到表中 2. 更新数据 3. 删除数据 4. MySQL8新特性&#xff1a;计算列 5. 综合案例 6. 课后练习 练习1 练习2 1. 插入数据 1.1 实际问题 解决方式&#x…...

IDEA插件-MavenHapler

1.安装Maven Helper Maven Helper 是 IntelliJ IDEA 中的一个插件&#xff0c;可以帮助您管理 Maven 依赖项。它可以帮助您更容易地删除不再需要的依赖项&#xff0c;查看依赖项的冲突&#xff0c;以及执行其他有关 Maven 依赖项的操作。 打开 IDEA 设置页面&#xff1a; 在插…...

getaddrinfo调用crash 的debug过程

前两天&#xff0c;产线报一例crash问题。拿到core文件后&#xff0c;栈展开信息&#xff1a; (gdb) bt #0 0x00007f64a3651aff in raise () from /lib64/libc.so.6 #1 0x00007f64a3624ea5 in abort () from /lib64/libc.so.6 #2 0x00007f64a3694097 in __libc_message () …...

【Sql】sql语句练习随记

本文通过最经典的“学生-成绩-课程-教师”表来帮助练习sql语句。 STUDENT表 SNO 学号SNAME 姓名SSEX 性别SBIRTHDAY 生日CLASS 班级 SCORE表 SNO 学号CNO 课程编号DEGREE 分数 COURSE表 CNO 课程编号CNAME 课程名称TNO 教师编号 TEACHER表 TNO 教师编号TNAME 教师姓名TS…...

IDEA社区版搭建Tomcat服务器并创建web项目

IDEA社区版搭建Tomcat服务器并创建web项目 目标 创建Web项目的目录结构可以启动Tomcat服务器编写Servlet并访问成功 问题 IDEA社区版没有创建Web工程的选项IDEA社区版没有Tomcat插件 实现步骤 针对以上两个问题&#xff0c;分步解决 问题一&#xff1a;IDEA社区版没有创建…...

C++ [STL-简介]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT ​​​​​​​​ 文章目录 前言正文简介关于STL各种版本 STL组件容器迭代器配接器(适配器)算法仿函数空间配置器 STL的重要性学习STL的意义如何学习STL STL的缺陷 最后 前言 STL(standard tem…...

牛客前端编程语言错题2

【语法】 名为“ctx”的变量是某个HTML5画布对象的上下文。以下代码绘制的是什么&#xff08;&#xff09; Ctx.arc(x,y,r,0,Math.PI,true); 在给定点绘制一个矩形 从一个点到另一个点绘制一条直线 在给定点绘制一个半圆 在给定点绘制一个圆 链接&#xff1a;https://www.now…...

【C语言】基础语法3:控制流程结构

上一篇&#xff1a;运算符和表达式 下一篇&#xff1a;函数和递归 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家…...

MySQL安全性:防止攻击和保护数据

MySQL安全性&#xff1a;防止攻击和保护数据 MySQL是当今最流行的关系型数据库之一&#xff0c;然而&#xff0c;随着Internet的普及&#xff0c;数据库安全问题也越来越受到关注。在这篇文章中&#xff0c;我们将重点介绍MySQL的安全性问题&#xff0c;以及如何防止攻击和保护…...

R语言结构方程模型(SEM)

详情点击链接&#xff1a;R语言结构方程模型&#xff08;SEM&#xff09;生态学领域应用 一&#xff0c;R语言SEM分析入门&#xff1a;lavaan VS piecewiseSEM 结构方程模型在生态学研究中的应用及模型结构方模型估计方法&#xff1a;局域估计和全局估计的基本工作原理、主要…...

软件or硬件?硬件的前途到底在哪里?

一、硬件明明比软件更难&#xff0c;国内的硬件技术也不如软件&#xff0c;为什么硬件工程师待遇还不如软件&#xff1f; 1、不需要太高层次的硬件设计&#xff0c;比如大部分小家电企业&#xff0c;简单的电子产品企业&#xff0c;单片机简单外围设计就够了&#xff0c;单片机…...

同学在外包干了两年的点点点,24岁人就快废了

前言 简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快两年了我薪资、技术各个方面都有了很大的提升&#xff0c;他在外包干的这两年人都要废了&#xff0c;技术没一点提升&#xff0c;学不到任何东西&…...

基于Java springboot 疫情在线网课管理系统

博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 一、前言介绍1.1 背景及意义1.2 系统运行环境…...

Unity Camera -- (3)控制相机能看到的东西

使用剪裁平面&#xff08;Clipping Planes&#xff09;定义相机可视范围 Clipping Planes定义了相机所能看到的场景范围。在有些时候&#xff0c;限制相机所能看到的范围是出于风格上的考量&#xff0c;但编辑Clipping Planes的主要目的是为了优化性能。相机所需要渲染的东西越…...

《基于深度迁移学习的可穿戴睡眠阶段分类》阅读笔记

一、摘要 佩戴可穿戴设备进行睡眠监测是一种无创、便捷的方法&#xff0c;可以提高睡眠障碍筛查和健康监测的效率。然而&#xff0c;由于缺乏大规模、标准化的PPG数据集&#xff0c;使用PPG进行睡眠阶段分类仍然具有挑战性。本文提出了一种基于深度迁移学习的方法来解决这个问…...

java版工程管理系统源码企业工程项目管理系统简介

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

机器学习算法 决策树

文章目录 一、决策树的原理二、决策树的构建2.1 ID3算法构建决策树2.2 C4.5 算法树的构建2.3 CART 树的创建 三、决策树的优缺点 一、决策树的原理 决策树&#xff08;Decision Tree&#xff09;是一种非参数的有监督学习方法&#xff0c;它能够从一系列有特征和标签的数据中总…...

论文笔记:An Interactive-Voting Based Map Matching Algorithm

2010 MDM 1 ST-matching的问题 论文笔记&#xff1a;Map-Matching for low-sampling-rate GPS trajectories&#xff08;ST-matching&#xff09;_UQI-LIUWJ的博客-CSDN博客 当轨迹很长&#xff0c;且车辆通过多线平行的道路时&#xff0c;ST-Matching的效果较差&#xff0c…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...