(一)按键扫描
(1)配置引脚
在按键扫描这一节,仅需要配置好引脚即可,打开TI的GPIO驱动库,可以看到GPIO设置函数H文件如下:
在这个函数上方有对函数的说明:
解释为:该函数配置MSP432的GPIO引脚为输入模式,没有指明被配置的引脚是否被上拉或者下拉,当然如果需要配置输入上拉或者输入下拉需要使用此函数配置:
在这里我们直接使用普通配置,配置引脚为输入即可。
如下进行引脚初始化:(板载两个按键,一左一右均可以使用,注意复位键是在上面的)
//key pin init
void Key_Init(void)
{
GPIO_setAsInputPinWithPullUpResistor(KEY_LEFT_PORT,KEY_LEFT_PIN);
GPIO_setAsInputPinWithPullUpResistor(KEY_RIGHT_PORT,KEY_RIGHT_PIN);
}
(2)按键扫描,消抖,确认
在这里使用最简单的办法扫描按键:
C文件
//simple key scan
uint8 Key_Scan(void)
{
if(KEY_LEFT == 0)
{
delay_ms(5);
if(KEY_LEFT == 0)
return KEY_LEFT_PRESS;
}
else if(KEY_RIGHT == 0)
{
delay_ms(5);
if(KEY_RIGHT == 0)
return KEY_RIGHT_PRESS;
}
//
return 0;
}
H文件
#define KEY_LEFT_PORT GPIO_PORT_P1
#define KEY_LEFT_PIN GPIO_PIN1
#define KEY_LEFT GPIO_getInputPinValue(KEY_LEFT_PORT,KEY_LEFT_PIN)
#define KEY_LEFT_PRESS 1
#define KEY_RIGHT_PORT GPIO_PORT_P1
#define KEY_RIGHT_PIN GPIO_PIN4
#define KEY_RIGHT GPIO_getInputPinValue(KEY_RIGHT_PORT,KEY_RIGHT_PIN)
#define KEY_RIGHT_PRESS 2
在扫描函数中使用delay_ms进行消抖,防止误判
主函数中检测到按键按下配置LED为相应状态:
LED在前一节写完后就直接封装成了宏,便于调用,这样按键扫描就完成了!
(二)按键中断
(1)配置GPIO模式以及中断
在这里我们需要配置PORT1的中断,注意的是在这个函数中已经配置好引脚:
//key int init
//!中断函数需要自己在isr.c中注册
void Key_Int_Init(void)
{
//配置引脚
GPIO_setAsInputPinWithPullUpResistor(KEY_LEFT_PORT,KEY_LEFT_PIN);
//配置中断
GPIO_clearInterruptFlag(KEY_LEFT_PORT, KEY_LEFT_PIN);
GPIO_enableInterrupt(KEY_LEFT_PORT, KEY_LEFT_PIN);
//开启GPIO_PORT中断
Interrupt_enableInterrupt(INT_PORT1);
//使能总中断控制器
Interrupt_enableMaster();
}
(2)中断函数注册,下载启动
我们需要注册中断函数,在.s文件中我们可以看到注册的函数为:
那么我们需要只用这个中断函数名注册中断:
/* GPIO ISR */
void PORT1_IRQHandler(void)
{
uint32_t status;
status = GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
GPIO_clearInterruptFlag(GPIO_PORT_P1, status);
/* Toggling the output on the LED */
if(status & GPIO_PIN1)
{
LED_TOGGLE;
}
}
注意:在进入中断函数时需要立刻清除引脚中断状态,否则中断会一直进行进而卡死单片机。
下载完成后的正常现象是:按下按键P1.1后红色LED的状态翻转。
克隆空白工程请使用 git , 如果你觉得还不错欢迎点亮 star !
git clone https://github.com/YGZone/Design-a-car-with-MSP432P401R.git