#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;
}
2、DSP28335按键输入
于 2024-01-24 23:50:14 首次发布
文章介绍了使用F28335微控制器进行GPIO配置,实现多功能按键的单点和长按扫描,包括按键状态检测、消抖处理以及GPIO的输入输出操作。
摘要由CSDN通过智能技术生成