STM32——按键

按键头文件:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

#ifndef __anjian_H
#define __anjian_H

#include <system.h>


void anjian_Init(void);

#define KEY_UP_Pin     GPIO_Pin_0   //定义引接
#define KEY_DOWN_Pin   GPIO_Pin_3
#define KEY_LEFT_Pin   GPIO_Pin_4
#define KEY_RIGHT_Pin  GPIO_Pin_2

#define KEY_Port    (GPIOE)    //定义接口
#define KEY_UP_Port (GPIOA)

#define KEY_UP    PAin(0)     //位带操作读IO
#define KEY_DOWN  PEin(3)
#define KEY_LEFT  PEin(4)
#define KEY_RIGHT PEin(2)


#define UP    0
#define DOWN  1
#define LEFT  2
#define RIGHT 3



/*
#define readKeyUp    GPIO_ReadInputDataBit(KEY_UP_Port, KEY_UP_Pin)//读IO库函数
#define readKeyDown  GPIO_ReadInputDataBit(KEY_Port, KEY_DOWN_Pin)
#define readKeyLeft  GPIO_ReadInputDataBit(KEY_Port, KEY_LEFT_Pin)
#define readKeyRight GPIO_ReadInputDataBit(KEY_Port, KEY_RIGHT_Pin)
*/

#endif

按键源文件:

```c
#include "anjian.h"


void anjian_Init()
{
	   GPIO_InitTypeDef  GPIO_InitStructure;
	
	   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE,ENABLE);   //时钟使能
	
	   GPIO_InitStructure.GPIO_Pin = KEY_UP_Pin;
	   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
	   
	   GPIO_Init(KEY_UP_Port,&GPIO_InitStructure);    //KEY_UP_Pin
	
	
	
	
	 	GPIO_InitStructure.GPIO_Pin = KEY_DOWN_Pin|KEY_LEFT_Pin|KEY_RIGHT_Pin;
	   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	   
	   GPIO_Init(KEY_Port,&GPIO_InitStructure);    //KEY_Pin
	    
	
	   
	
}
	

主函数:

#include "led.h"
#include "stm32f4xx.h"
#include "system.h"
#include "sysTick.h"
#include "anjian.h"


//mode = 0单次扫描
//mode = 1连续扫描
u8 keyscan(u8 mode)
{
		static u8 key = 1;
		if(mode == 0){
					key = 1;
		}		
	
		if(key == 1 && (KEY_UP == 1 || KEY_LEFT == 0 || KEY_DOWN == 0|| KEY_RIGHT == 0)){
				  myDelay_ms(10);
					key = 0;
    			if(KEY_UP == 1){
							return UP;
					}else if(KEY_LEFT == 0){
							return LEFT;
					}else if(KEY_DOWN == 0){
							return DOWN;
					}else if(KEY_RIGHT == 0){
							return RIGHT;
					}
		}else if(KEY_UP == 0 && KEY_LEFT == 1 && KEY_DOWN == 1 && KEY_RIGHT == 1){
					key = 1;
		} 
		return 0;
}


int main()
{
	     u8 i;
	     u8 key;
	     led_Init();
	     SysTick_Init(168);
	     anjian_Init();
	
//	     LED1 = 0;
//	     LED2 = 0;
	
       while(1){
	        key = keyscan(0);
 				 switch(key){
//								case UP:
//														for(i=0;i<5;i++){
//																LED1 = 0;
//																LED2 = 1;
//																myDelay_ms(500);
//																LED1 = 1;
//																LED2 = 0;
//																myDelay_ms(500);
//														}
//														
//														break;
								case DOWN:
														LED2 = 0;
														break;
								case LEFT:
														LED2 = 0;
														break;
								case RIGHT:
														LED1 = 1;
														LED2 = 1;
								    
								    break;
					 }
			 }
   
		 }

		 


按键连续扫描与单次扫描:
当选择为单次扫描的mode= 0模式的时候,key一直是1,当进入按键按下时,第一个if会将可以置0,只有按键松开时的第二个if才会将key置1,因此当按键按下去之后必须要松开按键之后key才会恢复为1,才有进去按键扫描的条件。相当于使用静态key=1来将第一个if钳住;
当选择连续扫描的mode= 1模式时每次进入扫描函数时key的值都是1,不收静态变量控制。

//mode = 0单次扫描
//mode = 1连续扫描
u8 keyscan(u8 mode)
{
		static u8 key = 1;
		if(mode == 0){
					key = 1;
		}		
	
		if(key == 1 && (KEY_UP == 1 || KEY_LEFT == 0 || KEY_DOWN == 0|| KEY_RIGHT == 0)){
				  myDelay_ms(10);
					key = 0;
    			if(KEY_UP == 1){
							return UP;
					}else if(KEY_LEFT == 0){
							return LEFT;
					}else if(KEY_DOWN == 0){
							return DOWN;
					}else if(KEY_RIGHT == 0){
							return RIGHT;
					}
		}else if(KEY_UP == 0 && KEY_LEFT == 1 && KEY_DOWN == 1 && KEY_RIGHT == 1){
					key = 1;
		} 
		return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是一款常用的单片机芯片,它具有丰富的外设资源,包括GPIO(通用输入输出)引脚。在STM32F103中,可以通过配置GPIO引脚为中断模式来实现按键的检测。通过中断方式检测按键的状态可以提高效率,避免了轮询方式的资源浪费。 在使用STM32F103进行按键检测时,可以按照以下步骤进行操作: 1. 配置GPIO引脚:使用GPIO初始化函数将按键引脚配置为输入模式。 2. 设置外部中断(EXTI):通过配置外部中断触发方式(上升沿、下降沿、上下都触发)来确定按键触发的条件。 3. 设置中断优先级(NVIC):通过设置中断优先级来确定中断的响应顺序。 4. 编写中断服务函数:在中断服务函数中编写按键触发后的处理逻辑。 具体的代码实现可以参考引用\[2\]和引用\[3\]中提供的示例代码。这些示例代码演示了不同的按键检测方式,包括不带锁存和带锁存的方式。你可以根据自己的需求选择适合的方式进行按键检测。 总结来说,通过配置GPIO引脚为中断模式,结合外部中断和中断服务函数的编写,可以实现在STM32F103上进行按键检测。这种方式相比轮询方式更高效,可以提高系统的响应速度。 #### 引用[.reference_title] - *1* [STM32F103入门 | 11.按键实验(下)](https://blog.csdn.net/Chen_rr/article/details/89457944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [基于STM32F103入门2——按键点灯](https://blog.csdn.net/weixin_47457689/article/details/120196469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值