MSP432P401R基础使用
二、GPIO做输入 按键输入
(一)GPIO做输入
1.代码
配置GPIO模式:
GPIO_setAslnputPin(Port,Pin);//设置为浮空输入
GPIO_setAslnputWithPullUpResistor(Port,Pin);//设置为上拉输入模式
GPIO_setAslnputWithPullDownResistor(Port,Pin);//设置为下拉输入模式
获取电平状态:
GPIO_getlnputPinValue(Port,Pin);
(二)按键输入
1.硬件连接
可以打开评估版手册(MSP432开发板手册/slau597f)37页原理图
可以看到按下后被拉低为低电平,所以我们应该把引脚配置为上拉输入
2.代码
key.h
#ifndef __KEY_H
#define __KEY_H
#include "driverlib.h"
#define KEY1 BITBAND_PERI(P1IN, 1) //读取按键1
#define KEY2 BITBAND_PERI(P1IN, 4) //读取按键2
#define KEY1_PRES 1 //KEY0按下
#define KEY2_PRES 2 //KEY1按下
void KEY_Init(void);//IO初始化
uint8_t KEY_Scan(uint8_t); //按键扫描函数
#endif
key.c
#include "driverlib.h"
#include "key.h"
//按键初始化函数
void KEY_Init(void) //IO初始化
{
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!
uint8_t KEY_Scan(uint8_t mode)
{
uint16_t i;
static uint8_t key_up = 1; //按键按松开标志
if (mode)
key_up = 1; //支持连按
if (key_up && (KEY2 == 0 || KEY1 == 0))
{
for (i = 0; i < 5000; i++)
; //去抖动
key_up = 0;
if (KEY1 == 0)
return KEY1_PRES;
else if (KEY2 == 0)
return KEY2_PRES;
}
else if (KEY2 == 1 && KEY1 == 1)
key_up = 1;
return 0;// 无按键按下
}
main.c
#include "driverlib.h"
/* Standard Includes */
#include <stdint.h>
#include <stdbool.h>
#include "led.h"
#include "key.h"
int main(void)
{
uint8_t key;
/* Stop Watchdog */
MAP_WDT_A_holdTimer();
LED_Init();
KEY_Init();
while (1)
{
key = KEY_Scan(0);//不支持连按
if (key == KEY1_PRES)
LED_RED_On();//打开LED1
else if (key == KEY2_PRES)
LED_RED_Off();//关闭LED1
}
}