2、DSP28335按键输入

文章介绍了使用F28335微控制器进行GPIO配置,实现多功能按键的单点和长按扫描,包括按键状态检测、消抖处理以及GPIO的输入输出操作。
摘要由CSDN通过智能技术生成
#include "mykey.h"

#define KEY_L1_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO48=1)
#define KEY_L2_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO49=1)
#define KEY_L3_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO50=1)

#define KEY_L1_SetH			(GpioDataRegs.GPBSET.bit.GPIO48=1)
#define KEY_L2_SetH			(GpioDataRegs.GPBSET.bit.GPIO49=1)
#define KEY_L3_SetH			(GpioDataRegs.GPBSET.bit.GPIO50=1)

#define KEY_H1			(GpioDataRegs.GPADAT.bit.GPIO12)
#define KEY_H2			(GpioDataRegs.GPADAT.bit.GPIO13)
#define KEY_H3			(GpioDataRegs.GPADAT.bit.GPIO14)

#define KEY1_PRESS		1
#define KEY2_PRESS		2
#define KEY3_PRESS		3
#define KEY4_PRESS		4
#define KEY5_PRESS		5
#define KEY6_PRESS		6
#define KEY7_PRESS		7
#define KEY8_PRESS		8
#define KEY9_PRESS		9
#define KEY_UNPRESS		0


void KeyInit(void)
{
	EALLOW;
	//在函数InitSysCtrl()中系统时钟初始化,默认已开启F28335所有外设时钟开启GPIO时钟

	//KEY端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;	//设置为通用GPIO功能
	GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;	//设置GPIO为输入功能
	GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;	//上拉使能

	GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
	GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;
	GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;

	GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
	GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;
	GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;
	GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;   //设置GPIO为输出功能
	GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0;
	GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;
	GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;
	GpioCtrlRegs.GPBDIR.bit.GPIO50 = 1;
	GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0;

	EDIS;

	//初始所有按键GPIO引脚(下方)输出高电平 一端均输出高电平
	GpioDataRegs.GPBSET.bit.GPIO48 = 1;
	GpioDataRegs.GPBSET.bit.GPIO49 = 1;
	GpioDataRegs.GPBSET.bit.GPIO50 = 1;

}

//按键扫描:参数为0时,为单点,参数为1时,为长按输入
Uint16 KeyScan(Uint16 mode)
{

	static Uint16 keyl1 = 1;
	static Uint16 keyl2 = 1;
	static Uint16 keyl3 = 1;

	//第1列(竖)扫描:第一列输出低电平,其他两列输出高电平
	KEY_L1_SetL;
	KEY_L2_SetH;
	KEY_L3_SetH;

	//KEY_H1、KEY_H2、KEY_H3 读取低电平(左方),表示按键按下
	if(keyl1 == 1 && (KEY_H1 == 0 || KEY_H2 == 0 || KEY_H3 == 0))
	{
		DELAY_US(10000);    //按键消抖 5~10ms

		//按键松开时,可以防止抖动产生影响,清0后,后续的抖动不会再进到该if中
		keyl1 = 0;
		if(KEY_H1 == 0)
		{
			return KEY1_PRESS;
		}
		else if(KEY_H2 == 0)
		{
			return KEY4_PRESS;
		}
		else if(KEY_H3 == 0)
		{
			return KEY7_PRESS;
		}
	}
	//按键没有按下
	else if(KEY_H1 == 1 && KEY_H2 == 1 && KEY_H3 == 1)
	{
	    //按键松开置1,方便下次if判断
		keyl1 = 1;
	}

	//函数的参数,实现长按,mode为1时,keyl1始终为1
	if(mode)
		keyl1 = 1;


	//第2列扫描
	KEY_L2_SetL;
	KEY_L1_SetH;
	KEY_L3_SetH;
	if(keyl2 == 1 && (KEY_H1 == 0 || KEY_H2 == 0 || KEY_H3 == 0))
	{
		DELAY_US(10000);
		keyl2 = 0;
		if(KEY_H1 == 0)
		{
			return KEY2_PRESS;
		}
		else if(KEY_H2 == 0)
		{
			return KEY5_PRESS;
		}
		else if(KEY_H3 == 0)
		{
			return KEY8_PRESS;
		}
	}
	else if(KEY_H1 == 1 && KEY_H2 == 1 && KEY_H3 == 1)
	{
		keyl2 = 1;
	}
	if(mode)
		keyl2 = 1;


	//第3列扫描
	KEY_L3_SetL;
	KEY_L1_SetH;
	KEY_L2_SetH;
	if(keyl3 == 1 && (KEY_H1 == 0 || KEY_H2 == 0 || KEY_H3 == 0))
	{
		DELAY_US(10000);
		keyl3 = 0;
		if(KEY_H1 == 0)
		{
			return KEY3_PRESS;
		}
		else if(KEY_H2 == 0)
		{
			return KEY6_PRESS;
		}
		else if(KEY_H3 == 0)
		{
			return KEY9_PRESS;
		}
	}
	else if(KEY_H1 == 1 && KEY_H2 == 1 && KEY_H3 == 1)
	{
		keyl3 = 1;
	}
	if(mode)
		keyl3 = 1;

	return KEY_UNPRESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值