【STC8A8K64D4开发板】第2-12讲:数码管显示

第2-12讲:数码管显示

    1. 学习目的
  1. 了解数码管分类、工作原理及驱动电路的设计。
  2. 掌握STC8A8K64D4系列单片机驱动8位共阴数码管的动态显示的软件设计。
    1. 数码管概述

数码管是一种常用的显示设备,他有着价格便宜、使用简单的特点,在各个领域被广泛的应用,如空调、电子万年历、冰箱等等。学习数码管相关的编程之前,我们有必要了解一下数码管的一些概念和操作方式。

数码管也称LED数码管(LED Segment Displays),其是由多个发光二极管封装在一起组成。

  1. 数码管的“段”

常用的数码管有七段数码管和八段数码管,如下图所示。7段数码管由七个条状发光二极管组成,8段数码管由七个条状和一个点状发光二极管,即8段数码管比7段数码管多一个发光二极管单元(多一个小数点)。如果需要显示带小数的数据,应选用8段数码管。开发板上使用的是8段数码管。

图1:8段数码管比7段数码管

  1. 数码管的“位”

数码管按能显示多少个“8”可分为1位、2位、4位等数码管,如下图所示。开发板上使用的是8位数码管。

图2:数码管

  1. 共阴极和共阳极数码管

数码管按发光二极管单元连接方式分为共阴极数码管和共阳极数码管,如下图所示。

图3:共阳极和共阴极数码管

  1. 共阳极:正极连接在一起,作为公共端。负极单独控制,施加低电平(逻辑0),对应的“段”点亮,施加高电平(逻辑1),对应的“段”熄灭。
  2. 共阴极:负极连接在一起,作为公共端。正极单独控制,施加低电平(逻辑0),对应的“段”熄灭,施加高电平(逻辑1),对应的“段”点亮。
  1. 位选和段选

一般地,操作数码管时,先执行段选再执行位选。位选是选择待操作的数码管,如开发板上的是8位数码管,位选就是选择8位数码管中的某一个。段选是选择数码管里面的LED灯,即通过选择点亮响应的LED灯以达到显示需要的数据的目的。

  1. 段码

数码管的段码指的是数码管在显示不同的数据时,段选信号对应的二进制数据。下图是以8段共阴极数码管显示数字7为例来描述段码。

图4:共阴极数码管显示数字7时的段码

对于共阴极数码管来说,段的正极为高电平“逻辑1”时,段点亮,段的正极为低电平“逻辑0”时,段熄灭。如要显示数字“7”,需要点亮段A、段B和段C,8个段的负极对应的二进制数据为11100000,换算成16进制即为0xE0。如果是共阳极数码管,正好和共阴极数码管相反,8个段的正极对应的二进制数据为00000111,换算成16进制即为0x07。

由此,我们即可得出共阴极数码管显示的段码表,如下表所示。

表1:共阴极数码管显示的段码表

字形

A

B

C

D

E

F

G

DP

段码(共阴)

0

1

1

1

1

1

1

0

0

FC H

1

0

1

1

0

0

0

0

0

60 H

2

1

1

0

1

1

0

1

0

DA H

3

1

1

1

1

0

0

1

0

F2 H

4

0

1

1

0

0

1

1

0

66 H

5

1

0

1

1

0

1

1

0

B6 H

6

1

0

1

1

1

1

1

0

BE H

7

1

1

1

0

0

0

0

0

E0 H

8

1

1

1

1

1

1

1

0

FE H

9

1

1

1

1

0

1

1

0

F6 H

A

1

1

1

0

1

1

1

0

EE H

B

0

0

1

1

1

1

1

0

3E H

C

1

0

0

1

1

1

0

0

9C H

D

0

1

1

1

1

0

1

0

7A H

E

1

0

0

1

1

1

1

0

9E H

F

1

0

0

0

1

1

1

0

8E H

小数点

0

0

0

0

0

0

0

1

01 H

不显示

0

0

0

0

0

0

0

0

00 H

  1. 动态显示和静态显示

数码管的驱动显示方式有多种,大致可分为动态显示和静态显示。

动态显示其实就是利用LED的余辉效应和人眼的视觉暂留效应来实现的。动态显示方式外围驱动电路相对简单,占用单片机I/O较少,但是需要不断刷新数码管显示,因此,占用CPU时间较长。

静态显示是单片机发送数据之后,数据如何稳定有效的显示由外围锁存器件实现,这样可以大幅降低占用CPU的时间,但他会占用更多的I/O,并且外围驱动电路也相对复杂。

    1. 硬件设计

IK-64D4开发板上设计了8位共阴极数码管显示电路,该显示电路中使用74HC138译码器实现数码管的位选,74HC595芯片实现数码管的段选,电图原理图如下。

5:数码管显示电路

数码管显示电路占用的STC8A8K64D4的引脚如下表:

表2:引脚分配

名称

引脚

说明

SCK

P3.2

和显示屏接口共用

SI

P3.4

和显示屏接口共用

RCK

P3.5

和显示屏接口共用

A0

P4.0

和显示屏接口共用

A1

P5.5

和显示屏接口共用

A2

P4.4

和显示屏接口共用

  1. 数码管段选的实现

数码管的段选是通过74HC595芯片实现的,74HC595是一个8位串行输入、并行输出的位移缓存器。数码管显示电路中,为了节省GPIO,74HC595的使能控制端在硬件上设置为恒有效(/OE连接到GND,恒为低电平)。74HC595的Q0~Q7 八位数据并行输出端并接到8个数码管的段选信号线上,这样,使用3个GPIO就可以向数码管发送段选信号。这3个GPIO各自的作用如下表所示。

3:74HC595驱动信号

GPIO

连接(74HC595

描述

P3.4

SI

发送串行数码管段选数据,经74HC595转为8位并行数据向数码管提供段选信号。

P3.2

SCK

产生数据移位时钟,上升沿时数据寄存器的数据移位,Q0→Q1→Q2→Q3→...→Q7,下降沿移位寄存器数据不变。

P3.5

RCK

产生数据锁存时钟,上升沿时将8 位锁存移位寄存器中的状态值并行输出,下降沿时存储寄存器数据不变。

传输段码时,单片机的P3.4输出8位串行段码数据,每传输一个数据位,P3.2产生一个上升沿时钟将数据移位,8个上升沿移位时钟后,8位段码数据传输完成,之后,P3.5产生一个上升沿,段码数据并行输出,由此,完成数码管的段选。

  1. 数码管位选的实现

数码管显示电路使用74HC138译码器产生位选信号,同样,为了节省GPIO,74HC138的使能控制端在硬件上均设置为恒有效(E1、E2连接GND,恒为低电平;E3连接VCC,恒为高电平)。因此,程序中操作数码管时只需控制三个地址数据输入端(A0、A1、A2)去选中8个数码管中的待操作的数码管即可。

三个地址数据输入端(A0、A1、A2)是如何选中8个数码管中的一个的,这就要看74HC138译码器的真值表了(74HC138译码器的真值表如下图所示)。

H:高电平     L:低电平      X:任意电平

6:74HC138真值表

由74HC138译码器的真值表可以看出,当74HC138使能后,A0、A1、A2的输入电平决定了Y0~Y7的输出(低电平有效),而且从Y0到Y7是和A2、A1、A0的值对应的,因此,当我们需要Y0~Y7中某个输出端输出低电平时,输入端A2、A1、A0输入对应的数值即可,如需要Y1输出低电平,则A2、A1、A0输入为001(16进制:0x01)即可。电路中的8个数码管是共阴极数码管,8个数码管的公共端依次连接到了Y7~Y0,由此,通过A0、A1、A2的“逻辑值”即可完成对待操作的数码管的位选。

  • 说明:开发板为了布线方便,8个数码管中的第1位连接到Y7,第2位连接到Y6,以此类推,这一点,在编程程序的时候需要注意一下。

    1. 软件设计
      1. 数码管动态显示程序结构

对于数码管动态显示来说,主要考虑的有两个方面:数码管刷新和显示数据更新。

  1. 数码管刷新:因为是动态显示,所以要不断刷新数码管,利用人眼的视觉暂留效应实现数码管的显示,并且刷新的速度不能过慢,否则,显示会有闪烁。
  2. 数码管显示内容的更新:8位数码管中每位数码管都可以单独更新数据。

数码管动态显示驱动程序设计的方法很多,下面是一种基于定时器刷新的方法,供读者借鉴。

数码管驱动程序原理如下图所示,定义一个数组,该数组共有8个元素,分别用于保存8位数码管的段码,即数组中第1个元素用于保存8位数码管中第1位数码管的段码,第2个元素用于保存第2位数码管的段码,以此类推。

使用一个定时器用于刷新数码管显示,在定时器中断服务函数中从数组中取数码管的段码,完成对数码管显示的刷新。这样,当我们需要修改数码管显示内容时,只需要修改数组中的段码即可。

图7:数码管软件驱动原理

定时器刷新数码管显示的流程图如下,每次进入定时器中断服务函数后刷新8位数码管中的一位。这里,定义一个变量“ledseg_nod”用于记录数码管的位,每次刷新后“ledseg_nod”加1,到达8时,表示8位数码管全部刷新,“ledseg_nod”的值设置为0,开始新一轮刷新。

图8:定时器刷新数码管流程

      1. 数码管显示实验
  • 注:本节的实验是在“实验2-6-1:串口1数据收发实验”的基础上修改,本节对应的实验源码是:“实验2-12-1:数码管显示实验”。
        1. 实验内容

通过4个轻触按键KEY1~KEY4控制数码管显示内容,KEY1控制第1个和第2个数码管,KEY2控制第3个和第4个数码管,KEY3控制第5个和第6个数码管,KEY4控制第7个和第8个数码管。

程序复位运行后,8个数码管全部显示数字0,每按动一次按键,该按键控制的数码管显示内容加1,加到F后再次按动按键返回数字0,如此反复。

        1. 代码编写
  1. 新建一个名称为“ledseg.c”的文件及其头文件“ledseg.h”并保存到工程的“Source”文件夹,并将“ledseg.c”加入到Keil工程中的“SOURCE”组。
  2. 引用头文件

因为在“main.c”文件中使用了“ledseg.c”文件中的函数,所以需要引用下面的头文件“ledseg.h”。

代码清单:引用头文件

  1. //引用数码管的头文件  
  2. #include    " ledseg.h"  

  1. 定义段码表和8个数码管的段码数组

数码管常用来显示数字“0~9”和字符“A~F”,他们的段码定义如下:

代码清单:段码表

  1. //数码管段码  
  2. u8 SEG8_Code[] ={  
  3.         0xFC, // 0  
  4.         0x60, // 1  
  5.         0xDA, // 2  
  6.         0xF2, // 3  
  7.         0x66, // 4  
  8.         0xB6, // 5  
  9.         0xBE, // 6  
  10.         0xE0, // 7  
  11.         0xFE, // 8  
  12.         0xF6, // 9  
  13.         0xEE, // A  
  14.         0x3E, // b  
  15.         0x9C, // C  
  16.         0x7A, // d  
  17.         0x9E, // E  
  18.         0x8E, // F  
  19.     };  

定义一个名称为“SEG8_DispArray”的数组,用于存放8个数码管显示的段码,初始化值均设置为数字“0”的段码“0xFC”,数码管刷新时从该数组读取段码,代码清单如下。

代码清单: 8位数码管段码存放数组

  1. //存放8个数码管显示的段码,初始值都为数字0的段码。更新数码管显示内容时,只需更新该数组中的段码即可  
  2. u8 SEG8_DispArray[8] ={0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC};  

  1. 数码管初始化

数码管初始化主要包括引脚配置和数码管初始显示状态的设置,代码清单如下。这里要注意的是,如果需要改动数码管初始显示内容,修改数组SEG8_DispArray中的值即可,默认值是显示数字“0”。

代码清单:数码管初始化

  1. /********************************************************************************** 
  2. 功能描述:始化数码管驱动电路所用的GPIO 
  3. 参    数:无 
  4. 返 回 值:无 
  5. ***********************************************************************************/  
  6. void LEDseg_init(void)             
  7. {  
  8.    P3M1 &= 0xCB; P3M0 |= 0x34;          //设置P3.2,P3.4,P3.5为强推挽输出  
  9.    P4M1 &= 0xEE;   P4M0 &= 0xEE;        //设置P4.0,P4.4为准双向口  
  10.    P5M1 &= 0xDF;   P5M0 &= 0xDF;        //设置P5.5为准双向口  
  11.       
  12.    SEG_A0=1;                            //74HC138第1引脚A0置高电平  
  13.    SEG_A1=1;                            //74HC138第2引脚A1置高电平  
  14.    SEG_A2=1;                            //74HC138第3引脚A2置高电平  
  15.    SEG_LCLK=1;                          //74HC595第12引脚LCLK置高电平  
  16.    SEG_SCK=0;                           //74HC595第11引脚SLK置低电平  
  17.    SEG_DATA=0;                          //74HC595第14引脚DATA置低电平     
  18. }  

  1. 发送段选和位选信号

为了程序中操作方便,我们先用宏定义对8位数码管中的各个位进行编号,让数码管和数组“SEG8_DispArray”关联。这里要注意一下,开发板为了布线方便,8位数码管是反序连接到74HC138的输出“Y0~Y7”的。

代码清单:数码管位定义

  1. #define  LEDSEG_1       7  
  2. #define  LEDSEG_2       6  
  3. #define  LEDSEG_3       5  
  4. #define  LEDSEG_4       4  
  5. #define  LEDSEG_5       3  
  6. #define  LEDSEG_6       2  
  7. #define  LEDSEG_7       1  
  8. #define  LEDSEG_8       0  

程序中先发送段码信号,8位串行段码经过74HC595后并行输出完成数码管的段选,之后发送位选信号,点亮数码管,代码清单如下。

代码清单:发送段选和位选信号

  1. /********************************************************************************** 
  2. 功能描述:向指定的数码管发送段选和位选信号 
  3. 参    数:nod[in]:数码管,取值范围:0~7 
  4. 返 回 值:无 
  5. ***********************************************************************************/  
  6. void LEDseg_write_data(u8 nod)  
  7. {  
  8.    u8 dat,i;  
  9.       
  10.    dat = SEG8_DispArray[nod];  //获取段码  
  11.    for(i=0;i<8;i++)            //循环发送8位段码  
  12.    {  
  13.       SEG_DATA=(dat>>i)&0x01;  
  14.       SEG_SCK=0;  
  15.       Delay10us();  
  16.       SEG_SCK=1;  
  17.    }  
  18.    LEDseg_nodeSelect(nod);    //发送数码管位选信号
  19. }  

发送位选信号的函数代码清单如下。

代码清单:发送位选信号函数

  1. /********************************************************************************** 
  2. 功能描述:发送位选信号,选择指定的数码管 
  3. 参    数:nod[in]:数码管,取值范围:0~7 
  4. 返 回 值:无 
  5. ***********************************************************************************/  
  6. void LEDseg_nodeSelect(u8 nod)  
  7. {  
  8.    SEG_A0=  nod&0x01;  
  9.    SEG_A1= (nod&0x02)>>1;  
  10.    SEG_A2= (nod&0x04)>>2;  
  11. }  
  1. 数码管刷新

本例中使用Timer2刷新数码管,Timer2定时时间配置为2ms,每次中断刷新一位数码管。程序中使用变量“ledseg_nod”记录数码管的位,8位数码管一轮刷新完成后,“ledseg_nod”复位(值设置为0),进入新一轮的刷新,代码清单如下。

代码清单:定时器2中断服务函数中刷新数码管

  1. /********************************************************************************** 
  2.  * 描  述 : 定时器2中断服务函数 
  3.  * 入  参 : 无 
  4.  * 返回值 : 无 
  5.  **********************************************************************************/  
  6. void timer2_isr() interrupt 12  
  7. {  
  8.    LEDseg_write_data(ledseg_nod);      //发送段码  
  9.    LEDseg_Refresh();                   //发送  
  10.    ledseg_nod++;  
  11.    if(ledseg_nod == 8)ledseg_nod = 0;  //8位数码管刷新完成,ledseg_nod复位  
  12. }  
  1. 主函数

主函数中完成相关的初始化之后,在主循环里面调用按键扫描函数buttons_scan()查询是否有按键按下,如果有按键按下则更新数码管显示内容,代码清单如下。

代码清单:主函数

  1. /************************************************************************** 
  2. 功能描述:主函数 
  3. 入口参数:无 
  4. 返 回 值:int类型 
  5. **************************************************************************/  
  6. int main(void)  
  7. {  
  8.    u8 temp;  
  9.    u8 disp_dat1 = 0,disp_dat2 = 0,disp_dat3 = 0,disp_dat4 = 0;  
  10.    //省略了初始化相关的代码  
  11.    while(1)  
  12.    {  
  13.       temp = buttons_scan(0);            //获取开发板用户按键检测值,不支持连按  
  14.       if(temp == BUTTON1_PRESSED)        //按键KEY1按下  
  15.       {  
  16.          led_toggle(LED_1);               //用户指示灯D1状态翻转  
  17.          disp_dat1++;  
  18.          if(disp_dat1 >0x0F)disp_dat1 = 0;  
  19.          LEDseg_DispUpdata(LEDSEG_1,disp_dat1,LEDSEG_DP_OFF);//更新第1个数码管显示内容  
  20.          LEDseg_DispUpdata(LEDSEG_2,disp_dat1,LEDSEG_DP_OFF);//更新第2个数码管显示内容  
  21.       }  
  22.       else if(temp == BUTTON2_PRESSED)   //按键KEY2按下  
  23.       {  
  24.          led_toggle(LED_2);               //用户指示灯D2状态翻转  
  25.          disp_dat2++;  
  26.          if(disp_dat2 >0x0F)disp_dat2 = 0;  
  27.          LEDseg_DispUpdata(LEDSEG_3,disp_dat2,LEDSEG_DP_ON);//更新第3个数码管显示内容  
  28.          LEDseg_DispUpdata(LEDSEG_4,disp_dat2,LEDSEG_DP_ON);//更新第4个数码管显示内容  
  29.       }   
  30.       else if(temp == BUTTON3_PRESSED)   //按键KEY3按下  
  31.       {  
  32.          led_toggle(LED_3);               //用户指示灯D3状态翻转  
  33.          disp_dat3++;  
  34.          if(disp_dat3 >0x0F)disp_dat3 = 0;  
  35.          LEDseg_DispUpdata(LEDSEG_5,disp_dat3,LEDSEG_DP_OFF);//更新第5个数码管显示内容  
  36.          LEDseg_DispUpdata(LEDSEG_6,disp_dat3,LEDSEG_DP_OFF);//更新第6个数码管显示内容  
  37.       }  
  38.       else if(temp == BUTTON4_PRESSED)   //按键KEY4按下  
  39.       {  
  40.          led_toggle(LED_4);               //用户指示灯D3状态翻转  
  41.          disp_dat4++;  
  42.          if(disp_dat4 >0x0F)disp_dat4 = 0;  
  43.          LEDseg_DispUpdata(LEDSEG_7,disp_dat4,LEDSEG_DP_OFF);//更新第7个数码管显示内容  
  44.          LEDseg_DispUpdata(LEDSEG_8,disp_dat4,LEDSEG_DP_OFF);//更新第8个数码管显示内容  
  45.       }  
  46.    }  
        1. 硬件连接

按照下图所示短接跳线帽,因为数码管和显示屏复用了GPIO,因此,使用数码管时不能安装显示屏。

图9:跳线帽短接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验2-12-1:数码管显示实验”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\ledseg_disp\Project”目录下的工程文件“ledseg_disp.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“ledseg_disp.hex”位于工程的“…\ledseg_disp\project\Objects”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 程序运行后,依次按下用户按键KEY1、KEY2、KEY3和KEY4,可以观察到每按一次按键,对应的数码管显示内容从“0~F”依次递增。
  1. 按下KEY1按键:第1、2位数码管显示内容递增。
  2. 按下KEY2按键:第3、4位数码管显示内容递增。
  3. 按下KEY3按键:第5、6位数码管显示内容递增。
  4. 按下KEY4按键:第7、8位数码管显示内容递增。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全面解读视频生成模型Sora

2024年2月15日&#xff0c;OpenAI在其官网发布了《Video generation models as world simulators》的报告&#xff0c;该报告提出了作为世界模拟器的视频生成模型Sora。 OpenAI对Sora介绍如下&#xff1a; We explore large-scale training of generative models on video dat…

【漏洞复现】H3C 路由器多系列信息泄露漏洞

Nx01 产品简介 H3C路由器是一款高性能的路由器产品&#xff0c;具有稳定的性能和丰富的功能。它采用了先进的路由技术和安全机制&#xff0c;可以满足不同用户的需求&#xff0c;广泛应用于企业、运营商和数据中心等领域。 Nx02 漏洞描述 H3C路由器多系列存在信息泄露漏洞&…

ngnix网站服务详解

一 Nginx的简介 1 Nginx&#xff1a; ①Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热…

【大模型 知识图谱】ChatKBQA:KBQA知识图谱问答 + 大模型

ChatKBQA&#xff1a;KBQA知识图谱问答 大模型 提出背景传统方法处理流程ChatKBQA处理流程对比优势 总结ChatKBQA框架概览特征1&#xff1a;逻辑形式生成特征2&#xff1a;无监督实体和关系检索特征3&#xff1a;参数高效的微调特征4&#xff1a;GQoT 可解释的查询执行特征5&a…

初识ONLYOFFICE 8.0:办公软件的革命性升级

引言 随着数字化时代的到来&#xff0c;办公软件已经成为我们日常生活和工作的重要组成部分。在这个充满竞争的市场中&#xff0c;ONLYOFFICE凭借其卓越的性能和功能&#xff0c;脱颖而出&#xff0c;成为许多企业和个人用户的优选。近期&#xff0c;ONLYOFFICE推出了全新的8.…

Jdbc概述和基本使用

一、什么是JDBC呢&#xff1f; 目前市面上存在很多的数据库&#xff0c;比如Oracle、Mysql、SqlServer等…每一种数据库都有着自己的独特的实现原理。 那么我们在使用java链接这些数据库的时候就会出现一个问题&#xff0c;我们需要为每一种数据库开发一套专属于该数据库的链接…

通俗易懂地解释OpenAI Sora视频生成的特点有哪些?与Runway Gen2、Pika有什么区别?缺点是什么?

OpenAI的Sora模型是最近两天最火热的模型。它生成的视频无论是清晰度、连贯性和时间上都有非常好的结果。在Sora之前&#xff0c;业界已经有了很多视频生成工具和平台。但为什么Sora可以引起如此大的关注&#xff1f;Sora生成的视频与此前其它平台生成的视频到底有哪些区别&…

自媒体达人都在用的写作工具:6款ai写作实用工具推荐! #科技#学习方法#AI写作

这些宝藏AI 写作神器&#xff0c;我不允许你还不知道~国内外免费付费都有&#xff0c;还有AI写作小程序分享&#xff0c;大幅度提高写文章、写报告的效率&#xff0c;快来一起试试吧&#xff01; 1.元芳写作 这是一个微信公众号 面向专业写作领域的ai写作工具&#xff0c;写作…

IDEA插件推荐:免费好用!

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

C#泛型及其应用:获取并显示员工信信息

目录 一、关于泛型 1.泛型定义 2.泛型与非泛型的区别 3.泛型的应用 &#xff08;1&#xff09;泛型类&#xff1a; &#xff08;2&#xff09;泛型方法&#xff1a; &#xff08;3&#xff09;泛型委托&#xff1a; &#xff08;4&#xff09;泛型接口&#xff1a; &a…

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”

智慧城市的建设已经进入了一个新的阶段&#xff0c;不仅仅是智慧交通、智慧环保&#xff0c;如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢&#xff0c;正在通过信息化、数字化和智慧化的方式&#xff0c;实现全方位的精细化管理。本文以智慧公厕源头专…

代码随想录刷题笔记-Day21

1. 二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。…

我为什么不喜欢关电脑?

程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“英雄”本色&#xff01; 一、上大学时。 …

Vue3引用第三方模块报错Could not find a declaration file for module ***.

在引用第三方的组件时候报错如下 原因是&#xff1a;该组件可能不是.ts文件而是.js文件 解决方案&#xff1a; 1.在Src的目录下面新建一个文件为shims-vue.d.ts的文件 2.文件内容为 declare module xxx&#xff0c;xxx就是你报错的模块 例如我这样 declare module vue3-pu…

代码随想录day26--贪心基础

什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优 举个例子&#xff1a; 有一堆钞票&#xff0c;可以拿走十张&#xff0c;如果想要达到最大的金额&#xff0c;应该怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的…

TypeScript(一):TypeScript基本理解

TypeScript基本理解 为什么使用TS JavaScript发展至今&#xff0c;没有进行数据类型的验证而我们知道&#xff0c;在编程阶段&#xff0c;错误发现的越早越好而TS就解决了JS的这个问题 认识TypeScript TypeScript是拥有类型的JavaScript超级&#xff0c;它可以编译成普通、…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之LoadingProgress组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之LoadingProgress组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、LoadingProgress组件 用于显示加载动效的组件。 子组件 无 接口 L…

Docker详解及使用

文章目录 为什么要用docker为什么会出现容器Docker 是什么容器是什么虚拟化是什么Docker 和 虚拟化的区别Docker 容器有几种在状态什么是仓库什么是镜像什么是容器仓库、镜像、容器的关系常用的 Docker 命令如何把主机的东西拷贝到容器内部如何让容器随着 Docker 服务启动而自动…

双缸黑白箭来袭,3月5日亮相,胡斯瓦纳发布全新车系。

根据国外最新消息&#xff0c;Husqvarna准备在下个月就是3月5日发布全新车系&#xff0c;前段时间刚曝光的新款的401&#xff0c;这突然就来了双缸版本的黑白箭了&#xff0c;之前的401/701全部都是单缸&#xff0c;这也是首台胡斯瓦纳黑白箭的双缸车型。 外观方面仍然采用现代…

自学嵌入式困难吗?

自学嵌入式困难吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01…