51单片机学习笔记-12LCD1602液晶屏

news2024/11/23 16:45:31

12 LCD1602液晶屏

[toc]

注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。
注:工程及代码文件放在了本人的Github仓库。


12.1 LCD1602介绍

LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符。

显示容量:16×2个字符,每个字符为5*7点阵

图12-1 各种各样的液晶屏
图12-2 LCD1602原理图

LCD1602控制的关键,在于中间这几个加粗的引脚。优先级最高的是 使能引脚EN,DB0~DB7位数据,通过RS和RW的配合就可以完成对于液晶屏数据/指令的读写。目前主要关心写指令(怎么显示,在哪里显示)、写数据(写什么)。

图12-3 LCD1602内部结构框图
  • 屏幕(16*2)。
  • CGRAM+CGROM(字模库):“CG”表示“Character Generator”,即字模生成。用于存放需要显示的字符与液晶屏上像素点的对应关系,相当于数码管显示中的“段码表”。

    上面左侧的CGRAM所示的8个寄存器可以自定义,下面的8个和上面8个地址相同,相当于重复。后面的字模都放在CGROM中。
  • DDRAM(40*2):用于存放屏幕上需要显示的数据。注意其一般只显示前16列元素到液晶屏上,剩余的区域不会显示。但是也可以利用这些区域做滚动显示。
  • 控制器:尤其注意AC(光标位置):“AC”意为Address Counter。即对于DDRAM进行操作时要格外关心所操作的地址。

对LCD显示进行操作的基本流程为:

1. LCD初始化:
发送指令0x38 //八位数据接口,两行显示,5*7点阵
发送指令0x0C //显示开,光标关,闪烁关
发送指令0x06 //数据读写操作后,光标自动加一,画面不动
发送指令0x01 //清屏
2. 显示字符:
发送指令0x80|AC //设置光标位置
发送数据 //发送要显示的字符数据
发送数据 //发送要显示的字符数据
……

图12-4 LCD1602指令集

下面给出读写操作的时序图:

  • 写操作时序图及时间要求:

  • 读操作时序图及时间要求:

  • 注意,最重要的点在于使能信号 EN不仅拉高时有延时要求,拉低后同样也有时间要求。 另外经实测,时间要求也都写的不对,建议使能信号 EN拉高和拉低的持续时间都为1ms。

下面介绍一些有关C语言语法的知识:

  • 字符:根据一定规则建立的数字到字符的映射 (ASCII码表)
    例如:0x21=’!’,0x41=’A’,0x00=’\0’
    定义方法:char x=‘A’;(等效于char x=0x41;
  • 字符数组:存储字符变量的一个数组
    定义方法:char y[]={’A’, ’B’, ’C’};(等效于char y[]={0x41,0x42,0x43};
  • 字符串:在字符数组后加一个字符串结束标志,本质上是字符数组
    定义方法:char z[]=”ABC”;(等效于char z[]={’A’, ’B’, ’C’, ’\0’};

12.2 实验:LCD1602功能代码

需求:在液晶屏上依次显示:

  1. 一个字符 ‘A’
  2. 一个字符串 “Hello”
  3. 一个无符号数字 88
  4. 一个有符号数字 -00
  5. 一个十六进制数字 0xFE
  6. 一个二进制数字 01011100
  7. 显示特殊符号℃上面的“句号”
图12-5 “LCD1602”代码调用关系

代码展示:
- main.c

#include <REGX52.H>
#include "LCD1602.h"

void Delay500ms(){//@11.0592MHz
	unsigned char i, j, k;
	i = 4;
	j = 129;
	k = 119;
	do{
		do{
			while (--k);
		}while (--j);
	}while (--i);
}

void main(){
  //LCD初始化
  LCD1602_Init();
  // LCD显示
  LCD1602_DispChar(1,1,'A');//显示单个字符
  LCD1602_DispString(1,3,"$_$");//显示字符串
  LCD1602_DispUnInt(1,7,99,3);//显示无符号数字
  LCD1602_DispInt(1,11,-32768,6);//显示有符号数字
  LCD1602_DispUnInt_Hex(2,1,255,2);//显示无符号整型的16进制表示
  LCD1602_DispUnInt_Bin(2,4,3,3);//显示无符号整型的2进制表示
  LCD1602_DispFloat(2,8,-20.99,7,3);//显示单精度浮点数-20.99
  LCD1602_DispChar(2,15,0xdf);//显示特殊符号(主要就是查看字模表)
  //LCD移屏
  LCD1602_DispString(1,20,"Fries on the pier!");
  while(1){
    LCD1602_WriteCommd(0x18);
    Delay500ms();
    Delay500ms();
  }
}

- LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__

// LCD1602写指令
void LCD1602_WriteCommd(unsigned char wByte);
// LCD1602写数据
void LCD1602_WriteData(unsigned char wByte);
// 初始化函数
void LCD1602_Init(void);
//显示单个字符
void LCD1602_DispChar(unsigned char Row,unsigned char Column,unsigned char wChar);
//显示字符串
void LCD1602_DispString(unsigned char Row,unsigned char Column,char wString[]);
//显示无符号数字
void LCD1602_DispUnInt(unsigned char Row, unsigned char Column, unsigned int wNum, unsigned char Length);
//显示有符号数字
void LCD1602_DispInt(unsigned char Row, unsigned char Column,int wNum, unsigned char Length);
//显示无符号整型的16进制表示
void LCD1602_DispUnInt_Hex(unsigned char Row, unsigned char Column, unsigned int wNum, unsigned char Length);
//显示无符号整型的2进制表示
void LCD1602_DispUnInt_Bin(unsigned char Row, unsigned char Column, unsigned int wNum, unsigned char Length);
//显示单精度浮点数(有符号)
void LCD1602_DispFloat(unsigned char Row, unsigned char Column, float wNum, unsigned char Total_Len, unsigned char Frac_len);

#endif

- LCD1602.c

#include <REGX52.H>

//下面这些有可能需要更改
/***************************************************************/
// 重新命名端口
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P2^7;
#define  LCD1602_DB P0


// LCD1602专用延时函数,晶振11.0592MHz,延时1ms
void LCD1602_Delay1ms(void){//@11.0592MHz
	unsigned char i, j;
	i = 2;
	j = 199;
	do{
		while (--j);
	}while (--i);
}
/***************************************************************/

/***************************************************************/
/**
  * @brief :LCD1602写指令。
  * @param :wByte指令。
  * @retval :无。
 */
void LCD1602_WriteCommd(unsigned char wByte){// LCD1602写指令
  LCD1602_EN = 0;
  LCD1602_RS = 0;
  LCD1602_RW = 0;
  LCD1602_DB = wByte;
  LCD1602_EN = 1;
  LCD1602_Delay1ms();//延时1ms
  LCD1602_EN = 0;
  LCD1602_Delay1ms();//延时1ms
}

/**
  * @brief :LCD1602写数据。
  * @param :wByte数据。
  * @retval :无。
 */
void LCD1602_WriteData(unsigned char wByte){// LCD1602写数据
  LCD1602_EN = 0;
  LCD1602_RS = 1;
  LCD1602_RW = 0;
  LCD1602_DB = wByte;
  LCD1602_EN = 1;
  LCD1602_Delay1ms();//延时1ms
  LCD1602_EN = 0;
  LCD1602_Delay1ms();//延时1ms
}

/**
  * @brief :设置光标位置。
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @retval :无。
 */
void LCD1602_SetCursor(unsigned char Row,unsigned char Column){
    unsigned char LCD_AC=0x00;
    // 更新坐标位置
    if(Row==1){LCD_AC += (Column-1);}
    else      {LCD_AC += (0x40+Column-1);}
    // 设置光标位置
    LCD1602_WriteCommd(0x80|LCD_AC);
}

/**
  * @brief :无符号数的指数运算。
  * @param :x无符号整数基底。
  * @param :y无符号整数幂次。
  * @retval :result无符号整数运算结果。
 */
int LCD1602_Pow(int x, int y){//无符号数的指数运算
  unsigned int i;
  unsigned int result = 1;
  for(i=0;i<y;i++){
    result *= x;
  }
  return result;
}

/**
  * @brief :初始化函数。
  * @param :无。
  * @retval :无。
 */
void LCD1602_Init(void){// 初始化函数
  LCD1602_WriteCommd(0x38);//八位数据接口,两行显示,5*7点阵
  LCD1602_WriteCommd(0x0c);//显示开,光标关,闪烁关
  LCD1602_WriteCommd(0x06);//数据读写操作后,光标自动加一,画面不动
  LCD1602_WriteCommd(0x01);//清屏
}

/**
  * @brief :显示字符
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @param :wChar待显示的字符。
  * @retval :无。
 */
void LCD1602_DispChar(unsigned char Row,unsigned char Column,unsigned char wChar){//显示单个字符
  // 首先保证行列的位置有效,才运行函数
  if((Row==1 || Row==2) && Column>=1 && Column<=40){
    // 更新光标位置
    LCD1602_SetCursor(Row,Column);
    // 发送要显示的数据
    LCD1602_WriteData(wChar);
  }
}

/**
  * @brief :显示字符串
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @param :wString[]待显示的字符串。
  * @retval :无。
 */
void LCD1602_DispString(unsigned char Row,unsigned char Column,char wString[]){//显示字符串
  unsigned char i=0;
  // 首先保证行列的位置有效,才运行函数
  if((Row==1 || Row==2) && Column>=1 && Column<=40){
    // 更新光标位置
    LCD1602_SetCursor(Row,Column);
    // 发送要显示的数据
    while(wString[i]!='\0'){
      LCD1602_WriteData(wString[i]);
      i++;
    }    
  }
}
  
/**
  * @brief :显示无符号数字
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @param :wNum待显示的无符号数字,范围0~65535。
  * @param :Length在屏幕上显示的长度,范围1~16。
  * @retval :无。
 */
void LCD1602_DispUnInt(unsigned char Row, unsigned char Column,
                       unsigned int wNum, unsigned char Length){//显示无符号数字
  unsigned char i=0;
  unsigned char temp=0;//存储单个位上的数据
  // 首先保证行、列、显示长度有效,才运行函数
  if((Row==1 || Row==2) && Column>=1 && Column<=40 && Length>=1){
    // 1. 更新光标位置
    LCD1602_SetCursor(Row,Column);
    // 2.发送要显示的数据
    // 2.1 超过5位的长度都显示0
    if(Length>16){Length=16;}
    while(Length>5){
      LCD1602_WriteData(0x30);//直接发送'0'的ASCII码
      Length--;
    }
    // 2.2 5位以内的真实数值
    for(i=0;i<Length;i++){
      temp = (wNum/LCD1602_Pow(10,Length-1-i))%10;
      LCD1602_WriteData(0x30|temp);//直接计算ASCII码
    } 
  }
}

/**
  * @brief :显示有符号数字
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @param :wNum待显示的有符号数字,范围-32768~32767。
  * @param :Length在屏幕上显示的数字长度(包括正负号),范围1~16。
  * @retval :无。
 */
void LCD1602_DispInt(unsigned char Row, unsigned char Column,
                     int wNum, unsigned char Length){//显示有符号数字
  unsigned char i=0;
  unsigned char temp=0;//存储单个位上的数据
  unsigned int un_wNum=0;
  // 首先保证行、列、显示长度有效,才运行函数
  if((Row==1 || Row==2) && Column>=1 && Column<=40 && Length>=2){
    // 1. 更新光标位置
    LCD1602_SetCursor(Row,Column);
    // 2. 发送要显示的数据
    // 2.1 显示正负号,并将原来的数字转换成正数
    if(Length>16){Length=16;}
    if(wNum>=0){LCD1602_WriteData('+'); un_wNum=wNum;}
    else       {LCD1602_WriteData('-'); un_wNum=-wNum;}
    Length--;
    // 2.2 超过5位的长度都显示0
    while(Length>5){
      LCD1602_WriteData(0x30);//直接发送'0'的ASCII码
      Length--;
    }
    // 2.3 5位以内的真实数值
    for(i=0;i<Length;i++){
      temp = (un_wNum/LCD1602_Pow(10,Length-1-i))%10;
      LCD1602_WriteData(0x30|temp);//直接计算ASCII码
    } 
  }
}

/**
  * @brief :显示无符号整型的16进制表示。
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @param :wNum待显示的无符号数字,范围0~65535。
  * @param :Length在屏幕上显示的16进制长度,范围1~4。
  * @retval :无。
 */
void LCD1602_DispUnInt_Hex(unsigned char Row, unsigned char Column,
                           unsigned int wNum, unsigned char Length){//显示无符号整型的16进制表示
  unsigned char i=0;
  unsigned char temp=0;//存储单个位上的数据
  // 首先保证行、列、显示长度有效,才运行函数
  if((Row==1 || Row==2) && Column>=1 && Column<=40&& Length>=1){
    // 1. 更新光标位置
    LCD1602_SetCursor(Row,Column);
    // 2. 发送要显示的数据
    if(Length>4){Length=4;}
    else        {wNum = (wNum<<(4*(4-Length)))>>(4*(4-Length));}//根据要显示的长度截取有用的位
    for(i=0;i<Length;i++){
      temp = (wNum>>((Length-1-i)*4))%16;
      if(temp>=0 && temp<=9){LCD1602_WriteData('0' + temp);}
      else                  {LCD1602_WriteData('A' + temp - 10);}
    } 
  }
}

/**
  * @brief :显示无符号整型的2进制表示。
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @param :wNum待显示的无符号数字,范围0~65535。
  * @param :Length在屏幕上显示的2进制长度,范围1~16。
  * @retval :无。
 */
void LCD1602_DispUnInt_Bin(unsigned char Row, unsigned char Column,
                           unsigned int wNum, unsigned char Length){//显示无符号整型的2进制表示
  unsigned char i=0;
  // 首先保证行、列、显示长度有效,才运行函数
  if((Row==1 || Row==2) && Column>=1 && Column<=40&& Length>=1){
    // 1. 更新光标位置
    LCD1602_SetCursor(Row,Column);
    // 2. 发送要显示的数据
    if(Length>16){Length=16;}
    for(i=0;i<Length;i++){
      if(wNum&(0x0001<<(Length-1-i))) {LCD1602_WriteData('1');}
      else                            {LCD1602_WriteData('0');}
    } 
  }
}

/**
  * @brief :显示单精度浮点数(有符号)。
  * @param :Row行,范围1~2。
  * @param :Column列,范围1~40。
  * @param :wNum待显示的小数,范围-3.4E38~3.4E38。
  * @param :Total_Len在屏幕上显示的总长度长度(包括正负号),范围3~16。
  * @param :Frac_len在屏幕上显示的小数部分的长度,范围1~16。
  * @retval :无。
  * 说明:优先显示小数部分。
 */
void LCD1602_DispFloat(unsigned char Row, unsigned char Column,
                       float wNum, unsigned char Total_Len,
                       unsigned char Frac_len){//显示单精度浮点数(有符号)
  unsigned char Int_len = Total_Len-2-Frac_len; //整数段长度
  unsigned int Int_part=0, Fra_part=0;
  // 首先保证行、列、显示长度有效,才运行函数
  if((Row==1 || Row==2) && Column>=1 && Column<=40 && Total_Len>=3){
    //1. 显示正负号,并将原来的数字转化成绝对值
    if(wNum>=0){LCD1602_DispChar(Row,Column,'+');}
    else       {LCD1602_DispChar(Row,Column,'-'); wNum=-wNum;}
    //2. 获取整数部分、小数部分
    Int_part=(unsigned int)wNum;
    Fra_part = ((unsigned int)(wNum*LCD1602_Pow(10,Frac_len)))%LCD1602_Pow(10,Frac_len);
    //3. 显示整数部分
    LCD1602_DispUnInt(Row,Column+1,Int_part,Int_len);
    //4. 显示小数点
    LCD1602_DispChar(Row,Column+1+Int_len,'.');
    //5. 显示小数部分
    LCD1602_DispUnInt(Row,Column+2+Int_len,Fra_part,Frac_len);

  }
}

编程感想:

  1. 关于 sbitsfrsbit可以直接在等式右边使用端口名,而sfr在等式右边只能写地址。所以一般使用宏定义#define来完成对于一个寄存器的重命名。
  2. 函数定义时声明的简写:51单片机用的C89没有简写,只要没写就默认为int型。
  3. 传递字符串:直接将字符串给函数,那么形参定义是应使用 char 形参名[]或者 char *形参名的形式。另外,在主函数中传递数组形式的变量进函数时,都是传递的数组首元素地址。在函数中,数组的调用格式 形参名[i]与解引用格式 *(形参名+i)相同。
  4. 天坑:LCD读写数据的时序中,使能信号 EN持续的时间,不能按照器件手册中的us级别,而是要延时大约1ms。
  5. C语言没有自带的指数运算符,^表示的按位异或。而头文件<Math.h>中的pow(x,y)函数,两个操作数都是float类型。
  6. 关于移屏:有两种可能,一是移为速度过快;二是VLCD驱动电压过高。但目前暂未找到解决方法。

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

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

相关文章

【Java 数据结构】实现一个二叉搜索树

目录 1、认识二叉搜索树 2、实现一个二叉搜索树 2.1 成员变量 2.2 insert 方法 2.3 search 方法 2.4 remove 方法(重点) 3、二叉搜索树总结 1、认识二叉搜索树 从字面上来看&#xff0c;它只比二叉树多了搜索两个字&#xff0c;我们回想一下&#xff0c;如果要是在二…

linux性能优化-CPU上下文切换

疑问&#xff1a;进程在竞争CPU时并没有真正运行&#xff0c;为什么还会导致系统的负载升高&#xff1f; 因为存在CPU上下文切换。 linux系统说明 Linux是一个多任务操作系统&#xff0c;它支持远大于CPU数量的任务同时运行。当然&#xff0c;这些任务实际上并不是真的在同时…

pytorch-lightning中使用wandb实现超参数搜索

由于最近涉及下游任务微调&#xff0c;预训练任务中的框架使用的是pytorch-lightning&#xff0c;使用了典型的VLP(vision-language modeling)的训练架构&#xff0c;如Vilt代码中&#xff1a;https://github.com/dandelin/ViLT&#xff0c;这类架构中只涉及到预训练&#xff0…

51单片机学习-5定时器与中断

5 定时器与中断 [toc] 注&#xff1a;笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注&#xff1a;工程及代码文件放在了本人的Github仓库。 5.1 定时器原理与中断系统 5.1.1 定时器原理 CPU的时序指标有&#xff1a; 振…

C语言预处理命令是什么?

C语言源文件要经过编译、链接才能生成可执行程序&#xff1a;1) 编译&#xff08;Compile&#xff09;会将源文件&#xff08;.c文件&#xff09;转换为目标文件。对于 VC/VS&#xff0c;目标文件后缀为.obj&#xff1b;对于GCC&#xff0c;目标文件后缀为.o。编译是针对单个源…

ESP32设备驱动-ADS1015(ADC)驱动

ADS1015(ADC)驱动 1、ADS1015介绍 ADS1015 是一款具有 12 位分辨率的精密模数转换器 (ADC),采用超小型无引线 QFN-10 封装或 MSOP-10 封装。 ADS1015 的设计考虑了精度、功率和易于实施。 ADS1015 具有板载基准和振荡器。 数据通过 I2C 兼容的串行接口传输; 可以选择四个 I…

Portapack应用开发教程(十八)NavTex接收 C

有段时间没研究NavTex了&#xff0c;这段时间打算捡起来继续搞。 上一篇文章中&#xff0c;我用frisnit生成了wav文件。然后再用gnuradio观察波形&#xff0c;发现波形确实能与frisnit中的描述以及python解码程序中的dictionary对应上。 接下来&#xff0c;我要重点想办法自己…

Rust机器学习之petgraph

Rust机器学习之petgraph 图作为一种重要的数据结构和表示工具在科学和技术中无处不在。因此&#xff0c;许多软件项目会以各种形式用到图。尤其在知识图谱和因果AI领域&#xff0c;图是最基础的表达和研究工具。Python有著名的NetworksX库&#xff0c;便于用户对复杂网络进行创…

apt命令详解

apt&#xff08;Advanced Packaging Tool&#xff09;是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。 apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令&#xff0c;而且命令简洁而又好记。 apt 命令执行需要超级管理员权限(root)。前些日子…

基于java ssm springboot宠物用品商城系统

基于java ssm springboot宠物用品商城系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

Python 基础语法介绍(一)

文章目录一、概述二、变量1&#xff09;变量定义2&#xff09;定义变量的规则3&#xff09;变量命名规范4&#xff09;变量类型转换三、注释1&#xff09;单行注释2&#xff09;多行注释1、单引号&#xff08;&#xff09;注释2、双引号&#xff08;"""&#xf…

Kubernetes 体验 kubecolor

Kubernetes 体验 kubecolorkubecolor 概述Github 地址安装 kubecolor设置.bashrc使用 kubecolorkubecolor 概述 对你的kubectl输出进行着色。 kubecolor在内部调用kubectl命令并尝试对输出进行着色&#xff0c;因此你可以将kubecolor作为kubectl的一个完整的替代品。这意味着…

JAVA经典面试题带答案(一)

目录 1、JDK 和 JRE 有什么区别&#xff1f; 2、 和 equals 的区别是什么&#xff1f; 3、final 在 java 中有什么作用&#xff1f; 4、java 中的 Math.round(-1.5) 等于多少&#xff1f; 5、String 属于基础的数据类型吗&#xff1f; 不属于。 6、String str"i&quo…

51单片机学习笔记-13直流电机

13 直流电机 [toc] 注&#xff1a;笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注&#xff1a;工程及代码文件放在了本人的Github仓库。 13.1 直流电机与PWM波 13.1.1 直流电机 直流电机是一种将电能转换为机械能的装置…

Docker -- 部署Mysql主从服务

以下是配置一主两从的Mysql服务的具体流程。 文章目录创建用于挂载的目录修改cnf配置拉取mysql服务镜像自定义docker网络启动容器主库配置查看主库状态创建从库备份用户从库配置修改Master信息启动slave服务查看slave服务状态是否正常创建用于挂载的目录 保证数据的持久化&…

Databend 内幕大揭秘第二弹 - Data Source

本篇是 minibend 系列的第二期&#xff0c;将会介绍 Data Source 部分的设计与实现&#xff0c;当然&#xff0c;由于是刚开始涉及到编程的部分&#xff0c;也会提到包括 类型系统 和 错误处理 之类的一些额外内容。 前排指路视频和 PPT 地址 视频&#xff08;哔哩哔哩&#xf…

23种设计模式之趣味学习篇

23种设计模式之趣味学习篇1. 设计模式概述1.1 什么是设计模式1.2 设计模式的好处2. 设计原则分类3. 详解3.1 单一职责原则3.2 开闭原则3.3 里氏代换原则3.4 依赖倒转原则3.5 接口隔离原则3.6 合成复用原则3.7 迪米特法则4. Awakening1. 设计模式概述 我们的软件开发技术也包括一…

【1669. 合并两个链表】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点的位置。 下图中蓝色边和节点…

【算法竞赛学习】csoj:寒假第二场

文章目录前言红包接龙最后一班勇者兔兔兔爱消除吃席兔知识拓展std::greater | 堆优化参考iota函数参考并查集参考sort自定义函数参考树形dp参考使用auto时控制分隔符前言 由于本人菜鸡&#xff0c;所以大多都是使用出题人的代码和思路 如有侵权&#xff0c;麻烦联系up删帖&…

pytorch_sparse教程

pytorch_sparse教程 Coalesce torch_sparse.coalesce(index, value, m, n, op"add") -> (torch.LongTensor, torch.Tensor) 逐行排序index并删除重复项。通过将重复项映射到一起来删除重复项。对于映射&#xff0c;可以使用任何一种torch_scatter操作。 参数 i…