MSP432E401Y学习笔记2-按键控制_查询
前言
今天通过按键控制LED灯的亮灭,按键控制通常有两种方式,今天我们使用查询的方式,按键USR_SW1每按下一次,LED闪烁一下。
其实按键与LED本质上都是一回事,都是考察我们对GPIO的配置理解。
一、原理图查看需要控制的IO
打开MSP432E401Y的原理图,可以看见这里有两个按键和两个LED。那我们就使用D2作为显示的灯,USR_SW1作为控制的按键。
可以知道,他们分别对应的是PN0与PJ0。也就是我们需要的GPION与GPIOJ进行相关配置。话不多说,开始写代码吧!
二、写代码
1.将点灯的工程拷贝一份
点灯的工程在笔记1有提供百度网盘链接。
我们先在Drive目录下新建四个文件,分别是KEY与LED,我们对于两者的配置都写到此处
打开工程,可以看到以下界面,把新建的LED.c、KEY.c加入Drive目录
2.配置LED
void led_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0);
}
LED的初始化和之前点灯里是一样的,只是现在我们写的规范些。
两个函数,一个是开启对应GPIO的的时钟
另一个是设置对应管脚为输出方向
## 3.配置KEY
void key_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
GPIOPinTypeGPIOInput(GPIO_PORTJ_BASE,GPIO_PIN_0);
GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_0,
GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
}
首先看按键的初始化配置,很明显可以看出第一个函数还是打开对应的时钟
第二个函数字面也能看出,设置为输入方向
第三个重点讲讲,他就涉及到了一些更细致的配置了
我们按F12跳转到这个函数的定义,可以看到如下的说明文档`
//! Sets the pad configuration for the specified pin(s).
//!
//! \param ui32Port is the base address of the GPIO port.
//! \param ui8Pins is the bit-packed representation of the pin(s).
//! \param ui32Strength specifies the output drive strength.
//! \param ui32PinType specifies the pin type.
//! 设置指定引脚的焊盘配置。
//!
//! \param ui32Port是GPIO端口的基址。
//! \param ui8Pins是管脚的位压缩表示形式。
//! \param ui32Strength指定输出驱动强度。
//! \参数ui32PinType指定引脚类型。
//!
因为由原理图知道按键按下对应的是低电平,所以我们在配置按键IO的时候应该设置为上拉模式。上拉模式简单理解就是,保持端口电平为高电平,这样一旦检测到端口为低电平时,那必然是按键按下了。
uint8_t keyscan(void)
{
return GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_0);
}
再看按键扫描函数,因为只需要检测一个按键状态,所以只需要要读取这个按键的端口值并返回即可。0代表按键按下,1代表按键未被按下。
2.mian文件
#include <stdint.h>
#include <stdbool.h>
#include "ti/devices/msp432e4/driverlib/driverlib.h"
#include "LED.h"
#include "KEY.h"
void delay()
{
int i=0xffffff;
while(i--);
}
int main(void)
{
MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),120000000);
key_init();
led_init();
while(1)
{
if(!keyscan())
{
GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0,GPIO_PIN_0);
delay();
GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0,0);
}
}
}
这里相信大家都很好理解了,就是写了个简单的延时函数,初始化了对应的led、key。唯一值得一提的就是配置系统时钟这个函数
MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),120000000);
这句话的意思就是配置系统时钟为120M