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

02-51单片机数码管与矩阵键盘

一、数码管模块

1.数码管介绍

如图所示为一个数码管的结构图:

在这里插入图片描述

  • 说明:
    1. 数码管上下各有五个引脚,其中上下中间的两个引脚是联通的,一般为数码管的公共端,分为共阴极或共阳极;
    2. 其它八个引脚分别对应八个二极管,从 a ~ g 包括右下角的点,每个二极管与就近的引脚一一对应。

2.单片机数码管电路图

2.1数码管电路图

在这里插入图片描述

  • 说明:
    1. 如图所示的电路图,可以看到使用的是两个四位一体的共阴极数码管,八个数码管的段选全部并联一起引出,每个数码管一个位选公共端;
    2. 在通过数码管显示数字的时候,先要确定通过哪个数码管显示数字,将其公共端赋为 0 ,其它数码管公共端赋为 1 ,即为共阴极。然后将指定段 0 ~ 7 赋值 0(熄灭) 1(点亮),以此显示相应的数字;

2.2 74HC138译码器

  • 为了节约 MCU 的 IO 口,这里用到了译码器:

在这里插入图片描述

  • 说明:
    1. 这是一个三通道输入,八通道输出的译码器,其中 P22 - P24 是对应的单片机上的 I/O 口,一共三个;
    2. Y0 - Y7 对应的是 LED1 - LED8 八个数码管的公共端,字母上面都有一个横线,低电平有效,因此可以推测这里的数码管共阴极。计算机里三位二进制对应一位八进制,三位二进制范围:000 ~ 111,转换为八进制就是 0 ~ 7,正好 8 个数字,对应八个数码管公共端,这样既可以实现通过三个引脚,控制八个数码管公共端信号了;
    3. G1、G2A、G2B和 GND 为使能端,字母上面有横线的默认是低电平有效。

2.3 74HC245驱动芯片

在这里插入图片描述

  • 说明
    1. 74HC245 是一种三态输出、八路信号收发器,主要应用于大屏显示,以及其它的消费类电子产品中增加驱动;
    2. 它具有双向输出功能,即 DIR 方向控制,当 DIR=1 时,由 A 到 B,等于 0 时,由 B 到 A,因为这里是给数码管供电,即 A 为输入端,B为输出端,因此直接将 DIR 接 VCC,输出使能 OE 接 GND。

3.数码管实验

3.1指定数码管显示指定数值

  • 代码演示
#include <REGX52.H>// 定义一个数组,存放0~9的数值编码
unsigned char Nums[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char LEDNum, ShowNum)
{// 选择点亮哪个LEDswitch(LEDNum){case 1:P2_4=0;P2_3=0;P2_2=0;break;case 2:P2_4=0;P2_3=0;P2_2=1;break;case 3:P2_4=0;P2_3=1;P2_2=0;break;case 4:P2_4=0;P2_3=1;P2_2=1;break;case 5:P2_4=1;P2_3=0;P2_2=0;break;case 6:P2_4=1;P2_3=0;P2_2=1;break;case 7:P2_4=1;P2_3=1;P2_2=0;break;case 8:P2_4=1;P2_3=1;P2_2=1;break;}P0 = Nums[ShowNum];
}void main()
{Nixie(7, 4);while(1);
}
  • 说明:
    1. 上面演示的结果:使用 LED7 显示数字4,可以指定使用哪个数码管显示指定数值;
    2. 将 0 ~ 9数字的段码数据存放到一个数组中,函数调用时传入对应的数字的下标索引,取出要显示数字的段码数据。断码数据对照数码管电路图计算,a ~ dp 分别对应八位二进制的低位到高位,想让数码管哪个 LED 亮,就将对应二进制位赋 1 就行;
    3. 通过 switch 语句确定要使用哪一个数码管显示数字。

3.2数码管动态显示

  • 代码演示
#include <REGX52.H>
#include <INTRINS.H>// 定义一个数组,存放0~9的数值编码
unsigned char Nums[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Delayxms(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void Nixie(unsigned char LEDNum, ShowNum)
{// 选择点亮哪个LEDswitch(LEDNum){case 1:P2_4=0;P2_3=0;P2_2=0;break;case 2:P2_4=0;P2_3=0;P2_2=1;break;case 3:P2_4=0;P2_3=1;P2_2=0;break;case 4:P2_4=0;P2_3=1;P2_2=1;break;case 5:P2_4=1;P2_3=0;P2_2=0;break;case 6:P2_4=1;P2_3=0;P2_2=1;break;case 7:P2_4=1;P2_3=1;P2_2=0;break;case 8:P2_4=1;P2_3=1;P2_2=1;break;}P0 = Nums[ShowNum];// 用于消影Delayxms(1);P0=0x00;
}void main()
{while(1){Nixie(8, 1);// Delayxms(20);Nixie(7, 2);// Delayxms(20);Nixie(6, 3);// Delayxms(20);}
}
  • 说明:
    1. 代码演示结果,在 LED8 LED7 LED6 分别显示连续数字 123;
    2. 这里只不过在 while 循环里不断调用函数,在三个数码管快速切换显示数字,利用人眼的余晖效应,类似于多进程的并发。人眼反应不过来,因此看起来是显示了一个连续的数字,实际上是在三个数码管之间快速切换显示;
    3. 显示过程中会有一个问题,就是调用函数的时候,先位选再段选,接着执行下一个函数,调用时也是先位选再段选,但是由于切换太快,切换到下一个位选的时候,下一个段选还没执行到,结果执行了上一个的段选,就导致显示的数值有重影,需要进行消影;
    4. 消影就在每次函数执行的最后,将该位段的段码数据全部置 0 ;
    5. 上面的实现原理是通过单片机的快速扫描实现的,比较消耗单片机的 CPU 资源。

二、LCD1602调试工具

1.LCD1602介绍

在这里插入图片描述

这里就是一个微型的显示屏,规格为 2 × 16 ,可以显示两行,每行最多显示 16 个字符。

我们在编写C语言代码的时候,会经常用到 printf 第三方库函数,将运行的结果打印到终端屏幕上,以进行相关的调试工作。在使用单片机的时候,我们也需要查看调试信息,就可以通过这样一块屏幕,然后写好想要的功能函数,通过头文件包含调用,达到输出显示的效果。

2.LCD1602 + 模块化编程

2.1延时函数模块化

模块化编程属于C语言阶段的基础,我在C语言里面有一篇博客专门讲了多文件编程,也就是模块化编程。

  • Delay.c(这里的文件名自己随便取,但需要见名知意)
#include <INTRINS.H>void Delayxms(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}
  • Delay.h(头文件名最好与功能文件名相同,只是后缀不相同)
#ifndef __DELAY_H__
#define __DELAY_H__void Delayxms(unsigned int xms);#endif

2.2第三方函数介绍

本笔记是基于B站江科大51单片机视频学习,LCD1602具体的用法还未学习,因此使用江科大提供的模块化功能函数来实现,具体文件的获取,在江科大的网址。

获取文件后,直接将一个.c文件和一个头文件拷贝到和当前项目 main 文件同级目录下,在 main 文件里面包含头文件即可使用。

  • 函数介绍
函数作用
LCD_Init();初始化
LCD_ShowChar(1,1,‘A’);显示一个字符(行数,列数,显示的字符)
LCD_ShowString(1,3,“Hello”);显示字符串(行数,列数,显示的字符串)
LCD_ShowNum(1,9,123,3);显示无符号十进制数字(行数,列数,显示的数值,数值位数)
LCD_ShowSignedNum(1,13,-66,2);显示有符号十进制数字(行数,列数,显示的数值,数值位数)
LCD_ShowHexNum(2,1,0xA8,2);显示十六进制数字(行数,列数,显示的数值,数值位数)
LCD_ShowBinNum(2,4,0xAA,8);显示二进制数字(行数,列数,显示的数值,数值位数)

2.3LCD1602函数演示

  • 代码演示
#include "Delay.h"
#include "LCD1602.h"void main()
{unsigned int num = 0; // 局部变量的定义要放在函数第一行// 记得初始化LCD_Init();
//	LCD_ShowChar(1,1,'A'); // 打印字符 A
//	LCD_ShowString(1,1,"hello world!"); // 打印字符串 hello world!
//	LCD_ShowNum(1,1,123,3); // 打印数值 123
//	LCD_ShowSignedNum(1,1,-66,2); // 打印数值 -66
//	LCD_ShowHexNum(1,1,0xA8,2); // 打印十六进制数 A8
//	LCD_ShowBinNum(1,1,0xAA,8); // 打印二进制数 1010 1010// 显示数值以秒递增while(num < 1000){LCD_ShowNum(1,1,num,3);Delayxms(1000);num++;}while(1);
}
  • 说明:
    1. 上面分别调试了一下,LCD1602相应的函数;
    2. 后面做了一个计时器,从0开始以秒为单位递增到最大 999。

三、矩阵键盘

1.矩阵键盘介绍

1.1矩阵键盘实物介绍

在这里插入图片描述

  • 介绍:
    1. 如图所示,为一个 4×4 的矩阵键盘,可以通过8个 I/O 口控制16个按键;
    2. 一个独立按键,就需要分配一个 I/O 口,但如果按键很多时,还这样分配,比较浪费资源,因此将按键按照行列分布,这样只需要使用行数 + 列数个 I/O 口就可以操作多个按键;
    3. 矩阵键盘获取按键状态的原理和独立按键一样,即将公共端设为低电平,I/O 口读到数据为 0 代表按下,为 1 代表松开。

1.2矩阵键盘电路图

在这里插入图片描述

  • 说明:
    1. 矩阵键盘原理图如图所示,可以看到,这里将16个按键,通过8个 I/O 口控制;
    2. 单独看第一行,就和前面学习的独立按键一样,P17 为公共端,将公共端设置低电平,P10 - P13 就相当于段选端,控制S1 - S4四个按键,谁传回 I/O 的数据为 0 ,就能判断谁按下了。然后,去逐行扫描,就能分别读取每个按键的状态,因为扫描速度非常块,因此我们人在操作的过程中感觉每个按键都是实时判断的一样,本质上是同一时间只能判断一行或者一列;
    3. 上面将每行作为公共端,也可以将每列作为公共端,因此就分为行刷新和列刷新两种方式,为了防止 I/O 口干扰其它模块,这里选择使用列刷新的方式进行实验。

2.矩阵键盘 + LCD1602案例

2.1按下按键显示数值

这里采用模块化编程,各个文件的代码演示如下:

  • MatrixKey.c
#include <REGX52.H>
#include "Delay.h"unsigned char MatrixKey()
{// 定义变量,用于保存按下按键对应的数值unsigned char num=0;// 将公共端初始化,全部置于高电平P1=0xFF;P1_3=0; // 将当前要扫描的列公共端置于低电平if(P1_7==0){Delayxms(20);while(P1_7==0);Delayxms(20);num=1;}if(P1_6==0){Delayxms(20);while(P1_6==0);Delayxms(20);num=5;}if(P1_5==0){Delayxms(20);while(P1_5==0);Delayxms(20);num=9;}if(P1_4==0){Delayxms(20);while(P1_4==0);Delayxms(20);num=13;}P1=0xFF;P1_2=0;if(P1_7==0){Delayxms(20);while(P1_7==0);Delayxms(20);num=2;}if(P1_6==0){Delayxms(20);while(P1_6==0);Delayxms(20);num=6;}if(P1_5==0){Delayxms(20);while(P1_5==0);Delayxms(20);num=10;}if(P1_4==0){Delayxms(20);while(P1_4==0);Delayxms(20);num=14;}P1=0xFF;P1_1=0;if(P1_7==0){Delayxms(20);while(P1_7==0);Delayxms(20);num=3;}if(P1_6==0){Delayxms(20);while(P1_6==0);Delayxms(20);num=7;}if(P1_5==0){Delayxms(20);while(P1_5==0);Delayxms(20);num=11;}if(P1_4==0){Delayxms(20);while(P1_4==0);Delayxms(20);num=15;}P1=0xFF;P1_0=0;if(P1_7==0){Delayxms(20);while(P1_7==0);Delayxms(20);num=4;}if(P1_6==0){Delayxms(20);while(P1_6==0);Delayxms(20);num=8;}if(P1_5==0){Delayxms(20);while(P1_5==0);Delayxms(20);num=12;}if(P1_4==0){Delayxms(20);while(P1_4==0);Delayxms(20);num=16;}// 将结果返回return num;
}
  • MatrixKey.h
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif
  • main.c
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"void main()
{	// 51单片机里局部变量必须放在函数的首行unsigned char KeyNum=0;LCD_Init();LCD_ShowString(1, 1, "MatrixKey");while(1){KeyNum=MatrixKey();// 加判断是为了防止被 0 刷新掉。显示不出来if(KeyNum){LCD_ShowNum(2, 1, KeyNum, 2);}}
}
  • 说明:
    1. 上面代码演示效果为:按下矩阵键盘的按键,在LCD1602屏幕上显示对应的数值,如:按下 S12 会在键盘上显示12;
    2. 这里采用的是列刷新的方式,即将 P10 - P13 作为每一列的公共端,先将公共端整体初始化为高电平,然后将当前要扫描的列的公共端置低电平,去判断这一列的四个按键的回馈信号是 0 还是 1 ,为 0 则将变量 num 赋值为按键对应的数值,然后将结果作为函数返回值返回即可,如果没有按键按下,返回的就是默认值0。再继续去扫描下一列,如此循环;
    3. 主函数里只需要不停调用矩阵键盘扫描函数即可,如果函数返回值为 0 ,不调用函数显示,如果非 0 ,则调用函数显示。加 if 判断的原因就是防止结果被 0 刷新,因为程序执行很快,这边刚获取返回值,刚打印到屏幕,函数又执行了几遍,返回 0 ,将 0 赋值给了 KeyNum ,打印 KeyNum 的值,这样上一次运行的结果还没看清,就被 0 刷新了。

2.2矩阵键盘密码锁

  • 代码演示
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"unsigned char KeyNum; // 获取键盘数值
unsigned int Password, count; // 存储密码,count用于计算输入数值个数void main()
{	LCD_Init();LCD_ShowString(1, 1, "Password:");while(1){KeyNum=MatrixKey();// 如果键盘扫描的返回值非 0 才执行相应的代码if(KeyNum){if(KeyNum<=10){if(count<4){Password*=10;Password+=(KeyNum%10);}count++;LCD_ShowNum(1, 10, Password, 4);}if(KeyNum==11){if(Password==1234){// 字符串后面的空格是防止上一次结果的干扰,因此通过空格刷新掉LCD_ShowString(2, 1, "Hello Boss!!!   ");Password=0;count=0;LCD_ShowNum(1, 10, Password, 4);}else{LCD_ShowString(2, 1, "Password Error! ");Password=0;count=0;LCD_ShowNum(1, 10, Password, 4);}}if(KeyNum==12){Password=0;count=0;LCD_ShowNum(1, 10, Password, 4);// 16个空格,将提示栏全部刷新为空LCD_ShowString(2, 1, "                ");}}}
}
  • 说明:
    1. 运行效果:输入正确的四位数密码,会打印:Hello Boss!!! ,密码输入错误会打印:Password Error!。最多输入四位,如果已经输入了四位,再输入无效,每次输入完密码按下确认键显示密码正确与否的同时,密码全部恢复为 0000,按取消密码全部恢复为 0000 ,可以再重新输入;
    2. 将键盘 S1 - S10 作为数字键,分别代表 1 - 9 和 0,但是键盘扫描函数的返回值为 0 的话,那么就不会进来执行相关代码了,因此这里的 0 需要通过算法来获得。即用返回值对 10 取余,1 - 9 对 10 取余还是 1 - 9,10 对 10 取余就是0;
    3. 但是屏幕显示的数值是四位数密码,前面键盘按下输出数值的时候,都是后一个会把前一个数值刷新掉。那这里需要实现四位数显示也需要简单的算法,通过一个变量 Password 专门用于存放密码,(注意:Password变量要用无符号 int ,因为无符号 char 最大只能是 255,用 char 变量会越界),Password 初始值为0,对其先乘 10 再加上按键输入值,如此循环,每次对上一次的 Password 值乘10,加上下一次返回值的数值,就能实现多位密码;
    4. 为了限制最多输入四个数值,定义 count 变量用于记录按键输入次数,每输入一次,count + 1,通过条件判断最多输入 4 次,超过四次,不会再执行 Password 赋值操作;
    5. 将 S11 和 S12 作为确认键和取消键,条件判断函数返回值为 11,执行确认键的功能:如果输入的密码正确,则打印 Hello Boss!!! ,同时将 Password 和 count 设置回初始化值0,并且将密码显示为 0000 ,以便下次运行使用。字符串后面的空格是为了将上一次运行的结果刷新掉,保证屏幕只有我们需要显示的结果。如果密码错误,打印 Password Error! ,同样将密码变量和计数变量设为初始值,屏幕显示为 0000;
    6. 条件判断返回值为 12,则执行取消功能,同样将密码变量和计数变量设为初始值,屏幕密码显示为 0000,提示行全部清空。
      上一次的 Password 值乘10,加上下一次返回值的数值,就能实现多位密码;
    7. 为了限制最多输入四个数值,定义 count 变量用于记录按键输入次数,每输入一次,count + 1,通过条件判断最多输入 4 次,超过四次,不会再执行 Password 赋值操作;
    8. 将 S11 和 S12 作为确认键和取消键,条件判断函数返回值为 11,执行确认键的功能:如果输入的密码正确,则打印 Hello Boss!!! ,同时将 Password 和 count 设置回初始化值0,并且将密码显示为 0000 ,以便下次运行使用。字符串后面的空格是为了将上一次运行的结果刷新掉,保证屏幕只有我们需要显示的结果。如果密码错误,打印 Password Error! ,同样将密码变量和计数变量设为初始值,屏幕显示为 0000;
    9. 条件判断返回值为 12,则执行取消功能,同样将密码变量和计数变量设为初始值,屏幕密码显示为 0000,提示行全部清空。

相关文章:

02-51单片机数码管与矩阵键盘

一、数码管模块 1.数码管介绍 如图所示为一个数码管的结构图&#xff1a; 说明&#xff1a; 数码管上下各有五个引脚&#xff0c;其中上下中间的两个引脚是联通的&#xff0c;一般为数码管的公共端&#xff0c;分为共阴极或共阳极&#xff1b;其它八个引脚分别对应八个二极管…...

不同方式获取音频时长 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

【python A* pygame 格式化 自定义起点、终点、障碍】

- pip install pygame test.py(chatgpt版本) 空格键&#xff1a;运行 A* 算法。CtrlC 键&#xff1a;清空路径。CtrlS 键&#xff1a;保存当前地图到 map.json 文件。CtrlL 键&#xff1a;从 map.json 文件加载地图。 import pygame import json from queue import PriorityQ…...

12_Redis发布订阅

1.Redis发布订阅介绍 1.1 基本概念 Redis的发布订阅(Pub/Sub)是一种消息通信模式,允许消息的发布者(Publisher)将消息发布到一个或多个频道(Channel),订阅者(Subscriber)通过订阅这些频道来接收消息。 发布者(Publisher):发送消息的一方,使用PUBLISH命令将消息…...

归并排序:数据排序的高效之道

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

【redis初阶】浅谈分布式系统

目录 一、常见概念 1.1 基本概念 2.2 评价指标&#xff08;Metric&#xff09; 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…...

CatLog的使用

一 CatLog的简介 1.1 作用 CAT&#xff08;Central Application Tracking&#xff09; 是基于 Java 开发的实时应用监控平台&#xff0c;为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…...

头歌python实验:网络安全应用实践-恶意流量检测

第1关:re 库的使用 本关任务:编写一个能正则匹配出 ip 地址的小程序。 re 的主要功能函数 常用的功能函数包括: compile、search、match、split、findall(finditer)、sub(subn)。 re.search 函数 re.search 扫描整个字符串并返回第一个成功的匹配。 函数语法: re…...

大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)

大模型WebUI&#xff1a;Gradio全解11——Chatbots&#xff1a;融合大模型的聊天机器人&#xff08;2&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...

如何用 Python 实现简单的 AI 模型?

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

单片机-直流电机实验

1、ULN2003芯片介绍 ULN2003&#xff0c; 该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来 驱动直流电机&#xff0c;还可用来驱动五线四相步进电机。支持驱动大功率电器 因为 ULN2003 的输出是集电极开路&#xff0c;ULN2003 要输出高电平&#xff0…...

python【数据结构】

1. 列表 Python 中列表是可变的&#xff0c;这是它区别于字符串和元组的最重要的特点&#xff1b;即&#xff0c;列表可以修改&#xff0c;而字符串和元组不能。 以下是 Python 中列表的方法&#xff1a; 方法描述list.append(x)把一个元素添加到列表的结尾&#xff0c;相当…...

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner&#xff0c;最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…...

《笔记》青蛙跳台阶——斐波那契数列

斐波那契数列 斐波那契数列&#xff08;Fibonacci Sequence&#xff09;是一个经典的数学数列&#xff0c;其特点是每一项都是前两项的和。数列的前两项通常定义为 0 和 1&#xff08;或 1 和 1&#xff09;&#xff0c;后续每一项都是前两项的和。 斐波那契数列的定义 斐波那…...

SpringBoot3动态切换数据源

背景 随着公司业务战略的发展&#xff0c;相关的软件服务也逐步的向多元化转变&#xff0c;之前是单纯的拿项目&#xff0c;赚人工钱&#xff0c;现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战&#xff1a;了解SAAS模型&#xff0c;考虑怎么将公司的产品转换成多租…...

OSPF - 特殊区域

OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不断扩大时&#xff0c;LSDB规模也不断增长。如果某区域不需要为其他区域提供流量中转服务&#xff0c;那么该区域内的路由器就没有必要维护本区域外的链路状态数据库。  OSPF通过划分区域可以减少网…...

Linux 系统下磁盘相关指令:df、du、fdisk、lsblk

文章目录 I df、du、fdisk、lsblk指令df命令用于显示文件系统的磁盘空间使用情况du命令用于估算目录或文件的磁盘空间使用情况fdisk命令用于对磁盘进行分区操作lsblk指令查看设备信息II 应用du估算目录或文件的磁盘空间使用情况lsblk查看服务器上查看硬盘个数III 知识扩展磁盘阵…...

基于单片机的肺功能MVV简单测算

肺功能MVV一般是指肺部每分钟的最大通气量。 MVV本身是最大值的英文缩写&#xff0c;在临床上&#xff0c;肺功能MVV表示肺部每分钟最大通气量&#xff0c;用以衡量气道的通畅度&#xff0c;以及肺部和胸廓的弹性、呼吸肌的力量。 肺部每分钟的最大通气量的参考值男性与女性之…...

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错&#xff0c;而 XML 格式发票因其结构化、标准化的特点&#xff0c;为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据&#xff1a;XML 格式发票…...

腾讯云AI代码助手编程挑战赛-百事一点通

作品简介 百事通问答是一款功能强大的智能问答工具。它依托海量知识储备&#xff0c;无论你是想了解生活窍门、学习难点&#xff0c;还是工作中的专业疑惑&#xff0c;只需输入问题&#xff0c;就能瞬间获得精准解答&#xff0c;以简洁易懂的方式呈现&#xff0c;随时随地为你…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...