普中51单片机:矩阵按键扫描与应用详解(五)

在这里插入图片描述

文章目录

  • 引言
  • 电路图
  • 开发板IO连接
  • 矩阵键盘的工作原理
    • 行列扫描
    • 逐行/逐列扫描
  • LCD1602代码库
  • 代码演示——暴力扫描
  • 代码演示——数码管(行列式)
  • 代码演示——线翻转法
  • 代码演示——LCD1602密码锁

引言

矩阵按键是一种通过行列交叉连接的按键阵列,可以有效地减少单片机I/O口的使用。常见的4x4矩阵键盘只需要8个I/O口即可读取16个按键的状态。采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。

电路图

在这里插入图片描述

开发板IO连接

请添加图片描述
根据图片可以看出,矩阵按键的连接在P1端口,下面是它的原理图。
在这里插入图片描述

注意:牵扯到数码管相连接的实物图,这里不做展示,可查看之前章节的数码管讲解:数码管讲解演示

矩阵键盘的工作原理

矩阵键盘通过行列扫描的方式来检测按键的状态。假设我们有一个4x4的矩阵键盘,它由4条行线和4条列线组成,总共可以检测16个按键。每个按键位于行线和列线的交叉点上。

行列扫描

行列扫描的基本步骤如下:

  1. 初始化:将所有行线设置为高电平,所有列线设置为低电平。
  2. 扫描行:逐行将行线设置为低电平,检测列线的状态。如果某一列线变为低电平,说明该行的某个按键被按下。(扫描列则反之)
  3. 确定列:将检测到的列线设置为高电平,逐列扫描,确定具体的按键位置。

逐行/逐列扫描

逐行/逐列扫描的本质与行列扫描类似,但适用于矩阵键盘接到了任意的I/O口。具体步骤如下:

  • 逐行扫描:将某一行设置为低电平,其余行和列设置为高电平,读取列线数据。
  • 逐列扫描:将某一列设置为低电平,其余行和列设置为高电平,读取行线数据。

LCD1602代码库

注意:LCD1602不过多讲解,后续会提供专门的章节。因为矩阵按键代码牵扯到LCD1602,根据源码可以看如何使用即可,也可以使用上一章的内容,使用数码管进行显示!

  • 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
  • LCD1602.c
#include <REGX52.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');}
}

代码演示——暴力扫描

这个程序初始化LCD显示屏并不断扫描4x4矩阵键盘。当按键被按下时,相应的键号会显示在LCD1602上。延迟函数确保按键消抖,以避免多次检测到单次按键。

扫描4x4矩阵键盘。它依次将每一列设置为低电平,并检查每一行是否有低电平信号,表示按键被按下。返回相应的键号。

#include <REGX52.H>
#include "LCD1602.h"void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}unsigned char MatrixKey()
{unsigned char keyNumber = 0;P1 = 0xff;P1_3 = 0;//第一列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 1;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 5;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 9;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 13;}P1 = 0xff;P1_2 = 0;//第二列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 2;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 6;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 10;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 14;}P1 = 0xff;P1_1 = 0;//第三列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 3;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 7;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 11;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 15;}P1 = 0xff;P1_0 = 0;//第四列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 4;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 8;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 12;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 16;}return keyNumber;
} void main()
{LCD_Init();LCD_ShowString(1,1,"helloword");while(1){unsigned char temp = MatrixKey();if(temp){LCD_ShowNum(2,1,temp,2);}}
}

代码演示——数码管(行列式)

程序初始化数码管并不断扫描4x4矩阵键盘。当按键被按下时,相应的键号会显示在数码管上。延迟函数确保按键消抖,以避免多次检测到单次按键。(9之后的数字显示的是字母A~E),数码管如何连接可参考此博客:数码管讲解演示

#include <REGX52.H>//共阴极数码管显示 0~F 的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}unsigned char MatrixRanksScan()
{unsigned char keyNum = 0;P1 = 0xf7;//第一列低电平if(P1 != 0xf7)//表示第一列有按键按下{DelayXms(1);//消抖处理switch(P1){case 0x77:keyNum = 1;break;case 0xb7:keyNum = 5;break;case 0xd7:keyNum = 9;break;case 0xe7:keyNum = 13;break;}}while(P1 != 0xf7);P1 = 0xfb;//第二列低电平if(P1 != 0xfb)//表示第一列有按键按下{DelayXms(1);//消抖处理switch(P1){case 0x7b:keyNum = 2;break;case 0xbb:keyNum = 6;break;case 0xdb:keyNum = 10;break;case 0xeb:keyNum = 14;break;}}while(P1 != 0xfb);P1 = 0xfd;//第三列低电平if(P1 != 0xfd)//表示第一列有按键按下{DelayXms(1);//消抖处理switch(P1){case 0x7d:keyNum = 3;break;case 0xbd:keyNum = 7;break;case 0xdd:keyNum = 11;break;case 0xeb:keyNum = 15;break;}}while(P1 != 0xfd);P1 = 0xfe;//第四列低电平if(P1 != 0xfe)//表示第一列有按键按下{DelayXms(1);//消抖处理switch(P1){case 0x7e:keyNum = 4;break;case 0xbe:keyNum = 8;break;case 0xde:keyNum = 12;break;case 0xee:keyNum = 16;break;}}while(P1 != 0xfe);return keyNum;
}void main()
{unsigned char temp = 0;P0 = ~gsmg_code[temp];while(1){temp = MatrixRanksScan();if(temp){P0 = ~gsmg_code[temp];}}
}

代码演示——线翻转法

线翻转法是一种用于矩阵键盘扫描的技术,特别适用于单片机控制的场景。它通过交替设置行和列的电平来检测按键的按下位置。扫描4x4矩阵键盘。它首先将列设置为低电平,并检查是否有按键按下。如果有按键按下,则进一步检查行,确定具体的按键位置,并返回相应的键值。

#include <REGX52.H>//共阴极数码管显示 0~F 的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}unsigned char MatrixFlipScan()
{unsigned char key_value = 0;	P1 = 0x0f;if(P1 != 0x0f)//列被按下{DelayXms(1);//消抖处理if(P1 != 0x0f){//测试列switch(P1){case 0x07://第一列有按键按下key_value = 1;break;case 0x0b://第二列有按键按下key_value = 2;break;case 0x0d://第三列有按键按下key_value = 3;break;case 0x0e://第四列有按键按下key_value = 4;break;	}//测试行P1 = 0xf0;switch(P1){case 0x70://第一行有按键按下key_value = key_value;break;case 0xb0://第二行有按键按下key_value = key_value+4;break;case 0xd0://第三行有按键按下key_value = key_value+8;break;case 0xe0://第四行有按键按下key_value = key_value+12;break;	}}}return key_value;
}void main()
{unsigned char temp = 0;P0 = ~gsmg_code[temp];while(1){temp = MatrixFlipScan();if(temp){P0 = ~gsmg_code[temp];}}
}

代码演示——LCD1602密码锁

这个程序初始化LCD显示屏并不断扫描4x4矩阵键盘。当按键被按下时,相应的键号会显示在LCD上。用户可以输入密码并进行验证,正确的密码会显示“OK PASS”,错误的密码会显示“ERR”。密码输入和验证,如果按下S1S10(键号110),则输入密码。如果按下S11(键号11),则确认密码是否正确。如果按下S12(键号12),则取消输入,重置密码。

#include <REGX52.H>
#include "LCD1602.h"void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}unsigned char MatrixKey()
{unsigned char keyNumber = 0;P1 = 0xff;P1_3 = 0;//第一列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 1;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 5;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 9;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 13;}P1 = 0xff;P1_2 = 0;//第二列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 2;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 6;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 10;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 14;}P1 = 0xff;P1_1 = 0;//第三列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 3;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 7;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 11;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 15;}P1 = 0xff;P1_0 = 0;//第四列低电平if(P1_7 == 0){DelayXms(1);while(P1_7 == 0);DelayXms(1);keyNumber = 4;}if(P1_6 == 0){DelayXms(1);while(P1_6 == 0);DelayXms(1);keyNumber = 8;}if(P1_5 == 0){DelayXms(1);while(P1_5 == 0);DelayXms(1);keyNumber = 12;}if(P1_4 == 0){DelayXms(1);while(P1_4 == 0);DelayXms(1);keyNumber = 16;}return keyNumber;
}void main()
{unsigned int password = 0;unsigned int countkey = 0;LCD_Init();LCD_ShowString(1,1,"Password:");while(1){unsigned char temp = MatrixKey();if(temp){if(temp<=10)//如果S1~S10按键按下,进行输入密码{if(countkey < 4){password*=10;password+=temp%10;//获取一位密码countkey++;		}LCD_ShowNum(2,1,password,4);//更新密码}if(temp == 11)//S11确认{if(password == 2345)//2345定义为正确密码{LCD_ShowString(1,14,"O K");LCD_ShowString(2,13,"PASS");}else{LCD_ShowString(1,14,"ERR");password = 0;//初始密码countkey = 0;//初始次数LCD_ShowNum(2,1,password,4);//更新密码}}if(temp == 12)//S12取消键{password = 0;//初始密码countkey = 0;//初始次数LCD_ShowNum(2,1,password,4);//更新密码	}}}
}

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

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

相关文章

计算机网络 - 万字长文

计算机网络 二、计算机网络2.1 七层模型表格2.2 通俗讲解七层模型2.3 TCP与UDP对比2.4 TCP 三次握手过程==为什么握手是三次,而不是两次或者四次?====三次握手可以携带数据吗?====TCP三次握手失败,服务端会如何处理?====什么是半连接队列?全连接====ISN(Initial Sequence…

基于单片机的太阳能热水器控制系统设计

随着我国经济水平的不断提高&#xff0c;民众对生活质量的追求也在不断进步&#xff0c;对于现代家庭而言&#xff0c;热水器成为了必备的生活电器。目前市面上的电器主要是电热水器、燃气热水器以及太阳能热水器。就能源节约性能而言&#xff0c;太阳能热水器占据了绝对优势&a…

Java | Leetcode Java题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution {public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth Math.min(ax2, bx2) -…

开源高效在线电子表格解决方案:Luckysheet

Luckysheet&#xff1a;体验幸运&#xff0c;掌握高效数据表格编辑&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Luckysheet 是一个功能强大、配置简单且完全开源的在线电子表格工具&#xff0c;它类似于我们熟知的 Excel&#xff0c;但更加灵活和易于集成。它是一…

windows环境下部署多个端口Tomcat服务和开机自启动设置保姆级教程

前言 本文主要介绍了 windows环境下&#xff0c;配置多个Tomcat设置不同端口启动服务。其实在思路上Linux上也是适用的&#xff0c;只是 Linux 上没有可视化客户端&#xff0c;会麻烦些&#xff0c;但总体的思路上是一样的。 注&#xff1a;文章中涉及些文字和图片是搬运了其他…

OpenGL3.3_C++_Windows(28)

Demo演示 demo 视差贴图 视差/高度/位移贴图&#xff08;黑--白&#xff09;&#xff1a;和法线贴图一样视差贴图能够极大提升表面细节&#xff0c;使之具有深度感。第一种思路&#xff08;置换顶点&#xff09;&#xff1a;对于一个quad &#xff0c;分成约1000个顶点&#x…

C语言 | Leetcode C语言题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth fmin(ax2, bx2) - fmax(ax1, bx1), overlapHei…

Visual Studio Code 教程 VsCode安装Live Server以服务形式打开html

搜索Live Server 插件,然后安装 选一个html文件&#xff0c;右键点击 Open with live server,然后就自动弹出来了

使用paddleOCR训练自己的数据集到ONNX推理

一、环境安装 1、安装paddlepaddle&#xff1b; https://www.paddlepaddle.org.cn/ 这里安装2.6.1的话使用onnx会出现swish算子报错的问题 python -m pip install paddlepaddle-gpu2.5.2 -i https://pypi.tuna.tsinghua.edu.cn/simple验证是否成功安装 python import paddl…

Mysql Workbench的使用

本篇内容&#xff1a;对Mysql Workbench的常规使用学习 一、知识储备 1. Workbench 可以做什么 是mysql数据库可视化管理的一款免费工具&#xff0c;除了平常的通过sql语句&#xff0c;进行创建数据库表、增删改查外&#xff0c;还可以利用其进行建模创建数据库表。通过创建…

人工智能的新时代:从模型到应用的转变

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Linux】记录一起网站劫持事件

故事很短&#xff0c;处理也简单。权当记录一下&#xff0c;各位安全大大们手下留情。 最近一位客户遇到官网被劫持的情况&#xff0c;想我们帮忙解决一下&#xff08;本来不关我们的事&#xff0c;毕竟情面在这…还是无偿地协助一下&#xff09;&#xff0c;经过三四轮“谦让…

Conda修改默认环境创建路径

conda安装好后默认将新建环境安装在C盘 修改.condarc 配置文件 注 : Windows操作系统创建的 .condarc 文件通常在 C:\Users\User_name 这个目录下&#xff1b; 注 : Linux操作系统创建的 .condarc 文件通常在/home/User_name 这个目录下。 在.condarc文件中添加以下内容 有…

SpringBoot整合MongoDB文档相关操作

文章目录 SpringBoot整合MongoDB文档操作添加文档查询文档更新文档删除文档 SpringBoot整合MongoDB 创建项目&#xff0c;添加依赖&#xff0c;配置连接 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-dat…

Python 数据容器的对比

五类数据容器 列表&#xff0c;元组&#xff0c;字符串&#xff0c;集合&#xff0c;字典 是否能下标索引 支持&#xff1a;列表&#xff0c;元组&#xff0c;字符串 不支持&#xff1a;集合&#xff0c;字典 是否能放重复元素 是&#xff1a;列表&#xff0c;元组&#…

遥感分类产品精度验证之TIF验证TIF

KKB_2020.tif KKB_2020_JRC.tif kkb.geojson 所用到的包&#xff1a;&#xff08;我嫌geopandas安装太麻烦colab做的。。 import rasterio import geopandas as gpd import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.metrics import c…

【零基础】学JS之APIS(基于黑马)

喝下这碗鸡汤 披盔戴甲,一路勇往直前! 1. 什么是事件 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 2. 什么是事件监听? 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 注…

如何用java语言开发一套数字化产科系统 数字化产科管理平台源码

如何用java语言开发一套数字化产科系统 数字化产科管理平台源码 要使用Java语言来开发一个数字化产科系统&#xff0c;你需要遵循一系列步骤&#xff0c;从环境搭建到系统设计与开发&#xff0c;再到测试与部署。 以下是一个大致的开发流程概览&#xff1a; 1. 环境搭建 Jav…

从Docker 网络看IaC

【引子】近来&#xff0c;老码农又一次有机会实施IaC 了&#xff0c; 但是环境有了新的变化&#xff0c;涵盖了云环境、虚拟机、K8S 以及Docker&#xff0c;而网络自动化则是IaC中的重要组成&#xff0c;温故知新&#xff0c;面向Docker 的网络是怎样的呢&#xff1f; Docker …

C++相关概念和易错语法(16)(list)

1.list易错点 &#xff08;1&#xff09;慎用list的sort&#xff0c;list的排序比vector慢得多&#xff0c;尽管两者时间复杂度一样&#xff0c;甚至不如先把list转为vector&#xff0c;用vector排完序后再转为list &#xff08;2&#xff09;splice是剪切链表&#xff0c;将…