我是靠谱客的博主 醉熏牛排,最近开发中收集的这篇文章主要介绍stm32->msp432e系列:实验二 按键输入(按键多用,一个按键实现长和短按),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

现在在实习,上班实在太困了,做静态测试一天改了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系列:实验二 按键输入(按键多用,一个按键实现长和短按)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部