STM32-按键输入

2023-11-12

1  硬件连接

1.1 mini

1.2 战舰

1.3 探索者

        KEY0->PE4  上拉输入        KEY1->PE3  上拉输入        KEY2->PE2  上拉输入        WK_UP->PA0  下拉输入

        按键输入最关键的是对按键的初始化和输入判断。这里按键的初始化与LED的初始化不同的是GPIO的模式不一样了,LED是推挽输出,按键则相反,是输入,这个时候要考虑是哪一种输入方式,这里当我的板子上按键是共阴极的,当按键按下的时候IO口输入的低电平,所以我需要在IO口接上拉电阻,使用上拉输入模式;这里当我的板子上按键是共阳极的,当按键按下的时候IO口输入的高电平,所以我需要在IO口接下拉电阻,使用下拉输入模式。

2  GPIO输操作说明

        读取IO口输入电平调用库函数:uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        读取IO口输入电平操作寄存器:GPIOx_IDR:端口输入寄存器

        使用位带操作读取IO口输入电平:PEin(4) ------------读取GPIOE.4口电平       PEin(n)------------读取GPIOE.n口电平

3  按键输入实验

        按键消抖:我们采用延时消抖的思想,因为按键是机械开关,所以在按下的时候会产生电平的抖动,这在51单片机中经常使用。我个人认为延时消抖应该是一种思想。

按键消抖 的图像结果

        第一步先检查按键是否按下,如果按下了,那么就延时20毫秒,再次判断按键是否按下,确保其不是因为机械抖动造成的误判断。两次判断以后,其结果基本确定,如果按键按下了,就点亮LED灯,然后再加入一个死循环,等待按键被松开。就是通过一个等待按键松开的函数来跳出循环,达到按键锁存的目的。

        对于按键输入来说,怎么判断是连续按,还是不连续按,这是一个重点。以前是将两种情况分开考虑,写成了两个函数,然后判断,其实,这个可以写成一个函数,只需添加一个选择形参,然后对形参进行判断操作即可。

        按键扫描(支持连续按)的一般思路:如果我要实现:按键按下,没有松开,只能算按下一次,这个函数无法实现。

u8 KEY_Scan(void)                              u8 key_Scan(u8 mode)
{                                              {
   if(KEY按下)                                   if(KEY0 == 0 || KEY1 == 0|| WK_UP == 1)   //key按键按下
  {                                               {
    delay_ms(10);/*延时10-20ms,防抖。*/           delay_ms(10);
    if(KEY确实按下)                                 if(KEY0 == 0)             //    if(key 确实按下)
     {                                                 return KEY0_PRES;     //   返回按键值
      return KEY_Value;                            else if(KEY1 == 0)
     }                                                 return KEY1_PRES;
    return 无效值;                                 else if(WK_UP == 1)
  }                                                    return WKUP_PRES;
}                                                 }
                                                  else if(KEY1 == 1 && KEY0 == 1 && WK_UP == 0)
                                                       return 0;                       //没有按键按下 返回无效值
                                               }

        按键扫描(不支持连续按)的一般思路:不支持连续按:就是说,按键按下了,没有松开,只能算一次。

u8 KEY_Scan(void)                             u8 key_Scan(u8 mode)
{                                             {
  static u8 key_up=1;                            static u8 key_up = 1; //按键松开标志
  if(key_up &&  KEY按下)                       if(key_up && (KEY0 == 0 || KEY1 == 0|| WK_UP == 1))
  {                                              {
    delay_ms(10);//延时,防抖                       delay_ms(10);
    key_up=0;//标记这次key已经按下                  key_up = 0;
    if(KEY确实按下)                                 if(KEY0 == 0)              //if(key确实按下)
     {                                                  return KEY0_PRES;      // return 键值
      return KEY_VALUE;                             else if(KEY1 == 0)
     }                                                  return KEY1_PRES;
  }else if(KEY没有按下)  key_up=1;                  else if(WK_UP == 1)
  return 没有按下                                       return WKUP_PRES;
}                                                }
                                                 else if(KEY1 == 1 && KEY0 == 1 && WK_UP == 0)
                                                    key_up = 1;
                                                 return 0;
                                              }

        按键扫描(两种模式合二为一)的一般思路:

u8 KEY_Scan(u8 mode)                            u8 key_Scan(u8 mode)
{                                               {
  static u8 key_up=1;                             static u8 key_up = 1; //按键松开标志
  if(mode==1) key_up=1;//支持连续按               if(mode)
  if(key_up &&  KEY按下)                            key_up = 1;
  {                                               if(key_up && (KEY0 == 0 || KEY1 == 0|| WK_UP == 1))
    delay_ms(10);//延时,防抖                     {
    key_up=0;//标记这次key已经按下                    delay_ms(10);
    if(KEY确实按下)                                   key_up = 0;
    {                                                 if(KEY0 == 0)
      return KEY_VALUE;                                   return KEY0_PRES;
    }                                                 else if(KEY1 == 0)
   }else if(KEY没有按下)  key_up=1;                       return KEY1_PRES;
   return 没有按下                                    else if(WK_UP == 1)
}                                                         return WKUP_PRES;
                                                  }
                                                  else if(KEY1 == 1 && KEY0 == 1 && WK_UP == 0)
                                                      key_up = 1;
                                                  return 0;
                                                }

          在主函数中 执行到这条 key=KEY_Scan(0)命令 ,也就是mode=0,那么开始执行该函数。定义一个关键字static 变量 key_up,并给其赋值为1。if(mode)key_up=1; 不执行。执行if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) ,假设此时按下KEY1且不松开,则执行该if后面的语句。delay_ms(10);目的是去抖动。将key_up赋值为0,然后函数返回值为1(KEY0_PRES在宏定义中表示为1),跳出函数,继续执行主函数,使得LED1灯亮。程序继续走,再一次走到key=KEY_Scan(0),调用KEY_Scan函数,这时候由于key_up在上一次被赋值为0了,故此时if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) 也不执行,直接执行else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;此时key_up才重新变为1,然后return 0;那么主函数中key=0,则不执行if(key);故此时LED1灯状态不变,依然亮。这样就实现了第一种模式,即按键连续按的时候,灯/蜂鸣器的状态不改变。(其他的形式类似)

        下面贴一个正点原子论坛中一位老哥的解释:key_up只是作为一个标志,if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))这里边判断按键按下是要跟key_up相与的,也就是当你有键按下时还需要key_up为1才能让程序读取到按键值。key_up作为静态变量只会被初始化一次(也就是static u8 key_up=1只会执行一次),每一次读取到一个按键值后key_up就会被置0,让它重新变为1只有两种情况:
        (1)else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;这里就并不是连续按了,只要你按键松开了,下次继续读取没问题。
        (2)你如果是想连续按着不动又希望程序能多次读取到的话,必须通过if(mode)key_up=1; 这一句就能让key_up恢复1,这样就实现了不需要松开按键就让它恢复1,即可实现连续按键并且程序连续读取。

        (1)使能按键对应IO口时钟。调用函数:RCC_APB2PeriphClockCmd();
        (2)初始化IO模式:上拉/下拉输入。调用函数:GPIO_Init();
        (3)扫描IO口电平(库函数/寄存器/位操作)。

/************mian.c************/
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
 
int main(void)
 {
 	vu8 key=0;	
	delay_init();	    	 //延时函数初始化	  
 	LED_Init();			     //LED端口初始化
	KEY_Init();          //初始化与按键连接的硬件接口
	BEEP_Init();         	//初始化蜂鸣器端口
	LED0=0;					//先点亮红灯
	while(1)
	{
 		key=KEY_Scan(0);	//得到键值
	   	if(key)
		{						   
			switch(key)
			{				 
				case WKUP_PRES:	//控制蜂鸣器
					BEEP=!BEEP;
					break;
				case KEY2_PRES:	//控制LED0翻转
					LED0=!LED0;
					break;
				case KEY1_PRES:	//控制LED1翻转	 
					LED1=!LED1;
					break;
				case KEY0_PRES:	//同时控制LED0,LED1翻转 
					LED0=!LED0;
					LED1=!LED1;
					break;
			}
		}else delay_ms(10); 
	}	 
}
 
/************key.h************/
#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"	 

//#define KEY0 PEin(4)    //PE4
//#define KEY1 PEin(3)	  //PE3 
//#define KEY2 PEin(2)	  //PE2
//#define WK_UP PAin(0)	  //PA0  WK_UP

#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)    //读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)    //读取按键1
#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)    //读取按键2 
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)  //读取按键3(WK_UP) 

#define KEY0_PRES 	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define KEY2_PRES	3	//KEY2按下
#define WKUP_PRES   4	//KEY_UP按下(即WK_UP/KEY_UP)

void KEY_Init(void);    //IO初始化
u8 KEY_Scan(u8);  	    //按键扫描函数					    
#endif
 
/************key.c************/
#include "stm32f10x.h"
#include "key.h"
#include "sys.h" 
#include "delay.h" 
								    
//按键初始化函数
void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

	//初始化 WK_UP-->GPIOA.0	  下拉输入
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉	  
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下 
//4,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(KEY2==0)return KEY2_PRES;
		else if(WK_UP==1)return WKUP_PRES;
	}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; 	    
 	return 0;// 无按键按下
}

        注意此函数有响应优先级:KEY0>KEY1>KEY2>KEY_UP !!

4  C语言关键字 :static

4.1 局部变量

        普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。普通局部变量存储于进程栈空间,使用完毕会立即释放。静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。变量在全局数据区分配内存空间;编译器自动对其初始化;其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束。静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。

4.2 全局变量

        全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

4.3 Static变量

        Static的用途主要有两个:
                一是用于修饰存储类型使之成为静态存储类型
                二是用于修饰链接属性使之成为内部链接属性。
        1)静态存储类型:
                在函数内定义的静态局部变量,该变量存在内存的静态区,所以即使该函数运行结束,静态变量的值不会被销毁,函数下次运行时能仍用到这个值。
                在函数外定义的静态变量——静态全局变量,该变量的作用域只能在定义该变量的文件中,不能被其他文件通过extern引用。
        2) 内部链接属性
                静态函数只能在声明它的源文件中使用。

        下例中,每次调用getValue函数之后,返回值是多少?

int getValue(void)                      int getValue(void)
{                                       {
  int  flag=0;                             static int  flag=0;
  flag++;                                  flag++;
  return flag;                             return flag;
}                                       }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32-按键输入 的相关文章

  • STM32在Debug时程序运行时间不对,Debug时定时器中断每次进入断点时间不对,定时器一开启就进入中断的解决办法

    一 Debug时程序时间不对解决办法 1 点击魔术棒 2 点击Debug 点击Settings 3 点击Trace 在Core Clock里修改为你的系统时钟 二 Debug时定时器中断每次进入断点时间不对 在Debug时 程序停下来 定时
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 【C语言】小白学浮点数

    一 浮点数的概念 浮点数也称小数或实数 C语言中采用 float 和 double 关键字来定义小数 float称为单精度浮点型 double称为双精度浮点型 另外 部分编译器支持更大精度的long double 但不是所有的编译器都支持
  • 你好请问,postman不登录联网怎么使用mock Server

    你好 Postman 具有内置的 mock server 功能 因此无需联网即可使用 要使用 mock server 请执行以下步骤 打开 Postman 应用程序 创建一个新的请求 或打开一个现有的请求 在请求的右上角 单击 更多 按钮
  • pyqt窗口控件跟随窗口大小变化而变化的方法

    要做的很简单 使用qtdesigner对设计的界面配置一下layout 页面布局 即可实现拖拽时界面中控件的放大缩小 这是布局时的几种方式 重点 用designer时要注意 不要选中多个控件然后右键选择layout 要直接在mainwind
  • 恶意代码分析实战07-02

    先peview看看exe程序 注意到这里有两个kernel32 dll 不过仔细看的话 发现其中有一个是假的 名字为kerne132 dll kernel的l被换成了1 而且出现了lab07 03 dll 看来运行这个exe的时候会加载这个
  • 常见JMeter面试题

    1 什么是JMeter JMeter是一种开源的性能测试工具 可以用于测试静态和动态资源 如Web应用程序 数据库 FTP服务器等 2 JMeter可以测试哪些类型的应用 JMeter可以测试各种类型的应用程序 包括Web应用程序 数据库服
  • Python中[:2]、[:,-1]、[-1]、[:-1]、[::-1]、[2::-1]如何使用

    数据准备 import numpy as np X np array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 print X 形成矩阵 1 print X 1 取最后一个元素 2
  • C++检测异常assert()函数

    1 assert 函数使用 assert 一般用于debug下异常检测的功能函数 例如文件打开是否成功 函数形参传入是否理想 变量定义是否正确等 总的来说其作用是如果它的条件返回错误 则终止程序执行 原型定义 include
  • 如何用PHP写一个excel文件并导出

    其实用PHP写一个excel文件并下载下来很容易 这里我们使用了PHPExcel库去实现一个例子
  • Java基础篇--工具类操作之敏感词过滤

    编写敏感词过滤程序 说明 在网络程序中 如聊天室 聊天软件等 经常需要对一些用户所提交的聊天内容中的敏感性词语进行过滤 如 性 色情 爆炸 恐怖 枪 军火 等 这些都不可以在网上进行传播 需要过滤掉或者用其他词语替换掉 提示 将用户的聊天内
  • Python3,如何实现CPU的并行计算,那还不简单,5种方式,这篇就搞定。

    多进程实现CPU并行计算 1 引言 2 实战 2 1 多进程模式 2 1 1 定义 2 1 2 multiprocessing 2 1 3 模式 2 1 4 适用场景 2 1 4 代码示例 2 2 执行方法 2 2 1 多线程并发执行 2
  • 高德导航红绿灯为啥能读秒?

    来源 JavaEdge 1 内部员工吐露 2 真正的内幕 免责声明 任何文章不要过度深思 万事万物都经不起审视 因为世上没有同样的成长环境 也没有同样的认知水平 更 没有适用于所有人的解决方案 不要急着评判文章列出的观点 只需代入其中 适度
  • 外汇高概率一分钟交易系统

    交易系统前置 建议资金 10000美金 交易品种 黄金 交易周期 1分钟 使用指标 Ichimoku Kinko Hyo 注 只留上下Kumo 其他线隐藏 MACD MA15 MA55 交易仓位 建议每次交易 0 05手 交易入场条件 MA
  • MATLAB深度学习LSTM 标签分类classificationLayer层,YTrain的设置出错

    问题 使用matlab深度学习工具箱进行标签分类 设置XTrain为输入是n 1的元胞数组 每个元胞数据有6个特征值 YTrain输出是n 1的元胞数组 内容为标签 0 或 1 LSTM层和options设置如下 layers sequen
  • Java-进制转换

    常用的进制转换 十进制转二进制 二进制转十进制 十进制转八进制 八进制转十进制 十进制转十六进制 十六进制转十进制 如果二 八 十六之间想转换可以通过十进制做中间者 import java util Scanner import java
  • 10本编程书籍推荐!带你从入门到精通

    在看书 阅读前 一定先选择一门适合自己的编程语言 对0基础的同学 选择程序设计语言时先了解自己的学习能力 太难的语言 没有一定的基础 以及没有老师讲解 指引 太容易产生挫败感从而放弃 其次 如果自己有一点点明确的目的或需求 那么选一门对自己
  • C++ Windows上键盘拦截

    键盘捕获代码 include
  • Java8 之Optional 的使用

    作为java8的新特性之一 可选在没有接触之前没有感受到过他的魅力 当真正的去用它才感觉到魅力之所在 可选 JAVA新增的工具类 主要是用来解决我们之前 NullPointException的问题 我先贴一段之前的代码 部分截取 真实业务场
  • 利用python开启简单http服务用户文件下载

    当文件传输没有工具时 利用python可以开启http服务 方便文件传输下载 python2 python m SimpleHTTPServer 2222 Serving HTTP on 0 0 0 0 port 2222 已经启动了端口为
  • ChatGPT专业应用:修改SQL为MySQL

    正文共 875 字 阅读大约需要 4 分钟 程序员等必备技巧 您将在4分钟后获得以下超能力 修改SQL为MySQL Beezy评级 A级 经过寻找和一段时间的学习 一部分人能掌握 主要提升效率并增强自身技能 推荐人 Kim 编辑者 Yola
  • STM32-按键输入

    1 硬件连接 1 1 mini 1 2 战舰 1 3 探索者 KEY0 gt PE4 上拉输入 KEY1 gt PE3 上拉输入 KEY2 gt PE2 上拉输入 WK UP gt PA0 下拉输入 按键输入最关键的是对按键的初始化和输入判