/*
* File: App_Rocker.c
* Author: xiaobuding
* Comments: 摇杆开关
* Data: 2023/11/3
* Revision history: V0.1
*/
/* Includes -----------------------------------------------------------------*/
#include "App_Rocker.h"
/* Defines ------------------------------------------------------------------*/
/* Variables Define ---------------------------------------------------------*/
uint16_t X_Value = 0;
uint16_t Y_Value = 0;
struct ST_ROCKER Rocker_State;
/* Function prototypes ------------------------------------------------------*/
/*******************************************************************************
* 函数名:User_Rocker_Init
* 描述 :摇杆开关初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void User_Rocker_Init(void)
{
Rocker_ADC_Init();
Rocker_DATA_Init();
}
/*******************************************************************************
* 函数名:Rocker_ADC_Init
* 描述 :摇杆开关ADC配置初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void Rocker_ADC_Init(void)
{
ADC_InitTypeDef ADC_InitS;
Rocker_GPIO_Init();//ADC引脚配置
RCC_APB2PeriphClockCmd(Rocker_AFIO_RCC | Rocker_ADC_RCC,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_InitS.ADC_Mode = ADC_Mode_Independent;
ADC_InitS.ADC_ScanConvMode = ENABLE; //多通道(ENABLE)/单通道(DISABLE)
ADC_InitS.ADC_ContinuousConvMode = ENABLE; //连续(ENABLE)/单次(DISABLE)
ADC_InitS.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitS.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
ADC_InitS.ADC_NbrOfChannel = 2; //通道数
ADC_Init(ADC_TYPE, &ADC_InitS);
ADC_Cmd(ADC_TYPE,ENABLE);
ADC_ResetCalibration(ADC_TYPE);
while(ADC_GetResetCalibrationStatus(ADC_TYPE));
ADC_StartCalibration(ADC_TYPE);//开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC_TYPE));//获取指定ADC的校准程序
ADC_SoftwareStartConvCmd(ADC_TYPE, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}
/*******************************************************************************
* 函数名:Rocker_GPIO_Init
* 描述 :摇杆开关引脚初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void Rocker_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(Rocker_GPIO_RCC, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = ADCX_Pin | ADCY_Pin;//PA4,PA5
GPIO_Init(Rocker_GPIO, &GPIO_InitStructure);//GPIOA
}
/*******************************************************************************
* 函数名:Rocker_DATA_Init
* 描述 :摇杆开关数据初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void Rocker_DATA_Init(void)
{
Rocker_State.bits.Up = 0;
Rocker_State.bits.Down = 0;
Rocker_State.bits.Right = 0;
Rocker_State.bits.Left = 0;
Rocker_State.Up_Shift = 0;
Rocker_State.Down_Shift = 0;
Rocker_State.Right_Shift = 0;
Rocker_State.Left_Shift = 0;
Rocker_State.bits.Swing_mark = 0;
}
/*******************************************************************************
* 函数名:Read_AdC_Value
* 描述 :读取ADC的值
* 输入 :uint8_t
* 输出 :uint16_t
* 调用 :
* 备注 :ADC采样
*******************************************************************************/
uint16_t Read_AdC_Value(uint8_t cmd)
{
while(!ADC_GetFlagStatus(ADC_TYPE,ADC_FLAG_EOC));//转换结束标志位
ADC_RegularChannelConfig(ADC_TYPE,cmd,1,ADC_SampleTime_28Cycles5);
ADC_SoftwareStartConvCmd(ADC_TYPE, ENABLE);
return ADC_GetConversionValue(ADC_TYPE);//返回最近一次ADCx规则组的转换结果
}
/*******************************************************************************
* 函数名:Rocker_Scan
* 描述 :摇杆开关动作扫描
* 输入 :void
* 输出 :void
* 调用 :1ms
* 备注 :
*******************************************************************************/
void Rocker_Scan(void)
{
X_Value = Read_AdC_Value(ADC_Channel_4);
delay_syms(10); // 不可注释掉,确保X转换完毕能正常开始Y转换,确保ADC的准确性
// printf("X_Value = %d\r\n",X_Value);
if (X_Value > 1900) // 往下
{
Rocker_State.bits.Swing_mark = 1;
Rocker_State.bits.Up = 0;
Rocker_State.bits.Down = 1;
// printf("Rocker_State.bits.Down = %d\r\n",Rocker_State.bits.Down);
}
else if (X_Value < 1700) // 往上
{
Rocker_State.bits.Swing_mark = 1;
Rocker_State.bits.Up = 1;
Rocker_State.bits.Down = 0;
// printf("Rocker_State.bits.Up = %d\r\n",Rocker_State.bits.Up);
}
else if ((X_Value > 1750) && (X_Value < 1850))
{
Rocker_State.Up_Shift = 0;
Rocker_State.Down_Shift = 0;
Rocker_State.bits.Up = 0;
Rocker_State.bits.Down = 0;
}
Y_Value = Read_AdC_Value(ADC_Channel_5);
// printf("Y_Value = %d\r\n",Y_Value);
if (Y_Value > 1750) // 往右
{
Rocker_State.bits.Swing_mark = 1;
Rocker_State.bits.Right = 1;
Rocker_State.bits.Left = 0;
// printf("Rocker_State.bits.Right = %d\r\n",Rocker_State.bits.Right);
}
else if (Y_Value < 1550) // 往左
{
Rocker_State.bits.Swing_mark = 1;
Rocker_State.bits.Right = 0;
Rocker_State.bits.Left = 1;
// printf("Rocker_State.bits.Left = %d\r\n",Rocker_State.bits.Left);
}
else if ((Y_Value > 1600) && (Y_Value < 1700))
{
Rocker_State.Right_Shift = 0;
Rocker_State.Left_Shift = 0;
Rocker_State.bits.Right = 0;
Rocker_State.bits.Left = 0;
}
if ((!Rocker_State.bits.Down) && (!Rocker_State.bits.Up) && (!Rocker_State.bits.Right) && (!Rocker_State.bits.Left))
{
if (Rocker_State.bits.Swing_mark)
{
Rocker_State.bits.Swing_mark = 0;
Uart1Prints("\r\n*STOP$");
}
LED20_Off();
}
else
{
LED20_On();
if ((Rocker_State.bits.Up) && (!Rocker_State.bits.Down)) // 上
{
if (Rocker_State.bits.Right) // 右
{
Uart1Prints("\r\n*UP Right");
}
else if (Rocker_State.bits.Left) // 左
{
Uart1Prints("\r\n*UP Left");
}
else // X轴不动
{
Uart1Prints("\r\n*[UP XXXX");
}
}
else if ((!Rocker_State.bits.Up) && (Rocker_State.bits.Down)) // 下
{
if (Rocker_State.bits.Right) // 右
{
Uart1Prints("\r\n*DOWN Right");
}
else if (Rocker_State.bits.Left) // 左
{
Uart1Prints("\r\n*DOWN Left");
}
else // X轴不动
{
Uart1Prints("\r\n*DOWN XXXX");
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Rocker.zip (2个子文件)
Rocker
APP_Rocker.h.txt 2KB
App_Rocker.c.txt 7KB
共 2 条
- 1
资源评论
xiaobuding_QAQ
- 粉丝: 2812
- 资源: 37
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功