江协科技51单片机学习- p31 LCD1602液晶屏驱动
🚀write in front🚀
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚
前言:
本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。
引用:
51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili
江科大51单片机入门学习笔记合集_51单片机江科大教程下载-CSDN博客
【51单片机系列】LCD1602液晶模块_lcd1602液晶显示模块-CSDN博客
江科大51单片机入门学习笔记合集_51单片机江科大教程下载-CSDN博客
2302_80796399-CSDN博客
51单片机学习笔记14 LCD1602显示屏使用-CSDN博客
CZU23Yz-CSDN博客
灰海宽松-CSDN博客
正文:
0. 🌿概述
在淘宝上购买了江协科技51单片机开发板套件(普中科技STC51单片机A2型号),就上在上一篇博文里说的自己计划学习下江协科技51单片机开发教程,通过STC51单片机这种MCU这种贴近于裸机的开发来增加对于系统硬件层面知识的了解和掌握。
术语和缩略语
缩写 | 全称 | 说明 |
LCD | Liquid Crystal Display | 液晶显示屏 |
1. 🚀 LCD1602液晶显示屏介绍
liquid crystal display 液晶显示屏,一种字符型液晶显示模块,可以显示 16*2 个字符,每个字符是 5*7 点阵。
LCD1602实物如下:
🌿LCD1602背面自带两个黑色圆圆的牛屎封装芯片,里面封装的是LCD1602液晶显示屏的芯片HD44780,它里面带有字模和控制扫描控制电路,它会自动扫描LCD1602液晶显示屏的点阵显示,,我们直接将数据发送给LCD1602显示即可,即使我们不用像数码管显示一样需要我们单片机不停地进行扫描显示。
LCD1602看到16个管脚孔,从左至右管脚编号顺序是1-16,管脚功能定义如下表
管脚编号 | 符号 | 管脚说明 |
---|---|---|
1 | VSS | 电源地 |
2 | VDD | 电源正极(4.5~5.5V) |
3 | VL(VO) | 液晶显示偏压信号,调节LCD显示对比度 |
4 | RS | 数据/命令选择端 H/L,1为数据,0为指令 |
5 | R/W | 读/写选择端 H/L,1为读,0为写 |
6 | E | 使能信号,1为数据有效,下降沿执行命令 |
7~14 | D0~D7 | Data I/O |
15 | BLA | 背光源正极 |
16 | BLK | 背光源负极 |
LCD1602时序逻辑里,使能信号'E'高电平有效,在下降沿执行命令。所以LCD1602驱动写数据/指令的时序可以是:
- E为低电平,在D0~D7数据线上准备好要写的数据/指令
- E置为高电平,在高电平时LCD1602采样数据
- 然后,E置位低电平产生下降沿,LCD1602在下降沿执行指令。
E 使能信号,1为数据有效,下降沿执行命令
LCD1602背面的液晶LCD显示驱动芯片一般是,LCD1602 驱动芯片内部功能框图如下(江协科技老师自己画的框图)
- 🎄CGRAM和CGROM:内部的一个字模库,CG: character Generator,就像数码管显示一样,当我们想让数码管显示数字1的时候并不是直接写1的,而是要输出一个‘1’的字模,就是需要一个译码的过程,LCD1602液晶屏显示字符也是需要这样一个译码得到字符对应的字模的过程,其中字模就存在LCD1602的GCRAM&GCROM字模库里。
其中GCRAM是可写的,可以存样用户自定义的一些字符的字模。
GCROM是出厂写死的,其中存放预先定义好的字符字模。- 🎄DDRAM(数据显示区)(40*2):Data Display RAM区,DDRAM大小为每行40个字符,乘以2行,其中GC1602只能在每行显示16个字符,DDRAM的大小要比GC1602显示的区域要长。用户写到DDRAM存储区域的指令,将会映射显示到LCD1602的前16个字符。
为什么驱动芯片是40*2个字符大小的,因为这个驱动芯片是通用的支持每行40个字符,第二是可以通过移屏指令,将DDRAM中的数据进行移屏并且移屏是循环移屏的移动到最左侧之外的数据将移回到最右侧,这样配合GC1602的移屏指令,就可是实现LCD1602屏幕的滚动显示。- 🎄控制器:
- 🎄屏幕(16*2):
- 🎄AC(光标位置):
DDRAM(数据显示区)
LCD1602的DDRAM(Display Data RAM)是用于存储显示数据的内存区域,它是LCD控制器内部的一部分。DDRAM可以存储LCD屏幕上每个字符的数据,包括字符形状和位置信息。通过修改DDRAM中的数据,可以实现LCD屏幕上的文本显示。
以下是LCD1602的DDRAM地址与屏幕字符位置的对应关系表:
CGRAM+CGROM(字模库)
CGROM/CGRAM里存放的是LCD1602液晶显示屏的字母库,其中CGROM中存放的不可修改的预先定义好的字符的子模,子模的地址排布如下图:
- 0x30~0x39 是数字0~9的字模,对应则会ASCII码中的0~9字符的编码,这是在定义CGROM子模的地址的时候特意设计的。
- 0x41~0x5A对应大写字母 A~Z,0x61~0x7A对应消息字母a~z,这也是在定义CGROM子模的地址的时候特意设计的。
- CGRAM的可以存放用户自定义字符,地址为1~8,虽然下图里显示了1~8显示了两次,但实际它们是重复的,CGRAM自定义字符就是8个。
2. LCD1602的时序
LCD1602的写数据/指令时序图如下:
LCD1602的写数据的操作时序如下:
- RS 数据/指令选择位,设置为高电平表示写数据
- R/W读/写选择位,设置为低电平表示写
- 在时序图中,DB0~DB7时序图交叉的地方表示写数据,所以在DB0~DB7数据引脚准本好要写的数据。
- E 使能引脚,先设置为电平数据有效,持续一段时间再设置为低电平
时序参数(时序的时间最短时间)
3. LCD1602的指令集
LCD1602的指令集,如下图
清屏指令0x1:
- 清除DDRAM内容,结果是清屏。
- 清除AC的值,结果是AC光标复位,
清屏指令(0x01)用于清除LCD屏幕上的所有字符及光标位置,并将光标移至起始位置(0行0列)。
Bit 0用于启动清屏指令的执行。其他位暂时保留,一般不使用。
Bit | RS | R/W | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
作用 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
光标(AC)归位指令0x02
光标归位指令(0x02)用于将LCD光标移回起始位置(0行0列)、同时把地址计数器(AC)值设置为0。
X表示该位不关心,为0或者为1都不影响。
Bit | RS | R/W | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
作用 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X |
数据写入方式指令:
写入模式设置指令用于配置LCD的文本显示模式,包括光标移动方向和字符显示是否移位等参数
Bit | RS | R/W | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
作用 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
显示开关控制指令
- D: 0=显示功能关;1=显示功能开;
- C: 0=无光标 ;1=有光标;
- B: 0=光标闪烁;1=光标不闪烁。
Bit | RS | R/W | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|
作用 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
功能设置指令
功能设置指令,选择数据接口是4位还是8位,选择单行显示还是两汉显示,选择点阵的高度。
我们一般使用的是GC1602的的指令字0x38,即:8位数据几口,两行显示,5*7点阵。
设定DDRAM地址指令
设定下一个要存入数据的DDRAM地址;
读取忙信号或AC地址指令
一般不用,我们不从GC1602读取数据
4. LCD1602操作流程
LCD1602操作流程如下
LCD1602初始化
初始化
- 发送指令0x38 //8位数据几口,两行显示,5*7点阵
- 发送指令0x0C //显示开,光标关,闪烁关
- 发送指令0x06 //数据读写操作后,光标自动加1,画面不动
- 发送指令0x01 //清屏
显示字符
显示字符
- 发送指令 0x80 | AC //设置光标位置(DDRAM写入的地址)
- 发送数据 //发送想要显示的字符数据
- 发送数据 //发送想要显示的字符数据
为什么第一步这里要将要设置的光标位置(也就是DDRAM的写入地址)或上 '0x80'哪?我们注意到LCD1602指令集里从上到下通过最高位的1来标识属于那种指令,“DDRAM地址设置”指令的最高位DB7固定为1,所以要将光标AC位置的指令或上与最高位的1,也就是或上0x80.
5. 编写LCD1602液晶显示屏驱动函数
编写我们自己LCD1602液晶显示屏驱动函数,这里将会写如下这些函数,方便我们自己在实验中打印在LCD1602液晶显示屏上打印信息。
LCD1602.c
#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"sbit LCD_RS=P2^6; //LCD1602 RS 数据/指令选择
sbit LCD_RW=P2^5; //LCD1602 RW 读/写选择
sbit LCD_EN=P2^7; //LCD1602 EN 使能 #define LCD_DataPort P0 //LCD1602 D0~D7 数据端口/*** @brief LCD1602延时函数,12MHz调用可延时1ms* @param 无* @retval 无*/
void LCD_Delay() //@11.0592MHz 1ms
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}/*** @brief LCD1602写命令* @param Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned Command)
{LCD_RS = 0; //LCD1602指令LCD_RW = 0; //LCD1602写LCD_DataPort = Command; //写指令LCD_EN = 1; //LCD1602 EN使能为高LCD_Delay(); //delay 1ms,防止时序太快LCD1602来不及执行LCD_EN = 0; //LCD1602 EN使能为低LCD_Delay(); //delay 1ms
}/*** @brief LCD1602写数据* @param Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned Data)
{LCD_RS = 1; //LCD1602数据LCD_RW = 0; //LCD1602写LCD_DataPort = Data; //写数据LCD_EN = 1; //LCD1602 EN使能为高LCD_Delay(); //delay 1ms,防止时序太快LCD1602来不及执行LCD_EN = 0; //LCD1602 EN使能为低LCD_Delay(); //delay 1ms
}/*** @brief LCD1602初始化函数* @param 无* @retval 无*/
void LCD_Init(void)
{LCD_WriteCommand(0x38); //8位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c); //显示开,光标关,闪烁关 LCD_WriteCommand(0x06); //数据读写操作后,光标自动加1,画面不动LCD_WriteCommand(0x01); //清屏
}/*** @brief LCD1602设置光标位置* @param Line 行位置,范围:1~2* @param Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line, unsigned char Column)
{unsigned char AC_DDRAM = 0;/* 计算写入到DDRAM(显示区)的光标AC的位置 */if(Line == 1){AC_DDRAM = 0x00 + (Column - 1);AC_DDRAM |= 0x80;}else if(Line == 2){AC_DDRAM = 0x40 + (Column - 1);AC_DDRAM |= 0x80;}LCD_WriteCommand(AC_DDRAM); //设置光标地址
}/*** @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 Char 要显示的字符* @retval 无*/
void LCD_ShowString(unsigned char Line, unsigned char Column, char *String)
{unsigned char i = 0;LCD_SetCursor(Line, Column); //设置光标位置/* 打印字符串 */i = 0;while(String[i] != '\0'){LCD_WriteData(String[i]); //光标AC每次自动加1i++;}
}/*** @brief 返回值=X的Y次方*/
signed int LCD_Power(int x, int y)
{int result = 1;while(y > 0){result *= x;y--;}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 Num, unsigned char Length)
{unsigned char i = 0;unsigned char Chr;LCD_SetCursor(Line, Column); //设置光标位置for(i=Length; i>0; i--){Chr = Num/LCD_Power(10,i-1)%10;if(Chr >=0 && Chr <= 9){Chr += 0x30;}LCD_WriteData(Chr);}
}/*** @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 Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;unsigned char Number1;LCD_SetCursor(Line, Column); //设置光标位置if(Num>=0){LCD_WriteData('+');Number1 = Num;}else{LCD_WriteData('-');Number1 = -Num; //-32768 转为32768之后可能会溢出}for(i=Length; i>0; i--){SingleNum = Number1/LCD_Power(10,i-1)%10;if(SingleNum >=0 && SingleNum <= 9){SingleNum += 0x30;}LCD_WriteData(SingleNum);}
}/*** @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 Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;LCD_SetCursor(Line, Column); //设置光标位置for(i=Length; i>0; i--){SingleNum = Num/LCD_Power(16,i-1)%16;if(SingleNum >=0 && SingleNum <= 9){SingleNum += 0x30; }else if(SingleNum >=10 && SingleNum <= 15){SingleNum = SingleNum - 10 + 'A'; //16进制A,B,C,D,E,F}LCD_WriteData(SingleNum);}
}/*** @brief 在LCD1602指定位置开始以二进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~1111 1111 1111 1111* @param Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinaryNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length)
{unsigned char i = 0;unsigned char SingleNum;LCD_SetCursor(Line, Column); //设置光标位置for(i=Length; i>0; i--){SingleNum = Num/LCD_Power(2,i-1)%2;SingleNum += 0x30;LCD_WriteData(SingleNum);}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__void LCD_Init(void);
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 Num, unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line, unsigned char Column, int Num, unsigned char Length);
void LCD_ShowHexNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
void LCD_ShowBinaryNum(unsigned char Line, unsigned char Column, unsigned int Num, unsigned char Length);
#endif
main.c
#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"void main()
{LCD_Init();LCD_ShowChar(1, 1, 'A');LCD_ShowChar(1, 2, 'H');LCD_ShowChar(2, 3, 'B');LCD_ShowChar(2, 4, 'C');LCD_ShowChar(1, 1, 'A');LCD_ShowString(1, 1, "Hello LCD1602");LCD_ShowNum(2, 1, 187, 3);LCD_Init();LCD_ShowHexNum(2, 1, 0x88FA, 4);LCD_ShowSignedNum(2, 7, -88, 2);LCD_ShowBinaryNum(1, 1, 0xAB, 8);while(1){}
}
6. LCD1602液晶显示屏实验效果:
实验1-LCD1602显示字符串
实验2 -LCD1602显示16进制和2进制数字
#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"
#include "Delay.h"void main()
{LCD_Init();LCD_ShowChar(1, 1, 'A');LCD_ShowChar(1, 2, 'H');LCD_ShowChar(2, 3, 'B');LCD_ShowChar(2, 4, 'C');LCD_ShowChar(1, 1, 'A');LCD_ShowString(1, 1, "Hello LCD1602");LCD_ShowNum(2, 1, 187, 3);LCD_Init();LCD_ShowHexNum(2, 1, 0x88FA, 4);LCD_ShowSignedNum(2, 7, -88, 2);LCD_ShowBinaryNum(1, 1, 0xAB, 8);while(1){}
}
实验3-LCD1602显示屏滚动显示
在Main.c中增加LCD1602移屏指令,这样LCD1602 DDRAM(县市区)一行40个字符的后面字符就可以滚动的显示出来,LCD1602移屏显示指令每次向左移动时最左面移出的字符会回到最右边,这样就可以在LCD1602循环显示。
#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"
#include "Delay.h"void main()
{LCD_Init();LCD_ShowString(1, 1, "MAGA 2024! Trump");LCD_ShowString(2, 1, "Make Amerigan Gream Again, 2024 MAGA");while(1){Delay(500);LCD_WriteCommand(0x18);}
}
相关文章:

江协科技51单片机学习- p31 LCD1602液晶屏驱动
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
Android SurfaceFlinger——渲染完成帧显示(四十八)
帧渲染完成后下一步就是将帧缓冲区(framebuffer)的内容发送到显示设备进行显示,也是 SurfaceFlinger 处理渲染合成的最后一步。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)…...

ABAP+json格式数据转换时参数为空没传值
CALL METHOD /UI2/CL_JSON>SERIALIZE 我们在ABAP传输json格式数据到外围系统时,会用到这个类方法 /UI2/CL_JSON>SERIALIZE CALL METHOD /UI2/CL_JSON>SERIALIZEEXPORTINGDATA LO_DATACOMPRESS XPRETTY_NAME /UI2/CL_JSON>PRETTY_M…...

Flink中上游DataStream到下游DataStream的内置分区策略及自定义分区策略
目录 全局分区器GlobalPartitioner 广播分区器BroadcastPartitioner 哈希分区器BinaryHashPartitioner 轮询分区器RebalancePartitioner 重缩放分区器RescalePartitioner 随机分区器ShufflePartitioner 转发分区器ForwardPartitioner 键组分区器KeyGroupStreamPartitio…...

谁来做引领企业精益变革的舵手最合适?
在这个瞬息万变的商业时代,企业如同航行在波涛汹涌的大海中的巨轮,既需面对未知的挑战,也要抓住稍纵即逝的机遇。而在这场没有终点的航行中,引领企业实现精益变革的舵手,无疑是推动企业破浪前行、稳健致远的关键角色。…...

数据结构(java实现)——优先级队列,堆
文章目录 优先级队列堆堆的概念堆的模拟实现创建堆入堆判满删除判空获取栈顶元素 创建堆两种方式的时间复杂度堆排序java提供的PriorityQueue类基本的属性关于PriorityQueue类的三个构造方法关于PriorityQueue类中,入堆方法是怎样实现的?PriorityQueue注…...

一部分优化算法
一、优化问题 1、优化目标 (1)优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。 (2)优化算法的目标函数通常是基于训练数据集的损失函数&#x…...

图论(强联通分量)
在图论中,特别是在讨论有向图(Directed Graph)时,我们常常需要了解图的结构特性,比如强联通分量(Strongly Connected Components, SCC)。了解强联通分量中的各种边对于理解图的整体结构以及某些…...

LLaMA- Adapter V2: Parameter-Efficient Visual Instruction Model
发表时间:28 Apr 2023 论文链接:https://arxiv.org/pdf/2304.15010 作者单位: Shanghai Artificial Intelligence Laboratory Motivation:如何有效地将大型语言模型 (LLM) 转换为指令追随者最近是一个流行的研究方向࿰…...

【爬虫实战】利用代理爬取Temu电商数据
引言 在行业竞争激烈、市场变化快速的跨境电商领域,数据采集可以帮助企业深入了解客户需求和行为,分析市场趋势和竞争情况,从而优化产品和服务,提高客户满意度和忠诚度。同时,数据采集可以实时跟踪库存水平和销售情况&…...

【MATLAB源码-第244期】基于MATLAB的BP神经网络语音特征信号分类,输出原信号与预测信号对比图以及预测误差和正确率。
操作环境: MATLAB 2022a 1、算法描述 BP神经网络(Back Propagation Neural Network)是一种广泛应用于模式识别和分类问题的人工神经网络。在本次语音特征信号分类任务中,我们将详细描述如何通过BP神经网络实现对四类语音信号的…...

HarmonyOS 习题(二)
1、在类Web开发范式自定义组件创建后,加入到Page组件树时,会触发以下哪一项回调。 A)Onlnit B)OnAttached C)OnLayoutReady D)OnDetached 答案:B 分析: onlnit:自定义组件初始化生命周期回调&a…...

如何搭建一个圈子社区系统?开源社交陪玩交友圈子论坛帖子系统保姆级搭建教程!
整体部署流程如下: 1.获取源码/前后端分离,前端Uniapp vue2.0 后端thinkphp6(Gitee直达) 2.服务器安装宝塔(已有宝塔请安装环境,Nginx或者Apache/ php 7.3/ mysql 5.6 ) 3.进入宝塔添加网站&…...

Delphi5实现身份证检验(DLL版)
效果图 身份证行政区划分代码 识别归属地需要行政区划分,都在data.txt文档里面了。 最后一位校验码 根据上面的原理编写程序即可。 {这个函数计算最后一位检验码是否正确,ID是18位身份证号字符串,结果返回字符串} function IDcheck(ID:stri…...

linux下的C++程序
1.安装g编译环境(c)、gcc编译环境(c语言) sudo yum install gcc或者gcc-c //安装gcc/g编译(用管理员权限弄) 验证是否安装成功 gcc或者g --version //如果显示版本号,则表示安装成功 sudo yum remove g…...
selfAttention 中的dk到底是什么
在Self-Attention机制中,为什么需要对 Q K T QK^T QKT 的结果进行缩放,除以 d k \sqrt{d_k} dk 。以下是详细解释: 缩放的原因 除以 d k \sqrt{d_k} dk 的原因有两个: 防止输入过大:如果不缩放…...

安装MongoDB UI客户端工具:mongodb-compass-1.40.2-win32-x64.msi
文章目录 1、安装 mongodb-compass-1.40.2-win32-x64.msi2、安装后配置链接地址: 1、安装 mongodb-compass-1.40.2-win32-x64.msi 2、安装后配置链接地址:...

一行命令搞定内网穿透
一行命令搞定内网穿透 一款开源免费的内网穿透工具:localtunnel ,基于 nodejs 实现,无需修改 DNS 和防火墙设置,方便快捷的将内网服务暴露到外网,为开发人员、测试人员以及需要分享本地项目的人提供实时的公网访问方式…...

C语言——扫雷游戏
扫雷游戏通常是一个由方格组成的区域内进行的,其中随机分布着一定数量的地雷 。玩家的目标是通过点击方格来标记出所有地雷的位置,同时避免自己点到地雷而导致游戏失败。游戏开始时,玩家通常只能看到一部分方格,而其余的方格则需要…...
【LLM】-16-评估LLM-与标准答案的差距
目录 1、评估回答是否正确 1.1、util_zh 1.2、eval_zh 1.3、评估 2、评估生成答案与标准答案的差距 2.1、eval_zh2 2.2、评估 即使没有提供的理想答案,只要能制定一个评估标准,就可以使用一个 LLM 来评估另一个 LLM 的输出。 如果可以提供理想答…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...
使用 uv 工具快速部署并管理 vLLM 推理环境
uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...

2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题
2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题 (二)模块 A:安全事件响应、网络安全数据取证、应用安全、系统安全任务一:漏洞扫描与利用:任务二:Windows 操作系统渗透测试 :任务三&…...
四、Sqoop 导入表数据子集
作者:IvanCodes 日期:2025年6月4日 专栏:Sqoop教程 当不需要将关系型数据库中的整个表一次性导入,而是只需要表中的一部分数据时,Sqoop 提供了多种方式来实现数据子集的导入。这通常通过过滤条件或选择特定列来完成。 …...
Life:Internship finding
1. 前言 fishwheel writes this Blog to 记录自分自身在研二下找实习的经历。When 写这篇 Blog 的时候我的最后一搏也挂掉了,只能启用保底方案了。When I 打开我的邮箱时,发现里面有 nearly 100 多封与之相关的邮件,顿时感到有些心凉&#x…...
如何使用 Redis 快速实现布隆过滤器?
以下是使用 Redis 实现布隆过滤器的两种方案,结合原理说明和操作步骤: 方案一:手动实现(基于 Redis Bitmap) 原理 利用 Redis 的 SETBIT 和 GETBIT 操作位数组,结合多个哈希函数计算位置。 步骤 确定参数…...