按键 C语言接口

本文详细介绍了基于STM32的按键控制系统设计,包括按键参数定义、功能配置、初始化过程及执行逻辑。阐述了如何通过不同按键实现对讲、音量调节等功能,并提供了按键状态读取与执行函数的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef __KEY_H
#define __KEY_H
#include "system.h"
/***************************************************
							按键参数定义
***************************************************/
#define KEY_MaxNum	 12				//按键数量
#define KEY_P1 PBin(12)//P1按键
#define KEY_P2 PBin(13)//P2按键
#define KEY_P3 PBin(14)//P3按键
#define KEY_P4 PBin(15)//P4按键
#define KEY_P5 PCin(6)//P5按键
#define KEY_P6 PCin(7)//P6按键
#define KEY_P7 PCin(8)//P7按键
#define KEY_P8 PCin(9)//P8按键
#define KEY_P9 PAin(8)//P9按键
#define KEY_P10 PAin(11)//P10按键
#define KEY_P11 PAin(12)//P11按键
#define KEY_P12 PBin(3)//P12按键
struct KEY_Parameter
{
	void (*KEY_ShortPressEXE)(void);	//按键短暂按下执行
	void (*KEY_PressForALongTimeEXE)(void);	//按键长时间按下执行
	void (*PressMediumBriefly)(void);	//按键短暂按下中执行
	void (*PressMediumForALongTime)(void);	//按键长时间按下中执行
	
	void (*Read_IO_Higt)(void);  //高电平执行
    void (*Read_IO_Low)(void);	//低电平执行
	
	unsigned long (*KEY_StateEXE)(void);	//按键状态读取 
	u32	KeyTime;//按键计时器
	u32 keyLongTime;//按键长按时间
	u32 keyMinTime;//按键最小动作时间
};
/***************************************************
							函数声明
***************************************************/
void Sys_KEY_INI(void);			//按键初始化
void Sys_KEY_EXE(void);			//按键执行(1ms执行一次)
#endif



#include "key.h"
/***************************************************
							按键参数声明
***************************************************/
struct KEY_Parameter KEY_Data[KEY_MaxNum];
/***************************************************
						按键短暂按下执行(功能1)
注:对讲功能
***************************************************/
void TX_ReceiveEnabled(void)
{
		TX_PTT=1;
}
/***************************************************
						按键长时间按下执行(功能1)
注:对讲功能
***************************************************/
/***************************************************
						按键短暂按下中执行(功能1)
注:对讲功能
***************************************************/
void TX_CanSendTo(void)
{
		TX_PTT=0;
}
/***************************************************
						按键长时间按下中执行(功能1)
注:对讲功能
***************************************************/
/***************************************************
						按键短暂按下执行(功能2)
注:音量+
***************************************************/
void TX_volumeAdjustment_Z(void)
{
	if(System_Variables.VOLUME<7)
		System_Variables.VOLUME++;
}
/***************************************************
						按键短暂按下执行(功能3)
注:音量-
***************************************************/
void TX_volumeAdjustment_F(void)
{
	if(System_Variables.VOLUME>0)
		System_Variables.VOLUME--;
}
/***************************************************
						按键状态读取(P1按键)
***************************************************/
unsigned long Key_StateP1(void)
{
	return KEY_P1;
}
/***************************************************
						按键状态读取(P2按键)
***************************************************/
unsigned long Key_StateP2(void)
{
	return KEY_P2;
}
/***************************************************
						按键状态读取(P3按键)
***************************************************/
unsigned long Key_StateP3(void)
{
	return KEY_P3;
}
/***************************************************
						按键状态读取(P4按键)
***************************************************/
unsigned long Key_StateP4(void)
{
	return KEY_P4;
}
/***************************************************
						按键状态读取(P5按键)
***************************************************/
unsigned long Key_StateP5(void)
{
	return KEY_P5;
}
/***************************************************
						按键状态读取(P6按键)
***************************************************/
unsigned long Key_StateP6(void)
{
	return KEY_P6;
}
/***************************************************
						按键状态读取(P7按键)
***************************************************/
unsigned long Key_StateP7(void)
{
	return KEY_P7;
}
/***************************************************
						按键状态读取(P8按键)
***************************************************/
unsigned long Key_StateP8(void)
{
	return KEY_P8;
}
/***************************************************
						按键状态读取(P9按键)
***************************************************/
unsigned long Key_StateP9(void)
{
	return KEY_P9;
}
/***************************************************
						按键状态读取(P10按键)
***************************************************/
unsigned long Key_StateP10(void)
{
	return KEY_P10;
}
/***************************************************
						按键状态读取(P11按键)
***************************************************/
unsigned long Key_StateP11(void)
{
	return KEY_P11;
}
/***************************************************
						按键状态读取(P12按键)
***************************************************/
unsigned long Key_StateP12(void)
{
	return KEY_P12;
}
/***************************************************
								按键初始化
***************************************************/
void Sys_KEY_INI(void)
{
	u32 i;
	GPIO_InitTypeDef GPIO_InitStructure;
	//默认初始化
	for(i=0;i<KEY_MaxNum;i++)
	{
		KEY_Data[i].KEY_ShortPressEXE=NULL;
		KEY_Data[i].KEY_PressForALongTimeEXE=NULL;
		KEY_Data[i].PressMediumBriefly=NULL;
		KEY_Data[i].PressMediumForALongTime=NULL;
		KEY_Data[i].KEY_StateEXE=NULL;
		KEY_Data[i].Read_IO_Higt=NULL;
        KEY_Data[i].Read_IO_Low=NULL;
		KEY_Data[i].KeyTime=0;
		KEY_Data[i].keyLongTime=1000;
		KEY_Data[i].keyMinTime=10;
	}
	//功能配置初始化
	//P1
	KEY_Data[0].KEY_StateEXE=Key_StateP1;
	//P2
	KEY_Data[1].KEY_StateEXE=Key_StateP2;
	//P3
	KEY_Data[2].KEY_StateEXE=Key_StateP3;
	KEY_Data[2].KEY_ShortPressEXE=TX_volumeAdjustment_Z;
	//P4
	KEY_Data[3].KEY_StateEXE=Key_StateP4;
	//P5
	KEY_Data[4].KEY_StateEXE=Key_StateP5;
	//P6
	KEY_Data[5].KEY_StateEXE=Key_StateP6;
	//P7
	KEY_Data[6].KEY_StateEXE=Key_StateP7;
	KEY_Data[6].PressMediumBriefly=TX_CanSendTo;
	KEY_Data[6].PressMediumForALongTime=TX_CanSendTo;
	KEY_Data[6].KEY_ShortPressEXE=TX_ReceiveEnabled;
	KEY_Data[6].KEY_PressForALongTimeEXE=TX_ReceiveEnabled;
	//P8
	KEY_Data[7].KEY_StateEXE=Key_StateP8;
	//P9
	KEY_Data[8].KEY_StateEXE=Key_StateP9;
	//P10
	KEY_Data[9].KEY_StateEXE=Key_StateP10;
	//P11
	KEY_Data[10].KEY_StateEXE=Key_StateP11;
	KEY_Data[10].KEY_ShortPressEXE=TX_volumeAdjustment_F;
	//P12
	KEY_Data[11].KEY_StateEXE=Key_StateP12;
	//按键配置初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟
	
	GPIO_InitStructure.GPIO_Pin =	GPIO_Pin_8 |GPIO_Pin_11 |GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;	//复用推挽
	GPIO_Init(GPIOA, &GPIO_InitStructure);		//初始化IO
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTB时钟
	
	GPIO_InitStructure.GPIO_Pin =	GPIO_Pin_3 |GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;	//复用推挽
	GPIO_Init(GPIOB, &GPIO_InitStructure);		//初始化IO
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能PORTC时钟
	
	GPIO_InitStructure.GPIO_Pin =	GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;	//复用推挽
	GPIO_Init(GPIOC, &GPIO_InitStructure);		//初始化IO
}
/***************************************************
					按键执行(1ms执行一次)
注意,所有延迟任务必须通过触发在其他任务中执行,该
函数只能进行按键扫描
***************************************************/
void Sys_KEY_EXE(void)
{
	uint32_t i;
	for(i=0;i<KEY_MaxNum;i++)
	{
		if(KEY_Data[i].KEY_StateEXE!=NULL)
		{
			if(KEY_Data[i].KEY_StateEXE())
			{
				//按键抬起
                
				if(KEY_Data[i].Read_IO_Higt!=NULL)
                {
                    //高电平
                     KEY_Data[i].Read_IO_Higt();
                     return;
                }
                
                if(KEY_Data[i].KeyTime>KEY_Data[i].keyLongTime)
				{
					//长按抬起执行
					if(KEY_Data[i].KEY_PressForALongTimeEXE!=NULL)
						KEY_Data[i].KEY_PressForALongTimeEXE();
				}else if(KEY_Data[i].KeyTime>KEY_Data[i].keyMinTime)
				{
					//短按抬起执行
					if(KEY_Data[i].KEY_ShortPressEXE!=NULL)
						KEY_Data[i].KEY_ShortPressEXE();
				}
				//时间清零
				KEY_Data[i].KeyTime=0;
			}
			else
			{
				//按键按下
				//按键定时器
				
                if(KEY_Data[i].Read_IO_Low!=NULL)
                {
                    //低电平
                     KEY_Data[i].Read_IO_Low();
                     return;
                }
                   
                KEY_Data[i].KeyTime++;
				if(KEY_Data[i].KeyTime>KEY_Data[i].keyLongTime)
				{
					//长按中执行
					if(KEY_Data[i].PressMediumForALongTime!=NULL)
						KEY_Data[i].PressMediumForALongTime();
				}else if(KEY_Data[i].KeyTime>KEY_Data[i].keyMinTime)
				{
					//短按中执行
					if(KEY_Data[i].PressMediumBriefly!=NULL)
						KEY_Data[i].PressMediumBriefly();
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值