TMS320F28379D单片机的库函数外部中断延时函数实现多个按键消抖的程序封装一个按键函数
时间: 2024-03-20 11:44:13 浏览: 67
好的,针对您的需求,我们可以封装一个按键函数,来实现多个按键的消抖。具体实现如下:
```c
#include "F2837xD_Gpio.h"
#include "F2837xD_Intrupt.h"
#include "F2837xD_Examples.h"
#define KEY_DEBOUNCE_TIME 100 //按键消抖时间,单位为毫秒
void InitKeyGpio(void);
interrupt void KeyISR(void);
volatile Uint16 keyStatus = 0; //按键状态标志,用于记录按键是否按下
void InitKeyGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; //GPIO0设置为普通I/O口
GpioCtrlRegs.GPADIR.bit.GPIO0 = 0; //GPIO0设置为输入
GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 2; //GPIO0设置为双边沿中断
GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = 0xFF; //采样周期为255个SYSCLKOUT周期
IER |= M_INT1; //使能INT1中断
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能GPIO0中断
EINT; //开全局中断
EDIS;
}
interrupt void KeyISR(void)
{
static Uint16 keyCount = 0; //按键计数器,用于计算按键消抖时间
if(GpioDataRegs.GPADAT.bit.GPIO0 == 0) //如果按键按下
{
keyCount++; //计数器加1
if(keyCount >= KEY_DEBOUNCE_TIME) //如果计数器大于等于按键消抖时间
{
keyStatus = 1; //按键状态标志置1
keyCount = 0; //计数器清零
}
}
else //如果按键弹起
{
keyCount = 0; //计数器清零
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //清除中断标志
}
Uint16 GetKeyStatus(void)
{
Uint16 status = keyStatus; //获取按键状态
keyStatus = 0; //按键状态标志清零
return status; //返回按键状态
}
```
在主函数中,调用`InitKeyGpio()`函数初始化按键GPIO口,并在需要的地方调用`GetKeyStatus()`函数获取按键状态即可。
```c
void main(void)
{
InitSysCtrl();
InitKeyGpio();
while(1)
{
if(GetKeyStatus()) //如果按键被按下
{
//执行相应的操作
}
}
}
```
这样,就实现了一个简单的按键函数,可以支持多个按键的消抖。
阅读全文