微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MSP430G2553测试程序(长短按键识别)

MSP430G2553测试程序(长短按键识别)

时间:11-11 来源:互联网 点击:
//原始状态P1.6亮,P1.0暗,利用状态机进行按键检测,短按键情况下并释放的瞬间P1.0翻转,P1.6翻转

//长按键P1.0,P1.6按照10Hz的频率闪烁
// MSP430G2xx3
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// P1.3|KEY P1.6|-->LED
// | P1.0|-->LED
// 作者http://jiwm.blog.163.com
// Built with IAR Embedded Workbench Version: 5.40
//******************************************************************************
#include "msp430g2553.h"
#define NOKEY 0 //未按下状态
#define PUSH_KEY 1 //短按状态
#define LONG_KEY 2 //长按状态
unsigned char KEY=0; //按键状态处理
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1= CALBC1_1MHZ; //1M内部时钟
DCOCTL = CALDCO_1MHZ;
P1DIR |=BIT6+BIT0; // 设置 P1.6,P1.0为输出
P1OUT|=BIT0; //设置初值,P1.0亮
P1OUT&=~BIT6; //设置初值,P1.6不亮
P1REN|=BIT3; //配置上拉电阻
TACCTL0 |= CCIE; // CCR0 interrupt enabled
TACCR0 =2500; //计到2.5K,约20ms
TACTL = TASSEL_2+ID_3+MC_1+TACLR; //设置TIMERA的时钟源为SMCLK(1M),8分频后(125K),计数模式为up,到CCR0再自动从0开始计数
_BIS_SR(GIE); //开总中断
TACCTL0 |= CCIE; // CCR0 interrupt enabled
while(1)
{
switch(KEY) //按键动作
{ case 1: //短按状态时进行按键处理
{P1OUT^=BIT0; //翻转
P1OUT^=BIT6; //翻转
KEY=0;}
break;
case 2: //长按初始状态
{P1OUT|=BIT0; //设置初值,P1.0亮
P1OUT|=BIT6; //设置初值,P1.6亮
KEY=0;}
break; //必须要,需要退出循环
case 3: //长按状态时进行按键处理
{P1OUT^=BIT0; //翻转
P1OUT^=BIT6; //翻转
KEY=0;}
break;
}
}
}

/************************************************
定时中断响应
*************************************************/
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)

{ //TACCTL0&=~ CCIE; //关中断
static unsigned char KEY_State=0; //按键的状态变量
static unsigned char i,j=0; //计数,用于处理时间
switch(KEY_State) //处理按键状态
{case NOKEY: //未按键时进行按键处理
if ((P1IN&BIT3)==0)
{KEY_State=PUSH_KEY; //按下按键后,进入短按状态
}
break; //必须要,需要退出循环
case PUSH_KEY: //短按状态时进行按键处理
if((P1IN&BIT3)!=0) //释放按键,认为是一次短按,加以处理
{ KEY=1; //按键赋值
KEY_State=NOKEY; //回到未按状态
}
else
{
if (i<100)
{ //KEY=0; //KEY返回0,接收下一次数据
i++; //计数,以实现长按键,约2秒
}
else
{
i=0;
KEY=2; //输出长按初始状态
KEY_State=LONG_KEY; //长按状态
}
}
break;

case LONG_KEY: //长按状态时进行按键处理
if((P1IN&BIT3)!=0) //释放按键,退出
{ KEY=0; //按键赋值
KEY_State=NOKEY; //回到未按状态
}
else
{
if (j<5)
{
j++; //计数,以实现长按键状态计时,约0.1秒
}
else
{j=0; //重新计数
KEY=3; //长按状态的处理
}
}
break;

}
TACCTL0|= CCIE; //开中断
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top