概述
现在在实习,上班实在太困了,做静态测试一天改了4000行代码,改得眼睛都冒火了。。
这次是实验二,按键输入,初学者从这可以简单的知道msp432e的输入输出如何使用。
按键输入核心就是我们获取按键的状态,本文通过获取一个按键的长按和短按,去执行不同的效果。
实验效果:按键按下,程序开始识别,直到松开,若按下时长小于2s,判定为短按,则led1一按一亮灭,若大于2s,判定为长按,则led1疯狂闪烁。
由于会用到定时器,实验关于定时器部分可以忽略,就看看是如何做到的就行了。
最新更改日期2021/9/15 并且懒得写注释了
author:denghua.zhu
time:2021/9/15
content:key input
/*****************
*
*main.c
*
*****************/
#include "driverlib.h"
#include "stdint.h"
#include "stdbool.h"
#include "delay.h"
#include "gpio.h"
#include "led.h"
#include "key.h"
#include "inc/hw_gpio.h"
led led1 = {GPIO_PORTN_BASE,GPIO_PIN_0};
key key1 = {GPIO_PORTJ_BASE,GPIO_PIN_0};
#define light HWREG(led1.prot + (GPIO_O_DATA + (led1.pin << 2)))
#define button GPIOPinRead(key1.prot, key1.pin)
uint8_t key_scan_shrot = 0; /*the short state*/
uint8_t key_scan_long = 0; /* the long state */
uint8_t led_long = 0; /* program in led of long*/
int main(void)
{
/*clock */
SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),
120000000);
/* enable the gpio */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); /*led*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ); /*key*/
/*set output or in put*/
GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0);
GPIOPinTypeGPIOInput(GPIO_PORTJ_BASE, GPIO_PIN_0);
GPIOJ->PUR |= GPIO_PIN_0; /*Pull-Up Select,It's not necessary*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
IntMasterEnable();
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
IntEnable(INT_TIMER0A);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
while(1){
if(button == 0)
{
led_long = 0;
TimerDisable(TIMER0_BASE, TIMER_A);
TimerLoadSet(TIMER0_BASE, TIMER_A, 120000000*2);
delay_ms(10);
if(button == 0)
{
TimerEnable(TIMER0_BASE, TIMER_A);
while(button == 0 && key_scan_long == 0){}
if(key_scan_long == 0)
{key_scan_shrot = 1; }
}
}
if(key_scan_shrot == 1)
{
light = (light == 0) ? 1:0;
TimerDisable(TIMER0_BASE, TIMER_A);
key_scan_shrot = 0;
}
if(key_scan_long == 1)
{
TimerDisable(TIMER0_BASE, TIMER_A);
TimerLoadSet(TIMER0_BASE, TIMER_A, 120000000/5);
TimerEnable(TIMER0_BASE, TIMER_A);
led_long = 1;
while(button == 0){}
key_scan_long = 0;
}
}
}
void TIMER0A_IRQHandler(void)
{
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
MAP_IntMasterDisable();
if(led_long == 1U)
{
light = (light == 0) ? 1:0;
TimerEnable(TIMER0_BASE, TIMER_A);
}
else
{key_scan_long = 1U;}
MAP_IntMasterEnable();
}
/*
*
*key.h
*
*/
#include "driverlib.h"
typedef struct{
uint32_t prot;
uint8_t pin;
}key;
/*
*
*led.h
*
*/
#include "driverlib.h"
typedef struct{
uint32_t prot;
uint8_t pin;
}led;
最后
以上就是醉熏牛排为你收集整理的stm32->msp432e系列:实验二 按键输入(按键多用,一个按键实现长和短按)的全部内容,希望文章能够帮你解决stm32->msp432e系列:实验二 按键输入(按键多用,一个按键实现长和短按)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复