5D摇杆驱动(STM32)

一、前期准备
单片机:STM32F103ZET6
开发环境:MDK5.14
库函数:标准库V3.5
5D摇杆模块:淘宝有售
在这里插入图片描述

二、实验效果
实现上下左右、左上、右上、左下、右下(有些手抖,按不到位)按下检测。
在这里插入图片描述

三、驱动原理
低有效,与普通按键驱动无异
需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。

四、驱动代码
key.h

#ifndef __KEY_H__
#define	__KEY_H__
#include "stm32f10x.h"
#include "gpio.h"
#include "uart.h"
#include "delay.h"

#define		UP		PDin(0)
#define		DOWN	PDin(1)
#define		LEFT	PDin(2)
#define		RIGHT	PDin(3)
#define		MIDDLE	PDin(4)
#define		SET		PDin(5)
#define		RESET	PDin(6)

typedef enum
{
	P_NULL = 0,
	P_UP,
	P_DOWN,
	P_LEFT,
	P_RIGHT,
	P_MIDDLE,
	P_SET,
	P_RESET,
	P_UP_LEFT,
	P_UP_RIGHT,
	P_DOWN_LEFT,
	P_DOWN_RIGHT
}__key_value;
extern void KEYConfiguration(void);
extern uint8_t KEYScan(void);
#endif

key.c

#include "key.h"

void KEYConfiguration(void)
{
	GPIO_InitTypeDef    GPIO;
    
    //Enable APB2 Bus
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    
    //Register IO 
    GPIO.GPIO_Pin   = 0x7F;
    GPIO.GPIO_Mode  = GPIO_Mode_IPU;
    GPIO_Init(GPIOD, &GPIO);
}

uint8_t KEYScan(void)
{
	if (UP == 0)
	{
		DelayMs(10);
		if (UP == 0 && LEFT == 0)
		{
			while(UP == 0 || LEFT == 0);
			printf("Press 'UP_LEFT'\r\n");
			return P_UP_LEFT;
		}
		else if (UP == 0 && RIGHT == 0)
		{
			while(UP == 0 || RIGHT == 0);
			printf("Press 'UP_RIGHT'\r\n");
			return P_UP_RIGHT;
		}
		else if (UP == 0)
		{
			while(UP == 0);
			printf("Press 'UP'\r\n");
			return P_UP;
		}
	}
	
	if (DOWN == 0)
	{
		DelayMs(10);
		if (DOWN == 0 && LEFT == 0)
		{
			while(DOWN == 0 || LEFT == 0);
			printf("Press 'DOWN_LEFT'\r\n");
			return P_DOWN_LEFT;
		}
		else if (DOWN == 0 && RIGHT == 0)
		{
			while(DOWN == 0 || RIGHT == 0);
			printf("Press 'DOWN_RIGHT'\r\n");
			return P_DOWN_RIGHT;
		}
		else if (DOWN == 0)
		{
			while(DOWN == 0);
			printf("Press 'DOWN'\r\n");
			return P_DOWN;
		}
	}
	
	if (LEFT == 0)
	{
		DelayMs(10);
		if (LEFT == 0)
		{
			while(LEFT == 0);
			printf("Press 'LEFT'\r\n");
			return P_LEFT;
		}
	}
	
	if (RIGHT == 0)
	{
		DelayMs(10);
		if (RIGHT == 0)
		{
			while(RIGHT == 0);
			printf("Press 'RIGHT'\r\n");
			return P_RIGHT;
		}
	}
	
	if (MIDDLE == 0)
	{
		DelayMs(10);
		if (MIDDLE == 0)
		{
			while(MIDDLE == 0);
			printf("Press 'MIDDLE'\r\n");
			return P_MIDDLE;
		}
	}
	
	if (SET == 0)
	{
		DelayMs(10);
		if (SET == 0)
		{
			while(SET == 0);
			printf("Press 'SET'\r\n");
			return P_SET;
		}
	}
	
	if (RESET == 0)
	{
		DelayMs(10);
		if (RESET == 0)
		{
			while(RESET == 0);
			printf("Press 'RESET'\r\n");
			return P_RESET;
		}
	}
	
	return P_NULL;
}

由于作者能力有限,有不妥之处欢迎指正,邮箱alex_hua@foxmail.com

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值