一、前期准备
单片机: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