51单片机之按键和数码管

news2024/11/16 20:46:08

在这里插入图片描述

51单片机之按键和数码管

  • ✍前言:
  • ♐独立按键
    • 😀独立按键的原理
    • 😀软件实现按键控制LED灯的亮灭
  • ♐数码管
    • 😊数码管显示数字或者字母的原理
      • 🐉共阳极数码管
      • 🐉共阴极极数码管
      • 🐉4位1体数码管
    • 😊静态数码管
    • 😊动态数码管
      • 🦑动态数码管的原理
      • 🦑延时的目的
      • 🦑消影处理
  • ♐矩阵键盘
    • 🛤️使用矩阵键盘控制数码管显示0~f
  • ⭕总结

✍前言:

在学习了如何使用51单片机控制LED之后,我们进一步来学习使用按键来控制LED。

♐独立按键

😀独立按键的原理

下图是我们普中单片机开发板A2的独立按键原理图:
可以看到之所以称之为独立按键,是因为每个按键单独占用一个I/O口。

在这里插入图片描述
默认的情况,我们的P31口由于有上拉电阻会输出一个高电平,当按下按键K1后,P31那条支路回导通,此时P31会输出低电平,看下面这张图片,它是51单片机的准双向IO口内部图,可以帮助你更好的理解上面那段话:

在这里插入图片描述
红色的框就是一个IO口,当按键没有按下,回路是一条断路,由于有VCC和上拉电阻的存在会输出高电平,但是当按键按下,按键回路导通,电压为0,所以输出一个低电平。这里提一嘴,单片机IO口输出的是电压。

通过软件编程判断与该按键对应的IO口的电平情况我们就可以完成一些功能。

😀软件实现按键控制LED灯的亮灭

先上代码:

#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;

sbit k1 = P3^1;//设置按键K1对应的单片机IO口
sbit LED = P2^0;

void delay(u16 i)
{
	while(i--);
}
void key_scan()//按键扫描
{
	if(0 == k1)
	{
	    delay(1000);//消抖,10ms
	    if(0 == k1)
		{
		   LED = ~LED;
		}
		while(!k1); 
	}
}

void main()
{
	while(1)
	{
	  key_scan();
	}
}

实验效果演示:

在这里插入图片描述
由于按键按下的时候,由于机械具有一定的弹性,它不会马上按下去,松开也是不会马上松开,而是会有5~10ms的抖动。

在这里插入图片描述

上述程序是传统的消抖方法,存在占用cpu过多的问题,如果小伙伴有兴趣,可以去学习一些更加优的消抖程序。

♐数码管

😊数码管显示数字或者字母的原理

我的开发板是八段的数码管,8段数码管是由字母a,b,c,d,e,f,g,dp八段组成的数码管,它比七段数码管多了一段也就是小数点(dp),8段对应8个LED,想要显示相应的字母或者数字,让相应的LED亮就可以了,我们主要介绍一下8段数码管。

8段数码管按照这8个LED共同接的是阴极还是阳极,又分为共阴数码管和共阳数码管,下面我们来借助原理图具体的介绍一下他们两个,它们显示不同的数字或者字符的段码(该字符或者数字的二进制代码)。

🐉共阳极数码管

在这里插入图片描述

阳极就是正极,共阳极意思就是标号a~dp的各个并联的支路是有一个共同的阳极,如果你希望某个位置亮就应该给对应IO口输出低电平。

下面我们给出对应的段码:以0来举例子:

在这里插入图片描述
理解了0的共阳极16进制码,其它的想必小伙伴们也能自己写出来,下面我们给出0~f的段码:

在这里插入图片描述

🐉共阴极极数码管

共阴和共阳对应,a~dp有一个共同的阴极。

在这里插入图片描述
我们以1为例子,给出1的段码推导:
在这里插入图片描述
0~f的共阴段码表为:

在这里插入图片描述

🐉4位1体数码管

我的开发板刚好就是共阴的,这是它的原理图:
在这里插入图片描述
红色的数字是网络标号,相同代表连在一起。

我们的板子的数码管采用的是4个数码管封装在一起的模式,简称四位一体,如果用正常的方式来控制它们就需要8个IO口,这太占用资源了,我们单片机一共就只有32个IO口,这里我们的板子用到了74138芯片,这种芯片使用3个IO口就可以控制8个IO口。

4位一体中的8段数码管共用共同的a~dp由P00~P07控制其值,我们通过改变P0改变码值。

在这里插入图片描述
通过上图我们可以得到,这个74138由单片机的P22、P23、P24三个IO口控制,通过控制这三个IO口的值,我们就可以控制哪个位置的数码管点亮,这是它的真值表:

在这里插入图片描述
A2是高位,A0是低位,这个74138芯片还有E1、E2、E3三个引脚,其中E1、E2上面有一个非的符号,表示低电平有效,E3表示高电平有效,如果没有正确设置E1、E2、E3,我们的输出LED1~LED8都是高电平,数码管是不会工作的,因为LED1~LED8实际上是数码管的阴极,它和它控制的数码管的a~dp位置都是并联的,每一个位置的LED方向已经确定(指向阴极),发光二极管的特性:正向导通反向截止。但是说了这么多E1、E2、E3都不用我们设置,板子在制的时候已经就接好了。

要怎么控制这个位码呢?A2A1A0是二进制数,它们十进制的值为i,Yi就为高电平取反就是它的输出,为低电平。与LEDi+1相连的数码管会显示对应的值。

上面的知识我们在软件编程里会用到的,通过给74HC138的A0~A3管脚对应的IO口赋值控制哪一个位点亮,然后通过给P0赋段码值,控制点亮的内容。

😊静态数码管

程序实现的功能:让最后一个数码管显示数字1

 #include "reg52.h" // 引入 8051 单片机的头文件

typedef unsigned int u16; // 定义无符号整型变量 u16
typedef unsigned char u8; // 定义无符号字符型变量 u8

sbit LSA = P2^2; // 定义 P2^2 引脚为 LSA
sbit LSB = P2^3; // 定义 P2^3 引脚为 LSB
sbit LSC = P2^4; // 定义 P2^4 引脚为 LSC


u8 code smgduan[] = { 0x3f,0x06,0x5b,0x4f,
                      0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,
                      0x39,0x5e,0x79,0x71};// 数码管段码数据表,0~f

u8 code Digital_tube_number[][3] = {{0,0,0},{1,0,0},{0,1,0},{1,1,0},{0,0,1},{1,0,1},{0,1,1},{1,1,1}}; // 位码数据表


// 数码管动态显示函数
void Dynamic_digital_tube(u8 wei,u8 duan)
{
   //设置数字或者字母显示的位置
   LSA =  Digital_tube_number[wei][0];
   LSB =  Digital_tube_number[wei][0];
   LSC =  Digital_tube_number[wei][0];
   P0 = smgduan[duan];//设置P0为相应的段码值,显示该数字或字母
}

int main()
{
	while(1) // 主循环
	{
	  	Dynamic_digital_tube(0,1); // 调用动态数码管显示函数
	}
   return 0; // 返回 0,表示正常结束
}

效果演示:

在这里插入图片描述

这段代码相信大家很容易看懂,就是先设置位码,再设置段码。

😊动态数码管

程序实现的功能:让前面的几个数码管,同时显示数字5201314

🦑动态数码管的原理

相信大家会有疑惑,明明74LS138一次只能输出一个位置为低电平,如何让不同的位置同时显示数字呢?其实这和之前我们LED不能正常闪烁的原理是一样的,利用了人眼只能看到50HZ左右的变化,太快了人眼是无法观测到的,也就是说实际上是依次点亮的,但是对于我们的眼睛来说,就好像同时显示一样,由于数码管点亮的位置一直在变所以又叫做动态数码管。

#include "reg52.h" // 引入 8051 单片机的头文件

typedef unsigned int u16; // 定义无符号整型变量 u16
typedef unsigned char u8; // 定义无符号字符型变量 u8

sbit LSA = P2^2; // 定义 P2^2 引脚为 LSA
sbit LSB = P2^3; // 定义 P2^3 引脚为 LSB
sbit LSC = P2^4; // 定义 P2^4 引脚为 LSC


u8 code smgduan[] = {0x06,0x4f,0x06,0x66,0x6d,0x5b,0x3f}; // 数码管段码数据表,1314520
u8 code Digital_tube_number[][3] = {{0,0,0},{1,0,0},{0,1,0},{1,1,0},{0,0,1},{1,0,1},{0,1,1},{1,1,1}}; // 位码数据表

// 延时函数,参数 i1 为延时时间
void delay(u16 i1)
{
   while(i1--); // 空循环实现延时
}

// 数码管动态显示函数
void Dynamic_digital_tube()
{
    u8 i;
	for(i = 7; i >= 1; --i) // 从 7 到 1 循环
	{
	  LSA = Digital_tube_number[i][0]; // 设置 LSA 引脚的状态
	  LSB = Digital_tube_number[i][1]; // 设置 LSB 引脚的状态
	  LSC = Digital_tube_number[i][2]; // 设置 LSC 引脚的状态
	  P0 = smgduan[7-i]; // 在数码管显示对应的段码数据
	  delay(100); // 延时 1000微秒(1ms)
	  P0 = 0x00; // 关闭所有段,熄灭数码管
	} 
}

int main()
{
	while(1) // 主循环
	{
	  	Dynamic_digital_tube(); // 调用动态数码管显示函数
	}
   return 0; // 返回 0,表示正常结束
}

效果演示:

在这里插入图片描述

动态数码管模块的几个关键的解释:

🦑延时的目的

细心的小伙伴可能会发现,在我们的Dynamic_digital_tube函数中,在设置位选和段选之后,我们延时了1ms,可能你不理解为什么要这样去做,我们删除这个延时语句,看效果:

在这里插入图片描述
可以看到数字明显变暗了,可能原因是你程序执行的太快了,理想的二极管还没有稳定的导通,就已经将段码清零了。
在这里插入图片描述

注意不能延时的太长,否则数码管依次点亮的过程我们的眼睛就能察觉到了。

🦑消影处理

我们动态扫描程序执行的顺序是设置位码->设置段码->设置位码->设置位码。

如果在执行一次之后不把段码清0(都设置为低电平,让其什么都不显示),设置新的位码后,由于程序执行到设置新的段码需要一定的时间,新的数码管会显示之前的段码对应的数字,就会出现重影。

不消影的效果:

在这里插入图片描述

可以看到重影的情况还是非常严重,所以一个位置显示之后必须把段码设置为0x00,也就是让数码管什么都不显示。

♐矩阵键盘

有时候我们想使用很多按键,但是没有那么多IO口,这个时候就需要使用矩阵按键,它的1行或者一列的按键只需要一个IO口来控制。

通常一个键盘是由两个IO口控制的(行和列),一个IO口控制一行或者列。所以一个矩阵键盘有多少个键是由IO口决定的,即控制行的IO口 ∗ * 控制列的IO口。

在这里插入图片描述
我们的原理图就是采用的四行四列的模式。

那么问题来了,我们该如何判断是否有按键按下呢?我们以S1为例,来解释一下:

在这里插入图片描述

🛤️使用矩阵键盘控制数码管显示0~f

我们的程序是一行一行的点击按键依次显示0~f,你也可以按照一列一列的来点击按键依次显示0~F,更改一下keyValue值就可以。

#include "reg52.h" // 包含 8051 单片机的寄存器定义文件

typedef unsigned int u16; // 定义无符号 16 位整数类型
typedef unsigned char u8; // 定义无符号 8 位整数类型

sbit LSA = P2^2; // 数码管位选引脚
sbit LSB = P2^3; // 数码管位选引脚
sbit LSC = P2^4; // 数码管位选引脚

#define GPIO_DIG P0 // 数码管的数据端口
#define GPIO_KEY P1 // 按键的端口

u8 KeyValue = 16; // 按键值初始化为 16(用于标识未按下任何按键)
u8 code smgduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; // 数码管显示的数值对应的段码

void delay(u16 i1) {
    while (i1--); // 延时函数
}

// 检测按键函数
void KeyDown() {
    u8 a = 0;
    GPIO_KEY = 0x0f; // 设置高四位为低电平,用于检测按键
    
    if (GPIO_KEY != 0x0f) { // 如果按键有按下
        delay(1000); // 延时10ms
        GPIO_KEY = 0x0f; // 再次设置高四位为低电平,用于检测按键的列位置
        if (GPIO_KEY != 0x0f) {
            switch (GPIO_KEY) {
                case (0x07): KeyValue = 0; break;
                case (0x0b): KeyValue = 1; break;
                case (0x0d): KeyValue = 2; break;
                case (0x0e): KeyValue = 3; break;
            }
        }
        GPIO_KEY = 0xf0; // 设置低四位为低电平,用于检测按键的行位置
        if (GPIO_KEY != 0x0f) {
            switch (GPIO_KEY) {
                case (0x70): KeyValue += 0; break;
                case (0xb0): KeyValue += 4; break;
                case (0xd0): KeyValue += 8; break;
                case (0xe0): KeyValue += 12; break;
            }
        }
        while (a < 50 && GPIO_KEY != 0xf0) { // 延时和检测按键松开
            delay(1000);
            ++a;
        }
    }
}

void main() {
    LSA = 0;
    LSB = 0;
    LSC = 0;
    GPIO_DIG = 0x00; // 初始化数码管和端口
    while (1) {
        KeyDown(); // 调用按键检测函数
        if (KeyValue >= 0 && KeyValue <= 15) // 检测按键值范围
            GPIO_DIG = smgduan[KeyValue]; // 在数码管显示按键对应的数字
    }
}

演示效果:

在这里插入图片描述

如果你希望一列一列的点击显示0~F,程序可以这样改:

#include "reg52.h" // 包含 8051 单片机的寄存器定义文件

typedef unsigned int u16; // 定义无符号 16 位整数类型
typedef unsigned char u8; // 定义无符号 8 位整数类型

sbit LSA = P2^2; // 数码管位选引脚
sbit LSB = P2^3; // 数码管位选引脚
sbit LSC = P2^4; // 数码管位选引脚

#define GPIO_DIG P0 // 数码管的数据端口
#define GPIO_KEY P1 // 按键的端口

u8 KeyValue = 16; // 按键值初始化为 16(用于标识未按下任何按键)
u8 code smgduan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; // 数码管显示的数值对应的段码

void delay(u16 i1) {
    while (i1--); // 延时函数
}

// 检测按键函数
void KeyDown() {
    u8 a = 0;
    GPIO_KEY = 0x0f; // 设置高四位为低电平,用于检测按键
    
    if (GPIO_KEY != 0x0f) { // 如果按键有按下
        delay(1000); // 延时10ms
        GPIO_KEY = 0x0f; // 再次设置高四位为低电平,用于检测列
        if (GPIO_KEY != 0x0f) {
		    KeyValue = 0;//先初始化一下KeyValue
            switch (GPIO_KEY) {
                case (0x07): KeyValue = 0; break;
                case (0x0b): KeyValue = 4; break;
                case (0x0d): KeyValue = 8; break;
                case (0x0e): KeyValue = 12; break;
            }
        }
        GPIO_KEY = 0xf0; // 设置低四位为低电平,用于检测行
        if (GPIO_KEY != 0x0f) {
            switch (GPIO_KEY) {
                case (0x70): KeyValue += 0; break;
                case (0xb0): KeyValue += 1; break;
                case (0xd0): KeyValue += 2; break;
                case (0xe0): KeyValue += 3; break;
            }
        }
        while (a < 50 && GPIO_KEY != 0xf0) { // 检测按键松开
            delay(1000);
            ++a;
        }
    }
}

void main() {
    LSA = 0;
    LSB = 0;
    LSC = 0;
    GPIO_DIG = 0x00; // 初始化数码管和端口
    while (1) {
        KeyDown(); // 调用按键检测函数
        if (KeyValue >= 0 && KeyValue <= 15) // 检测按键值范围
            GPIO_DIG = smgduan[KeyValue]; // 在数码管显示按键对应的数字
    }
}

效果演示:

在这里插入图片描述

最后提一嘴,软件里给矩阵键盘的IO口设置合适的值,可以将其一行或者一列当成独立按键来使用哦(判断方法也和独立按键判断的方法相似)。

⭕总结

本篇博客主要讲了按键和数码管的相关知识,下面是关于它的思维导图,欢迎大家提出建议和指出不足指出谢谢,希望本篇博客对小伙伴有所帮助。

在这里插入图片描述

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

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

相关文章

解决:Microsoft Visual C++ 14.0 is required.

Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools 当我们安装绝大部分python包的时候可以通过pip install 或者 conda install解决&#xff0c;但是任然有些包是安装不了的&#xff0c;比如我的就是在安装pyqt5的时候报Building wheel for…

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景在NEOAPI SDK里实现相机图像转换为Mat图像格式联合OpenCV实现相机图像转换为Mat图像格式测试演示图 工业相机…

整合【事务】

目录 1、读未提交&#xff08;脏读&#xff09; 2、读已提交&#xff08;不可重复读&#xff09; 3、可重复读&#xff08;幻读&#xff09; 4、Navicat中模拟开启、提交、回滚事务 1、读未提交&#xff08;脏读&#xff09; 允许一个事务读取其他事务未提交的修改 2、读已…

Nginx 的 gzip 压缩

目录 1. 为什么要开启gzip 压缩 2.对网站配置文件进行修改 1. 为什么要开启gzip 压缩 nginx使用gzip压缩主要是为了降低网站的带宽消耗和提升访问速度。通过对页面进行压缩&#xff0c;可以减少传输的数据量&#xff0c;从而减少网络传输的时间和带宽消耗。 当浏览器接收到压…

c语言-函数指针

目录 前言一、函数指针1.1 函数指针定义1.2 函数指针调用函数1.3 函数指针代码分析 总结 前言 本篇文章介绍c语言中的函数指针以及函数指针的应用。 一、函数指针 函数指针&#xff1a;指向函数的指针。 函数在编译时分配地址。 &函数名 和 函数名代表的意义相同&#xf…

Linux的ping命令、wget命令、curl命令

一、ping命令 通过ping命令&#xff0c;可以检查指定的网络服务器是否是可联通状态 形式&#xff1a;ping [-c num] ip或主机名 -c&#xff1a;检查的次数&#xff0c;不使用-c&#xff0c;将无限次数持续检查 ip或主机名&#xff1a;被检查的服务器的ip地址或主机名地址 …

透明OLED屏的稳定性:从技术角度及应用案例解析

在显示技术日新月异的今天&#xff0c;透明OLED屏以其独特的透明特性和出色的显示效果&#xff0c;吸引了众多关注。然而&#xff0c;对于这种新型技术的稳定性&#xff0c;人们难免会有所疑虑。作为一名专注于OLED技术研发的工程师&#xff0c;尼伽小编将从专业角度出发&#…

数据结构(五)——初识线性表

&#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ …

【Java集合篇】HashMap 在 get 和 put 时经过哪些步骤

HashMap在get和put时经过哪些步骤? ✔️ 典型解析✔️get方法✔️put方法✔️ 拓展知识仓✔️ HashMap如何定位key✔️ HashMap定位tablelndex的骚操作作✔️HashMap的key为null时&#xff0c;没有hashCode是如何存储的?✔️ HashMap的value可以为null吗? 有什么优缺点讷? …

STM32通用定时器-输入捕获-脉冲计数

一、知识点 编码器   两相编码器&#xff08;正交编码器&#xff09;&#xff1a;两相编码器由 A 相和 B 相组成&#xff0c;相位差为 90 度。当旋转方向为顺时针时&#xff0c;A 相先变化&#xff0c;然后 B 相变化&#xff1b;当旋转方向为逆时针时&#xff0c;B 相先变化…

让人头痛事务问题到底要如何解决?

前言 正好前段时间我在公司处理过这个问题&#xff0c;我们当时由于项目初期时间比较紧张&#xff0c;为了快速完成业务功能&#xff0c;忽略了系统部分性能问题。项目顺利上线后&#xff0c;专门抽了一个迭代的时间去解决大事务问题&#xff0c;目前已经优化完成&#xff0c;并…

【Linux Shell】7. printf 命令

文章目录 【 1. printf 命令的使用方法 】【 2. 实例 】 【 1. printf 命令的使用方法 】 printf 命令模仿 C 程序库&#xff08;library&#xff09;里的 printf() 程序&#xff0c;printf 由 POSIX 标准所定义&#xff0c;因此使用 printf 的脚本比使用 echo 移植性好。prin…

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于引力搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于引力搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

互联网演进历程:从“全球等待”到“全球智慧”的技术革新与商业变革

文章目录 一、导言二、World Wide Wait (全球等待)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 三、World Wide Web (万维网)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 四、World Wide Wisdom (全球智慧)阶段1. 技术角度2. 用户体验3. 企业收益4. 教育影响 五、…

静态网页设计——电影角(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;本网页主要利用HTML语言编写&#xff0c;简要介绍世界上一些主要国家&#xff0c;例如&#xff0c;中&#xff0c;…

从马尔可夫奖励过程到马尔可夫决策到强化学习【02/2】

一、说明 随着 Open AI 于 2023 年 11 月 6 日发布GPT 代理&#xff0c;我们所有人都对它带来的支持和灵活性着迷。想象一下&#xff0c;有一个个性化的数字助手始终在您身边&#xff0c;根据您的喜好完成日常平凡任务或艰巨任务。但为这些定制代理提供动力的是强化学习&#x…

厚积薄发11年,鸿蒙究竟有多可怕

12月20日中国工程院等权威单位发布**《2023年全球十大工程成就》。本次发布的2023全球十大工程成就包括“鸿蒙操作系统”在内。入围的“全球十大工程成就”&#xff0c;主要指过去五年由世界各国工程科技工作者合作或单独完成且实践验证有效的&#xff0c;并且已经产生全球影响…

指针数组做main函数的形参

目录 ​编辑 1. 指针数组 1.1 基本概念 1.2 简单示例 2. 指针数组做main形参 2.1 int main(int argc, char *argv[]); 2.2 简单示例 1. 指针数组 1.1 基本概念 指针数组是指一个数组&#xff0c;其中的每个元素都是指针。 这意味着数组中的每个元素都存储一个地址&…

啊哈c语言——逻辑挑战8:验证哥德巴赫猜想

上面这封书信是普鲁士数学家哥德巴赫在1742年6月7日写给瑞士数学家欧拉的&#xff0c;哥德巴赫在书信中提出了“任一大于2的整数都可以写成3个质数之和”的猜想。当时&#xff0c;哥德巴赫遵照的是“1也是素数”的约定。现今&#xff0c;数学界已经不使用这个约定了。哥德巴赫原…

LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架

文章首发于公众号&#xff1a;机器感知 LLM增强LLM&#xff1b;通过预测上下文来提高文生图质量&#xff1b;Spikformer V2&#xff1b;同时执行刚性和非刚性编辑的通用图像编辑框架 LLM Augmented LLMs: Expanding Capabilities through Composition 本文研究了如何高效地组…