【STC8A8K64D4开发板】——按键检测

news2025/2/22 13:50:34

第2-3讲:按键检测

    1. 学习目的
  1. 学习轻触按键和触摸按键硬件电路原理。
  2. 学习STC8A8K64D4用作输入时相关寄存器的配置。
  3. 掌握如何读取GPIO状态。
  4. 掌握编写轻触按键和触摸按键检测程序。
    1. 硬件电路设计

IK-64D4开发板上设计了4个轻触按键和一个触摸按键,提供给用户作为按键开关使用。

      1. 轻触按键

轻触按键又称轻触开关,是电路中常用的一种开关元器件,也是一种常用的人机接口。广泛用于家电、数码产品、便携仪产品、电脑产品等电子设备中。

轻触按键,顾名思义我们只需要施加很小的力量即可改变开关连接的状态。轻触按键在所需外力作用下(按下按键)触点导通,无外力作用时(释放按键)触点断开,如下图所示:

 

图1:轻触开关原理

由此,我们可以通过将连接到轻触按键的GPIO配置为输入模式,之后读取该GPIO的状态来判断轻触按键是否按下。

IK-64D4开发板上设计了4个轻触按键Key1、Key2、Key3和Key4,分别连接到STC8A8K64D4的GPIO P3.7、P3.6、P0.7和P0.5。轻触按键电路如下图所示,当按键处于释放状态时(按键没有按下),按键断开,由于上拉电阻的作用GPIO的输入为高电平。当按键按下时,按键导通,按键连接的GPIO短接到GND,这时,该GPIO的输入为低电平。由此,程序中我们可以根据读取的GPIO的状态是低电平还是高电平来判断对应按键是按下还是释放。

 

图2:轻触按键电路

4个轻触按键占用的单片机的引脚如下表:

表1:轻触按键检测引脚分配

名称

引脚

说明

Key1

P3.7

非独立GPIO,和以太网模块W5500接口复用。

Key2

P3.6

非独立GPIO,和以太网模块W5500接口复用。

Key3

P0.7

独立GPIO。

Key4

P0.5

独立GPIO。

  • 注:独立GPIO表示开发板没有其他的电路使用这个GPIO,非独立GPIO说明开发板有其他电路用到了该GPIO。读者在使用非独立GPIO使用时需要注意电路的连接,以避免多个电路使用了同一个GPIO
      1. 触摸按键

IK-64D4开发板上设计了一路基于TTP223触摸检测芯片的触摸按键,TTP223是电容式单键触摸按键IC,电压输入范围为2.0V~5.5V。TTP223利用操作者的手指与触摸按键焊盘之间产生电荷电平来进行检测,通过监测电荷的微小变化来确定手指接近或者触摸到感应表面。没有任何机械部件,不会磨损,其感测部分可以放置到任何绝缘层(通常为玻璃或塑料材料)的后面,很容易制成与周围环境相密封的键盘。

触摸按键电路如下图所示。

 

图3:触摸按键电路

TTP223的检测灵敏度可通过外部电容值(上图中的C15)来调整。SLH引脚用于设置TTP223的输出方式。

1) SLH = 0:触摸时,TTP223的OUT引脚输出高电平。

2) SLH = 1:触摸时,TTP223的OUT引脚输出低电平。

本电路中,SLH = 0,所以触摸时OUT引脚输出高电平,无触摸时OUT引脚输出低电平。注意一下,这和轻触按键的电路输出刚好是反的,轻触按键电路是按键按下时,电路输出低电平,无按键按下时电路输出高电平。

  • 为什么触摸按键输出的信号不做成和轻触按键一样,也是按键时输出低电平,无按键时输出高电平?

这是因为:作为开发板,要方便用户测试,2种不同类型的输出方式更方便我们使用,另外在后续的章节中我们还会用到按键信号的上升沿和下降沿,这时就可以通过轻触键和触摸按键来获取,而不需要另外接线。

触摸按键占用的STC8A8K64D4的引脚如下表:

表2:触摸按键引脚分配

名称

引脚

说明

触摸按键

P5.4

和外部复位电路共用IO

      1. 按键检测电路需要考虑的因素

按键检测电路设计的时候,需要我们考虑两个方面:按键释放时GPIO口状态的确定和按键检测电路的保护以及按键消抖。

  1. 按键释放时GPIO口状态的确定

按键检测电路中,当按键释放后要能保证GPIO口电平是确定的,即按键释放时GPIO口固定为高电平或低电平。所以一般按键电路中,都会通过上拉电阻或下拉电阻来保证当按键释放时GPIO处于固定的电平。如果单片机的GPIO有片内可配置的上/下拉电阻,也可以使用片内上/下拉电阻而不用在单片机外部增加上/下拉电阻,使用GPIO检测按键时只需通过软件打开上拉/下拉电阻就可以了。

  1. 按键检测电路保护

设计电路时,可以考虑在按键和STC8A8K64D4单片机的GPIO之间串接了一个小阻值的电阻,这个电阻的作用如下:

  1. 保护IO,若IO口不小心被配置成了推挽输出,按下按键可能会损坏IO,串接电阻后,即使出现这种情况,也不会损坏IO。
  2. 降低按键动作时产生的抖动峰值电压,防止抖动电压对单片机产生影响。虽然很多单片机在IO上都有电压钳位设计,可以承受一定范围内的电压抖动,但是通过串接一个小阻值电阻既能让抖动峰值电压更低而又不影响按键检测电路的性能,而且花费的代价也很小(仅串接一个电阻),无疑是比较合算的。
  1. 按键硬件消抖

对于按键硬件上的消抖,一般常用的方式是在按键上并接一个容值约0.1uF左右电容,利用电容两端的电压不能突变的特性,消除抖动时产生的毛刺电压。虽然电容可以起到消除抖动的作用,但是在考虑按键灵敏度的情况下,电容是无法完全消除抖动的,消除抖动还需要软件的配合。

本电路中,没有采用电容消抖的方式,在整体设计上,我们是使用软件完成消抖的。

    1. 软件设计
      1. GPIO配置

STC8A8K64D4提供的7个用于操作GPIO的寄存器中,和输入相关的寄存器有端口模式配置寄存器、端口上拉电阻控制寄存器、端口施密特触发控制寄存器、端口数字信号输入使能控制寄存器和端口数据寄存器。使用GPIO进入输入检测的时候,首先需要配置GPIO输入相关的寄存器,包含下面4个配置:

  1. 配置GPIO的工作模式为:本例中配置为准双向口。
  2. 配置上拉电阻:是否开启GPIO的上拉电阻要根据实际情况确定,如硬件电路上已经设计了外部上拉电阻,则无需开启。本例中需要开启外部上拉电阻(硬件电路上没有外部上拉)。
  3. 端口施密特触发控制寄存器:需要使能,端口施密特触上电复位后默认使能,因此,通常代码里面没有配置这个。
  4. 端口数字信号输入使能控制寄存器:需要使能,端口施密特触上电复位后默认使能。

配置完成后,即可通过读取端口数据寄存器来获取GPIO当前的状态是高电平还是低电平。

这几个配置项中,GPIO工作模式配置在前文已经描述过,这里不再赘述,端口施密特触发控制寄存器和端口数字信号输入使能控制寄存器通常无需配置,使用默认值即可,这里,我们主要看一下如下使能GPIO的上拉电阻。

配置GPIO上拉电阻的寄存器如下表所示,STC8A8K64D4共有8个端口P0~P7,因此,下表中只有P0PU~P7PU寄存器是STC8A8K64D4拥有的。

表3:端口上拉电阻控制寄存器

 

端口上拉电阻控制寄存器中的各个位的值对应端口中的GPIO的上拉电阻的开启或关闭(值为1:开启上拉电阻,值为0:关闭上拉电阻),如P0PU中的位0的值对应P0.0的上拉电阻的开启或关闭。端口上拉电阻控制寄存器是不支持位寻址的,也就是只能使用寄存器P0PU~P7PU访问,另外,需要特别注意的是端口上拉电阻控制寄存器为扩展 RAM 区特殊功能寄存器,访问前需先将P_SW2寄存器的最高位(EAXFR)置1,否则无法访问。

  1. 开启上拉电阻示例:使能P3.6的上拉电阻

代码清单:使能P3.6的上拉电阻

  1. P_SW2 |= 0x80;        //将EAXFR位置1,使能访问XFR(扩展RAM区特殊功能寄存器)
  2. P3PU |= 0x40;         //将P3PU的位6设置为1,使能P3.6上拉电阻  
  3. P_SW2 &= 0x7F;        //将EAXFR位置0,关闭访问XFR

      1. 轻触按键检测实验
  • 注:本节的实验是在“实验2-2-1:有源蜂鸣器鸣响控制”的基础上修改,本节对应的实验源码是:“实验2-3-1:轻触按键检测”。
        1. 实验内容
  1. 配置连接按键Key1、Key2、Key3和Key4的GPIO P3.7、P3.6、P0.7和P0.5为准双向口。
  2. 主循环中检测按键状态并使用软件消抖,当检测到按键按下后,翻转对应的LED指示灯的状态,即检测到按键Key1~ Key4按下后,分别翻转指示灯D1~D4的状态。
        1. 代码编写
  1. 新建一个名称为“button.c”的文件及其头文件“button.h”并保存到工程的“Source”文件夹,并将“button.c”加入到Keil工程中的“SOURCE”组。
  2. 引用头文件

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

代码清单:引用头文件

  1. //引用头文件  
  2. #include    " button.h"  

  1. 引脚定义和配置

4个轻触按键Key1、Key2、Key3和Key4的GPIO P3.7、P3.6、P0.7和P0.5,这里,我们使用“#define”定义如下宏。

代码清单:定义连接按键的引脚

  1. #define BUTTON1_P37   P37         //用户按键Key1用GPIO口P3.7  
  2. #define BUTTON2_P36   P36         //用户按键Key2用GPIO口P3.6 
  3. #define BUTTON3_P07   P07         //用户按键Key3用GPIO口P0.7
  4. #define BUTTON3_P05   P05         //用户按键Key4用GPIO口P0.5

  1. 按键扫描函数

在编写按键检测函数之前,为了方便判断按键的状态,我们定义了一些常量用来表示按键的状态和有效按键(按键按下)的标号,代码如下。

代码清单:按键检测相关常量定义

  1. //定义按键按下和释放状态  
  2. #define BUTTON_PRESSED      0  
  3. #define BUTTON_RELEASED     1  
  4.   
  5. //定义按键有效状态编号(按键按下)  
  6. #define BUTTONS_RELEASED      0           //没有按键按下  
  7. #define BUTTON1_PRESSED       1           //按键KEY1按下  
  8. #define BUTTON2_PRESSED       2           //按键KEY2按下
  9. #define BUTTON3_PRESSED       3           //按键KEY3按下
  10. #define BUTTON4_PRESSED       4           //按键KEY4按下

按键扫描函数中,对连接4个按键的GPIO的状态进行读取,如果为低电平,则延时10ms后再次读取(软件消抖),如仍为低电平,则认为按键有效,并返回对应的按键编号。

代码清单:按键扫描函数

  1. /************************************************************************** 
  2. 功能描述:读取开发板上的4个用户按键(KEY1、KEY2、KEY3和KEY4)的状态 
  3. 参    数:mode [in]: 是否支持连按,=true:支持,=false:不支持 
  4. 返 回 值:有按键按下,返回对应的按键编号,否则返回BUTTONS_RELEASED(没有按键按下) 
  5. *************************************************************************/  
  1. u8 buttons_scan(u8 mode)  
  2. {  
  3.    static u8 btn_up=1;   //标志变量  
  4.    
  5.    if(mode==1)           //支持连按  
  6.    {  
  7.       btn_up=1;          //变量 Key_up会被重新赋值为1  
  8.    }  
  9.       
  10.    //读取按键KEY1、KEY2、KEY3和KEY4连接的IO口电平是否为低电平  
  11.    if(btn_up&&((BUTTON1_P37 == BUTTON_PRESSED ) || (BUTTON2_P36 == BUTTON_PRESSED ) || 
  12.       (BUTTON3_P07 == BUTTON_PRESSED ) || (BUTTON4_P05 == BUTTON_PRESSED )))  
  13.    {  
  14.       delay_ms(10);                         //软件延时10ms,消抖  
  15.       btn_up=0;                             //变量 btn_up清零
  16.       //KEY1按键按下(P3.7为低电平),返回按键有效(BUTTON3_PRESSED)
  17.       if(BUTTON1_P37 == BUTTON_PRESSED)  
  18.       {
  19.         return BUTTON1_PRESSED;  
  20.       }
  21.       //KEY2按键按下(P3.6为低电平),返回按键有效(BUTTON4_PRESSED)  
  22.       else if(BUTTON2_P36 == BUTTON_PRESSED)
  23.       {  
  24.         return BUTTON2_PRESSED;  
  25.       }
  26.       //KEY3按键按下(P0.7为低电平),返回按键有效(BUTTON5_PRESSED)
  27.       else if(BUTTON3_P07 == BUTTON_PRESSED)  
  28.       {  
  29.         return BUTTON3_PRESSED;  
  30.       }  
  31.       //KEY4按键按下(P0.5为低电平),返回按键有效(BUTTON5_PRESSED)  
  32.       else if(BUTTON4_P05 == BUTTON_PRESSED)
  33.       {  
  34.         return BUTTON4_PRESSED;  
  35.       }  
  36.    }  
  37.    else if((BUTTON1_P37 == BUTTON_RELEASED )&&(BUTTON2_P36 == BUTTON_RELEASED ) &&
  38.            (BUTTON3_P07 == BUTTON_RELEASED )&&(BUTTON4_P05 == BUTTON_RELEASED ))  
  39.    {  
  40.      btn_up=1;              //变量 key_up置位  
  41.    }   
  42.    return BUTTONS_RELEASED; //返回无按键按下  
  43. }  

主函数中配置连接按键的GPIO为准双向口,因为开发板轻触按键检测硬件电路上设计有外部上拉电阻,因此,无需要打开GPIO的片内上拉电阻。之后在主循环里面调用按键扫描函数buttons_scan()查询是否有按键按下,如果有按键按下则翻转对应编号的指示灯的状态。

代码清单:主函数

  1. /************************************************************************** 
  2. 功能描述:主函数 
  3. 入口参数:无 
  4. 返回值:int类型 
  5. *************************************************************************/  
  6. int main(void)  
  7. {  
  8.    u8 temp;  
  9.       
  10.    P2M1 &= 0x3F;   P2M0 &= 0x3F;     //设置P2.6~P2.7为准双向口(指示灯D1和D2)  
  11.    P7M1 &= 0xF9;   P7M0 &= 0xF9;     //设置P7.1~P7.2为准双向口(指示灯D4和D3)  
  12.    P3M1 &= 0x3F;   P3M0 &= 0x3F;     //设置P3.6~P3.7为准双向口(按键KEY2和KEY1)  
  13.    P0M1 &= 0x5F;   P0M0 &= 0x5F;     //设置P0.5,P0.7为准双向口(按键KEY4和KEY3)  
  14.       
  15. //如果按键电路上没有外部上拉电阻,需要开启GPIO的片内上拉。  
  16. //开发板的按键电路设计了上拉电阻,因此,无需开启片内上拉     
  17. //  P_SW2 |= 0x80;                  //将EAXFR位置1,以访问在XDATA区域的扩展SFR  
  18. //  P0PU |= 0xA0;                   //开启P0.5、P0.7的上拉电阻  
  19. //  P3PU |= 0xC0;                   //开启P3.6、P3.7的上拉电阻  
  20. //  P_SW2 &= 0x7F;                  //将EAXFR位置0,恢复访问XRAM      
  21.       
  22.   while(1)  
  23.   {  
  24.      temp = buttons_scan(0);            //获取开发板用户按键检测值,不支持连按  
  25.      if(temp == BUTTON1_PRESSED)        //按键KEY1按下  
  26.      {  
  27.        led_toggle(LED_1);               //用户指示灯D1状态翻转  
  28.      }  
  29.      else if(temp == BUTTON2_PRESSED)   //按键KEY2按下  
  30.      {  
  31.        led_toggle(LED_2);               //用户指示灯D2状态翻转  
  32.      }   
  33.      else if(temp == BUTTON3_PRESSED)   //按键KEY3按下  
  34.      {  
  35.        led_toggle(LED_3);               //用户指示灯D3状态翻转  
  36.      }  
  37.      else if(temp == BUTTON4_PRESSED)   //按键KEY4按下  
  38.      {  
  39.        led_toggle(LED_4);               //用户指示灯D3状态翻转  
  40.      }         
  41.    }  
  42. }  

        1. 硬件连接

本实验需要使用LED指示灯和按键,因此需要用跳线帽短接复用引脚的指示灯(D1和D2)和按键(KEY1和KEY2),而指示灯D3和D4以及按键KEY3和KEY4是独立引脚,没有和其他电路复用引脚,是没有短接跳线帽的操作的。

 

图4:跳线帽短接

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

      1. 触摸按键检测实验
  • 注:本节的实验是在“实验2-3-1:轻触按键实验”的基础上修改,本节对应的实验源码是:“实验2-3-2:触摸按键检测”。
        1. 实验内容

在“实验2-3-1:轻触按键实验”的基础上增加触摸按键的检测代码,主要包含下面两个方面。

  1. 配置连接触摸按键的GPIO P5.4为准双向口。
  2. 主循环中检测触摸按键状态并使用软件消抖,当检测到触摸按键按下后,点亮4个LED指示灯。
        1. 代码编写
  1. 引脚定义和配置

在“button.h”文件中按键引脚定义的地方加入触摸按键的引脚定义,代码清单如下。

代码清单:定义连接按键的引脚

  1. //省略无关的代码  
  2. #define TOUCH_BUTTON_P54   P54    //触摸按键用GPIO口P5.4  

  1. 触摸按键扫描函数

触摸按键的检测方式和轻触按键一样,不同的是轻触按键检测到低电平时认为按键按下,触摸按键检测到高电平时认为按键按下,代码如下。

代码清单:按键检测相关常量定义

  1. /************************************************************************** 
  2. 功能描述:读取开发板上的触摸按键的状态 
  3. 参    数:无 
  4. 返 回 值:有按键按下,返回BUTTON_PRESSED,否则返回BUTTONS_RELEASED(没有按键按下) 
  5.  *************************************************************************/  
  6. u8 touch_button_scan(void)  
  7. {  
  8.    //读取触摸按键用引脚P5.4是否是高电平 (用手指触摸按键感应区域,引脚为高电平)  
  9.    if(TOUCH_BUTTON_P54 == 1)           
  10.    {  
  11.       delay_ms(10);                   //软件延时10ms,软件消抖  
  12.       if(TOUCH_BUTTON_P54== 1)        //检测触摸按键用引脚P5.4是否依然是高电平  
  13.       {  
  14.          return BUTTON_PRESSED;       //返回按键按下
  15.       }  
  16.     }  
  17.     return BUTTON_RELEASED;   //返回无按键按下  
  18. }  

主函数中配置连接触摸按键的GPIO P5.4为准双向口,之后在主循环里面调用触摸按键扫描函数touch_button_scan()查询是否有按键按下,如果有按键按下则点亮4个LED指示灯。

代码清单:主函数

  1. /************************************************************************** 
  2. 功能描述:主函数 
  3. 入口参数:无 
  4.   值:int类型 
  5. *************************************************************************/  
  6. int main(void)  
  7. {  
  8.    u8 temp;  
  9.    //省略了无关的代码  
  10.    P5M1 &= 0xEF;   P5M0 &= 0xEF;     //设置P5.4为准双向口(触摸按键)  
  11.       
  12.    while(1)  
  13.    {  
  14.       //省略了无关的代码  
  15.       temp = touch_button_scan();        //读取开发板触摸按键检测值  
  16.       if(temp == BUTTON_PRESSED)         //如果触摸按键按下  
  17.       {  
  18.          leds_on();                      //点亮4个用户指示灯  
  19.       }         
  20.    }  
  21. }  

        1. 硬件连接

本实验需要使用LED指示灯、4个轻触按键和触摸按键,因此需要用跳线帽短接复用引脚的指示灯(D1和D2)、按键(KEY1和KEY2)和触摸按键(TOUCH),而指示灯D3和D4以及按键KEY3和KEY4是独立引脚,没有和其他电路复用引脚,是没有短接跳线帽的操作的。

 

图5:跳线帽短接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验2-3-2:触摸按键检测”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\touch_button\Project”目录下的工程文件“touch_button.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“touch_button.hex”位于工程的“…\button\project\Objects”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 程序运行后,按下用户按键KEY1~KEY4可以翻转对应编号的指示灯状态,用手指去接触触摸按键,4个LED指示灯D1~D4全部点亮。

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

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

相关文章

企业级信息系统开发讲课笔记2.3 利用MyBatis实现关联查询

文章目录零、本节学习目标一、查询需求(一)针对三张表关联查询(二)按班级编号查询班级信息(三)查询全部班级信息二、创建数据库表(一)创建教师表(二)创建班级…

BUUCTF-WEB-INF/web.xml泄露-SSTI注入

第八周 目录 WEB [RoarCTF 2019]Easy Java WEB-INF/web.xml泄露 WEB-INF/web.xml泄露原因 WEB-INF/web.xml泄露利用方法 解决方法 [BJDCTF2020]The mystery of ip 什么是板块注入 SSTI 为什么会产生 什么是render_template render_template: 我们为什么…

背包问题-动态规划

背包问题 容量有限的背包&#xff0c;给很多商品&#xff0c;商品有相应的体积与价值 01背包问题 一个背包 每个物品只有一个 最终状态方程 dp[i][j]max(dp[i-1][j],dp[i-1][j-w[i]]v[i]) 推导过程 由上一层推导过来 选择拿不拿i 最终代码 #include<iostream> #…

第12届蓝桥杯省赛真题剖析-2020年12月20日Scratch编程中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第124讲。 第12届蓝桥杯省赛举办了两次&#xff0c;这是2020年10月20日举行的第一次省赛中级组试题&#xff0c;比赛仍…

【Java实战篇】Day6.在线教育网课平台

文章目录一、需求&#xff1a;绑定媒资1、需求分析2、库表设计与模型类3、接口定义4、Mapper层开发5、Service层开发6、完善controller层二、需求&#xff1a;课程预览1、需求分析2、实现技术3、模板引擎4、Freemarker入门5、部署网站门户6、接口定义7、接口开发8、编写模板9、…

放弃 console.log 吧!用 Debugger 你能读懂各种源码

很多同学不知道为什么要用 debugger 来调试&#xff0c;console.log 不行么&#xff1f; 还有&#xff0c;会用 debugger 了&#xff0c;还是有很多代码看不懂&#xff0c;如何调试复杂源码呢&#xff1f; 这篇文章就来讲一下为什么要用这些调试工具&#xff1a; console.lo…

PostgreSQL技术内幕(七)索引扫描

索引概述 数据库索引&#xff0c;是将一个表的某些字段的数据进行重新组织的数据库对象。通过使用索引&#xff0c;可以大大加速数据库的一些操作&#xff0c;其背后的思想也很简单朴素&#xff1a;空间换时间。 数据库中的索引&#xff0c;可以类比为一本书的目录&#xff0…

linux java中使用POI将word转为PDF时无法显示文字

背景: 在windos上本地调试时使用POI将word转为PDF时, PDF无法显示文字的原因以及解决方案: 我的是在linux7.9上&#xff0c;原因是生成world时候汉字正常&#xff0c;转pdf时没有汉字&#xff0c;多次调查后发现没有 宋体: 原因1:字体不存在问题, word中使用的字体在系统(wind…

udp 版本的 echo server 和 echo client

文章目录前言UDP数据报套接字编程什么是套接字套接字的api示例&#xff1a;一发一收&#xff08;无响应&#xff09;客户端服务端前言 基于udp socket写一个最简单的客户端服务器程序. UDP数据报套接字编程 什么是套接字 我们先来解释一下什么是套接字吧! 套接字&#xff0…

流浪地球2:AI人工智能+数字生命+元宇宙

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D开发工具链剧情介绍 太阳危机 太阳即将老化膨胀&#xff0c;吞没太阳系&#xff0c;地球上的人类构思了各种生存计划&#xff1a;其一是“数字生命计划”&#xff0c;该计划制造强大的量子计算机&#xff0c;希望让人类在数字世界…

D. Omkar and Circle(非常有意思的一道题)

Problem - D - Codeforces 丹尼是当地的数学狂人&#xff0c;他对圆形很着迷&#xff0c;这是奥姆卡最近的发明。帮他解决这个圆的问题!已知n个非负整数a1, a2&#xff0c;&#xff0c; an&#xff0c;它们排成一个圆&#xff0c;其中n必须是奇数。n -1能被2整除)。形式上&…

基于Tensorflow搭建卷积神经网络CNN(人脸识别)保姆及级教程

项目介绍 TensorFlow2.X 搭建卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现人脸识别&#xff08;可以识别自己的人脸哦&#xff01;&#xff09;。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠&#xff0c;然后经过全连接层&#xff0c;最后用softm…

KD-2125地下电缆测试仪

一、产品概述 管线探测仪是一套高性能地下金属管线探测系统&#xff0c;由信号发射机和接收机组成&#xff0c;可用于金属管线、地下电缆的路径探测、管线普查和深度测量&#xff0c;配合多种选配附件&#xff0c;可以进行唯一性鉴别&#xff0c;以及管道绝缘破损和部分类型电缆…

HTML—javaEE

文章目录1.认识HTML2.HTML标签的使用2.1注释2.2标题2.3段落2.4换行2.5字体加粗、斜体字、删除线、下划线2.6图片2.7超链接2.8表格2.9列表2.10表单标签2.11div2.12span3.HTML特殊符号1.认识HTML &#xff08;1&#xff09;HTML是网页的编程语言&#xff0c;文件的内容主要由“标…

【从零开始学Skynet】实战篇《球球大作战》(十一):战斗场景设计

现在的服务端框架有支撑数万玩家的能力&#xff0c;且支持横向拓展&#xff08;即 增加物理机数量&#xff09;&#xff0c;理论上具有无上限的负载能力。下面以《球球大 作战》为例&#xff0c;说明怎样使用这套框架。1、战斗流程 玩家登录后&#xff0c;玩家可以做些非战斗操…

形式语言和自动机总结DFA、NFA

第一章DFA 形式定义和状态转移函数: DFA是一种特殊的NFA&#xff0c; A{Q,,,,F} Q:输入状态集&#xff0c;∑:字母表&#xff0c;δ:状态转移函数Q∑→Q q0∈Q初始状态 F终结集 设计举例 1.设计接受偶数个0和偶数个1串的DFA 2.设计 DFA 接受 {0,1} 上的字符串 w, 且 w 是 …

C++之模拟实现map和set

文章目录前言一、迭代器1.begin()和end()2.operator()二、改造红黑树三、map的模拟实现四、set的模拟实现总结前言 基于之前的红黑树和map、set的相关知识&#xff0c;本节我们使用红黑树来模拟实现STL中的map和set。 一、迭代器 使用迭代器可以方便我们对数据结构进行遍历&a…

windows安装wsl2

总的来说是按照这三个链接来的&#xff0c;也写了一个大体流程。 wsl对win版本有要求&#xff0c;可以 winr winver查看 原始参考链接&#xff1a; 1&#xff09;https://zhuanlan.zhihu.com/p/466001838 2&#xff09;https://cloud.tencent.com/developer/article/1986728 3&…

SpringCloud之Eureka、Ribbon及Nacos

SpringCloud之Eureka、Ribbon及Nacos 文章目录SpringCloud之Eureka、Ribbon及Nacos1. 单体架构和微服务架构2. SpringBoot、SpringCloud及SpringCloud Alibaba之间的版本对应关系2022.x 分支2021.x 分支2.2.x 分支组件版本关系3. Eureka3.1 Eureka-server注册中心3.2 Eureka-cl…

Elasticsearch:使用 ingest pipeline 来管理索引名称

在我之前的文章 “Elasticsearch&#xff1a;使用 pipelines 路由文档到想要的 Elasticsearch 索引中去” 我详述了如何使用已有的 date_index_name 处理器来把文档归类到所需要的和文档日期相关的的索引中去。比如&#xff0c;我们想把 2023 年 4 月的所有文档写入到 my-index…