STC89C52单片机 启动!!!(三)

矩阵键盘介绍

当键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。

扫描原理

让我们来对比一下独立按键和矩阵按键

在独立按键中我们是按键一端接地,当按键按下时端口处变为低电平。之前我只是记住了这一点,但是现在我才了解到内部的原理。请看下面介绍。

51系列单片机I/O口各种不同的工作模式以及配置介绍

首先我们要先知道一件事情:所有IO口通电后默认是高电平

总的来说,我们使用的STC89C52中,P1,P2,P3,P4口都是弱上拉模式,只有P0端口为开漏输出模式。具体什么是弱上拉模式呢?

简单一点来讲就是像我们下面图中的结构,开关打到上面,此时端口为高电位,输出为1,但是此时驱动能力很弱,当端口外面接低电位的时候允许将它的电位拉低,(我的理解是当外面接低电位的时候vcc和低电位之间形成通路,有了电流,这样电阻就能分压,使得端口处电位降低,不知道是否正确)这就是我们一会儿讲到矩阵按键时的原理。当我们让端口为低电位,开关打到下面时,端口处为低电位,输出为0,此时驱动能力很强,能吸收许多的电流。这其实就是在51单片机中能让发光二极管(LED)发光比较亮的原理,当端口电位为0的时候驱动能力很强。所以我们通常检验端口电位是不是变化为0。

逐行扫描读取按键状态(具体原理)

结构:s1,s2,s3,s4的左边都连在了P17,s5,s6,s7,s8的左边都连在了P16,依次共四行占用了4个端口,s1,s5,s9,s13的右边都连在了P13,s2,s6,s10,s14的右边都连在了P12,依次共四列占用了4个端口。我们的想法是:

p17  p16   p15   p14

0        1        1        1 //通过其余四个端口电位状态来检查第一行是否有按键按下

1        0        1        1 //通过其余四个端口电位状态来检查第二行是否有按键按下

1        1        0        1 //通过其余四个端口电位状态来检查第三行是否有按键按下

1        1        1        0 //通过其余四个端口电位状态来检查第四行是否有按键按下    

具体原理:这部分很重要!这部分很重要!这部分很重要!!!

.首先我们要知道当p17  p16   p15   p14中的端口给0时才能检测到是否这行的按键按下了,当p17  p16   p15   p14中仅P17端口给0,其他全给1时,就算第二行的按键按下了但第一行的按键没有按下,我们的P10,P11,P12,P13也检测不到低电平来判断某一列有按键按下,因为此时只有第一行的一端是低电平,其他行按键左端都是高电平。

二.接着解释一下为什么按键一端为低电平的时候,另一端也是高电平。我们刚刚在上面讲过了

所有IO口通电后默认是高电平,当然这里的P10,P11,P12,P13也不例外,但是我们要看上面说过的弱上拉模式当端口外面接低电位的时候允许将它的电位拉低,即使它处在高电位,这里的P1系列8个端口都是弱上位模式,所以比如给P17接低点位,并且s2按下了,此时P12的电位就变为了低电位,检测为0,实现了精准读取按键状态的效果。

三.最后来结合第一点,解释一下为什么一次只能给p17  p16   p15   p14其中之一端口赋0,让其处于低点位。假如我们同时让P17,P16为低电平,此时当我们按下s5的时候和按下s1的时候,或者说同时按下的时候,P13端口的电位都变为了0,我们无法分辨到底是哪个按键按下了,所以一次只能给p17  p16   p15   p14其中之一端口赋0

对I/O工作模式的补充

补充:上面仅仅介绍了I/O口的弱上拉模式,下面补充一些对于STC89C52系列单片机中的开漏输出模式的介绍。

个人总结(欢迎大家指正):我认为P0端口的开漏输出配置就相当于上面这幅图中将电阻去掉,这样的话就不能让端口连通接地就使得端口的电位由1变为0,它可以实现输出低电平(0),但不能直接通过接地来改变电位1为0,这一点和弱上拉输出端口不一样。

开漏输出端口在输出高电平(1)时,实际上是处于高阻态,也就是并没有输出电平的功能,因此无法通过接地来将其改变为低电平。如果需要在开漏输出端口上输出低电平,通常需要外部上拉电阻和一个连接到负极(比如地)的开关或器件,当外部上拉电阻连接到 VCC 电源时,输出端口会被拉高到高电平(1)。当开关或器件闭合时,输出端口会连接到地,从而形成电路,使得输出端口能够输出低电平(0)。

继续拓展

代码实现

具体要求:按下按键s1-s16,依次在液晶屏上显示数字1-16。

//main.c里面代码
#include<regx52.h>
#include"LCD1602.h"
#include"matrix.h"
void main(){unsigned char i=0;LCD_Init();LCD_ShowString(1,1,"hello world");while(1){i=matrix_num();if(i){//这里注意,如果不加这个if判断条件的话,就会导致可能按下的时候闪烁一瞬间甚至不闪烁
//因为这里不写这个if的话当我们没有按下的时候会一直显示00,所以我们要加一个if判断来让它不显示00LCD_ShowNum(2,2,i,2);}}}
//matrix.c里面代码
#include<regx52.h>
#include<delay.h>
unsigned char matrix_num(){unsigned char key_num=0;P1=0xFF;P1_7=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=1;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=2;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=3;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=4;}}P1=0xFF;P1_6=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=5;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=6;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=7;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=8;}}P1=0xFF;P1_5=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=9;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=10;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=11;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=12;}}P1=0xFF;P1_4=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=13;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=14;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=15;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=16;}}return key_num;
}

完整代码包括LCD系列内部实现代码参考文末,并且注意使用这个函数要先进行初始化先调用LCD_Init()函数,这个矩阵按键在理解了原理之后代码容易写出来

下面做出两点解释:

1.matrix_num()代码逻辑解释,我们每次检测一行按键的时候都是:像这样P1=0xFF; P1_7=0;仅仅让一个端口输出地低电平,然后检测后四个端口是否会出现低电平。这里代码是逐行检测,逐列检测和逐行检测代码逻辑几乎一样,只不过前四个端口用途和后四个端口用途颠倒一下,不多赘述。

2.代码耦合性,最好不要让这边刚读取到了按键按下,立即在这个代码中就显示读取到的数字,最好写成这边用一个函数来读取按下的按键,然后函数执行结束将按下按键的编号返回,然后再显示,这样代码更便于理解

用矩阵按键实现密码锁

功能:按下1-9号按键输入对应数字,按下10号按键输入0,按下11号按键表示确认提交,按下12号按键表示退格,按下13号按键表示清除。密码正确提交显示"YES 666",错误提交显示“ERROE”密码锁一共四位数字。

代码这里只展示了main.c里面的,因为是在上面那个显示1-16的代码基础上来的,除了main.c不同,其他都一样。

纯代码版本

#include<regx52.h>
#include"LCD1602.h"
#include"matrix.h"
void main(){unsigned char i=0,count=0;unsigned int password=0,set_password=3226;LCD_Init();LCD_ShowString(1,1,"password");while(1){i=matrix_num();if(0<i&&i<=10&&count<4){LCD_ShowString(1,10,"       ");password=password*10+i%10;LCD_ShowNum(2,2,password,4);count++;}if(i==12&&count>0){password=password/10;LCD_ShowNum(2,2,password,4);count--;}if(i==13){password=0;LCD_ShowNum(2,2,password,4);count=0;}if(i==11){if(count==4){if(password!=set_password){LCD_ShowString(1,10,"ERROR");password=0;count=0;}if(password==set_password){LCD_ShowString(1,10,"YES 666");password=0;count=0;}}}}
}

 代码解释版本

#include<regx52.h>
#include"LCD1602.h"
#include"matrix.h"
void main(){unsigned char i=0,count=0;//count用来记录已经输入了几位unsigned int password=0,set_password=3226;//保存当前数字和预置密码LCD_Init();LCD_ShowString(1,1,"password");while(1){i=matrix_num();//获取按下按键对应的数字if(0<i&&i<=10&&count<4){//输入密码部分LCD_ShowString(1,10,"       ");//为了假如一轮输入测试结束,
//再次输入后覆盖上一次提示信息password=password*10+i%10;//这里i%10主要是针对10%10=0LCD_ShowNum(2,2,password,4);count++;}if(i==12&&count>0){//如果按下退格键并且此时count>就退格且count--password=password/10;LCD_ShowNum(2,2,password,4);count--;}if(i==13){//清除输入且count重置为0password=0;LCD_ShowNum(2,2,password,4);count=0;}if(i==11){//如果按下确认键就进行检查if(count==4){if(password!=set_password){LCD_ShowString(1,10,"ERROR");password=0;//复位count=0;}if(password==set_password){LCD_ShowString(1,10,"YES 666");password=0;count=0;}}}}
}

补充另一种扫描方法

首先第一种就是我们刚刚讲到的行列扫描法。

第二种是线翻转扫描方法:(十字交叉确定)

先给所有行赋0,给所有列赋1,判断在哪一行;

然后给所有行赋1,所有列赋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//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');}
}
//delay.h
#ifndef__delay_H__
#define__delay_H__
void delay(unsigned int t);#endif
//delay.c
void delay(unsigned int t){while(t--);
}
//matrix.h
#ifndef__matrix_H__
#define__matrix_H__
unsigned char matrix_num(); #endif
//matric.c
#include<regx52.h>
#include<delay.h>
unsigned char matrix_num(){unsigned char key_num=0;P1=0xFF;P1_7=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=1;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=2;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=3;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=4;}}P1=0xFF;P1_6=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=5;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=6;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=7;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=8;}}P1=0xFF;P1_5=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=9;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=10;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=11;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=12;}}P1=0xFF;P1_4=0;if(P1_3==0){delay(200);if(P1_3==0){while(P1_3==0);key_num=13;}}if(P1_2==0){delay(200);if(P1_2==0){while(P1_2==0);key_num=14;}}if(P1_1==0){delay(200);if(P1_1==0){while(P1_1==0);key_num=15;}}if(P1_0==0){delay(200);if(P1_0==0){while(P1_0==0);key_num=16;}}return key_num;
}

参考文章:【51单片机】矩阵键盘_51单片机4×4矩阵键盘-CSDN博客

欢迎大家指正! 

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

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

相关文章

厉害了,2024最新听全网音乐神器

今天分享个神器app简助手&#xff0c;听全网音乐和看片&#xff0c;下载地址 夸克网盘分享 玩转互联网达人 苏生不惑备用号&#xff0c;分享各种黑科技软件资源和技巧&#xff0c;带你玩转互联网。 17篇原创内容 公众号 最新版本更新日志。 进入音乐搜索&#xff1a; 听周杰…

day09-Mybatis

一、Mybatis 基础操作 1 需求 功能列表&#xff1a; 查询 根据主键ID查询 条件查询新增更新删除 根据主键ID删除 根据主键ID批量删除 2 准备 实施前的准备工作&#xff1a; 准备数据库表创建一个新的 springboot 工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、…

Vue3-03_组件基础_上

单页面应用程序 什么是单页面应用程序 单页面应用程序&#xff08;英文名&#xff1a;Single Page Application&#xff09;简称 SPA&#xff0c;顾 名思义&#xff0c;指的是一个 Web 网站中只有唯一的一个 HTML 页面&#xff0c;所有的 功能与交互都在这唯一的一个页面内完…

Java八股文(Element Plus)

Java八股文のElement Plus Element Plus Element Plus 什么是Element UI 和 Element Plus&#xff1f; Element UI 和 Element Plus 是基于 Vue.js 的一套非常受欢迎的开源 UI 组件库&#xff0c;用于快速构建具有现代化设计和丰富交互效果的前端界面。 Element UI 和 Element…

固态存储是未来|浅析SSD架构的演进与创新技术-2

除了性能和容量这两个最大的诉求外&#xff0c;其他的需求已经成为SSD现场架构的核心竞争力。 一是安全性&#xff1a;随着数据安全威胁日益严重&#xff0c;SSD的安全设计成为关键&#xff0c;包括提供单芯片硬件信任根、遵循FIPS140-3安全标准以及支持一次性可编程位字段来锁…

uni app 钓鱼小游戏

最近姑娘喜欢玩那个餐厅游戏里的钓鱼 &#xff0c;经常让看广告&#xff0c;然后就点点点... 自己写个吧。小鱼的图片自己搞。 有问题自己改&#xff0c;不要私信我 <template><view class"page_main"><view class"top_linear"><v…

react-native使用FireBase实现google登陆

一、前置操作 首先下载这个包 yarn add react-native-google-signin/google-signin 二、Google cloud配置 Google Cloud 去google控制台新建一个android项目&#xff0c;这时候需要用到你自己创建的keystore的sha1值&#xff0c;然后会让你下载一个JSON文件&#xff0c;先保…

C#操作MySQL从入门到精通(4)——连接MySQL数据库

前言 我们创建好数据库、建立好数据库的表以后&#xff0c;我们就需要访问数据库了&#xff0c;比如将数据插入数据库的某张表中等一系列操作&#xff0c;在进行这些操作之前我们需要连接上数据库&#xff0c;本文就是详细讲解如何连接MySQL数据库的。 1、使用Navicat Premiu…

基于ssm+layui的图书管理系统

基于ssmlayui的图书管理系统 账户类型分为&#xff1a;管理员&#xff0c;用户管理员私有功能用户私有功能公共功能技术栈功能实现图 视频演示 账户类型分为&#xff1a;管理员&#xff0c;用户 图书管理系统主要登录账户类型为管理员账户与用户账户 管理员私有功能 账户管理…

PHP 生成图片

1.先确认是否有GD库 echo phpinfo(); // 创建一个真彩色图像 $image imagecreatetruecolor(120, 50);// 分配颜色 $bgColor imagecolorallocate($image, 255, 255, 255); // 白色背景 $textColor imagecolorallocate($image, 230, 230, 230); // 黑色文字// 填充背景 image…

Java学习笔记(12)

包 导包 Final 不能被改变的&#xff0c;修饰方法 类 变量 方法不能被重写 类不能被继承 变量&#xff0c;赋值一次&#xff0c;变成常量&#xff0c;不能再被赋值 final修饰引用数据类型&#xff0c;地址值不能变&#xff0c;里面的内容可以变 字符串是不可变的 源码中使…

ThreeJs 可视化大屏地图

效果图&#xff1a; 今天给各位提供一个可视化地图的案例和源码&#xff0c;关注下吧各位&#xff01;回复"大屏地图" 获取工程 1、案例分析&#xff1a;主要使用了UI 美工图片&#xff0c;然后获取地图的json 数据绘制图形&#xff0c;贴图使用该区域的地图纹理进行…

基于SpringBoot和Vue的宠物商城网站

目录 一、 绪论1.1 研究背景1.2 研究目的1.3 研究意义 二、相关技术2.1 Spring Boot简介2.2 Vue简介2.3 前后端分离架构概述2.4 其他技术和工具 三、需求分析3.1 功能需求3.1.1 用户模块功能需求3.1.2 商品模块功能需求3.1.3 论坛模块功能需求3.1.4 留言板模块功能需求 3.2 用户…

异常机制总结

异常的本质_调试错误 异常是什么&#xff1f; 软件程序在运行过程中&#xff0c;非常可能遇到刚刚提到的这些问题&#xff0c;我们称之为异常&#xff0c;英文是&#xff1a;Exception&#xff0c;意思是例外。遇到这些例外情况&#xff0c;或者叫异常。 伪代码说明异常机制…

会员项目定价卡css3特效

会员项目定价卡css3特效&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 会员项目定价卡css3特效代码

谁将是RAG的头部玩家?

开篇 菩提修妙树&#xff0c;接引证法源&#xff0c;屠龙万仙阵&#xff0c;玉虚祭封神。 混战是国内技术圈的常态&#xff0c;在众仙跟风与追捧的大潮中&#xff0c;如何看清方向至关重要&#xff0c;决定谁最终将封神。 语言大模型(LLM)&#xff0c;多模态(MM)&#xff0c;…

代码随想录day22(1)二叉树:左叶子之和(leetcode404)

题目要求&#xff1a;计算二叉树所有左叶子之和 思路&#xff1a;本题应该满足两个条件&#xff0c;一是叶子节点&#xff0c;二是要求是左叶子。所以判断时&#xff0c;如果一个节点左孩子的左右孩子均为空&#xff0c;且其右孩子也为空&#xff0c;此节点的左孩子就为左叶子…

编程语言常识

看图区别编程语言 什么是强类型、弱类型语言&#xff1f;哪种更好&#xff1f; 强类型语言 强类型语言是一种强制类型定义的语言&#xff0c;即一旦某一个变量被定义类型&#xff0c;如果不经强制转换&#xff0c;那么它永远就是该数据类型。 在强类型语言中&#xff0c;变量的…

【Eviews实战】——时序的平稳性检验

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

C++ 入门篇

目录 1、了解C 2、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入与输出 4.缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 5. 函数重载 5.1 函数重载的概念 5.2 C中支持函数重载的原理--名字修饰 6. 引用 6.1 引用概念 6.2 引用…