#include <msp430x14x.h>
#include "press.h"
#include "displaynew.h"
unsigned int NumofTimerA;
unsigned char SET;
unsigned char MODE;
unsigned char UP;
unsigned char DOWN;
unsigned char long_MODE;
unsigned char ALARM_flag;
unsigned char OPEN;
unsigned char SETOK;
unsigned char MENU;
void init_BUTTON(void)//初始化四个按键SET、MODE、UP和DOWN
{
BUTTON_SEL&=~(BUTTON_SET+BUTTON_MODE+BUTTON_UP+BUTTON_DOWN);//设置相应位为普通I/O口
BUTTON_DIR&=~(BUTTON_SET+BUTTON_MODE+BUTTON_UP+BUTTON_DOWN);//设置相应位为输入
BUTTON_IES|=BUTTON_SET+BUTTON_MODE+BUTTON_UP+BUTTON_DOWN;//设置相应位为下降沿触发
BUTTON_IE|=BUTTON_SET+BUTTON_MODE+BUTTON_UP+BUTTON_DOWN;//允许相应位I/O中断
}
void init_LED(void)//初始化LED显示灯和继电器
{
LED_SEL&=~(LED_AL1+LED_AL2+LED_TR+LED_LEL+LED_mA+LED_ZERO+LED_SPAN);//设置LED相应位为普通I/O口
LED_DIR|=LED_AL1+LED_AL2+LED_TR+LED_LEL+LED_mA+LED_ZERO+LED_SPAN;//设置LED相应位为输出
Relay_SEL&=~(Relay_AL1+Relay_AL2+Relay_TR);// 设置继电器相应位为普通I/O口
Relay_DIR|=Relay_AL1+Relay_AL2+Relay_TR;//设置继电器相应位为输出
}
void init_TIMERA(void)
{
TACTL|=TASSEL_2+TACLR+ID_3;//选择SMCLK作为时钟源,8分频,即计数器的记数频率为125KHz
TACTL|=MC0+TAIE;//增计数模式,使能中断
TACCR0=0x30D3;//12499+1=12500,中断周期为0.1s
}
void Process(void)
{
if (SET==1)
{
////////////////////////////////////////////////////////////////////////
if ((STATE==STAT_VOLTAGE)&&(display_flag==display_state)&&(MENU==1))
{
display_flag=display_voltage;
MENU=0;
}
if ((STATE==STATE_ZERO)&&(display_flag==display_state)&&(MENU==1))
{
display_flag=display_voltage;
MENU=0;
SETOK=0;
}
if ((STATE==STATE_ZERO)&&(display_flag==display_state)&&(SETOK==0))
{
display_flag=display_LEL;
SETOK=1;
}
if ((STATE==STATE_SPAN)&&(display_flag==display_state)&&(MENU==1))
{
display_flag=display_voltage;
MENU=0;
SETOK=0;
}
if ((STATE==STATE_SPAN)&&(display_flag==display_voltage)&&(SETOK==0))
{
display_flag=display_LEL;
SETOK=1;
}
if ((STATE==STATE_CURRENT)&&(display_flag==display_state)&&(MENU==1))
{
MENU=0;
SETOK=0;
}
if ((STATE==STATE_CURRENT)&&(display_flag==display_state)&&(MENU==0)&&(SETOK==1))
{
}
////////////////////////////////////////////////////////////////////////
SET=0;//清除标志
}//处理按键SET按下结束
if (MODE==1)
{
/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
MODE=0;//清除标志
}//处理按键MODE按下结束
if (long_MODE==1)
{
/////////////////////////////////////////////////////////////////////////
if (STATE==STATE_TEST)
{
STATE=STATE_VOLTAGE;
MENU=1;
display_flag=display_state;
}
if ((MENU==1)&&(display_flag==display_state))
{
STATE=STATE_TEST;
MENU=0;
display_flag=display_LEL;
}
///////////////////////////////////////////////////////////////////////////
long_MODE=0;//清除标志
}//处理长按MODE结束
}
#pragma vector = PORT2_VECTOR
__interrupt void Port2()
{
BUTTON_IE &= ~(BUTTON_SET+BUTTON_MODE+BUTTON_UP+BUTTON_DOWN);//禁止按键中断
if((BUTTON_IFG&BUTTON_SET)==BUTTON_SET)
{
BUTTON_IFG &= ~BUTTON_SET;//清除中断标志
SET=1;
}
if((BUTTON_IFG&BUTTON_MODE)==BUTTON_MODE)
{
BUTTON_IFG &= ~BUTTON_MODE;//清除中断标志
MODE=1;
NumofTimerA=0;//定时器记数变量初始化
init_TIMERA();//初始化定时器
}
if((BUTTON_IFG&BUTTON_UP)==BUTTON_UP)
{
BUTTON_IFG &= ~BUTTON_UP;//清除中断标志
UP=1;
}
if((BUTTON_IFG&BUTTON_DOWN)==BUTTON_DOWN)
{
BUTTON_IFG &= ~BUTTON_DOWN;//清除中断标志
DOWN=1;
}
BUTTON_IE|= (BUTTON_SET+BUTTON_MODE+BUTTON_UP+BUTTON_DOWN);//允许按键中断
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:NumofTimerA++;;break;
}
if ((NumofTimerA==10)&&(BUTTON_IN&BUTTON_MODE)) //如果1s时MODE键没有按下,表示MODE不是长按
{
TACTL|=TACLR;//Timer_A清零
TACTL&=~TAIE;//屏蔽Timer_A中断
NumofTimerA=0;//清除计数累加值
}
if ((NumofTimerA==20)&&(BUTTON_IN&BUTTON_MODE)) //如果2s时MODE键没有按下,表示MODE不是长按
{
TACTL|=TACLR;//Timer_A清零
TACTL&=~TAIE;//屏蔽Timer_A中断
NumofTimerA=0;//清除计数累加值
}
if (NumofTimerA>=25)//2.5s时MODE键仍然按下,则MODE为长按
{
MODE=0;
long_MODE=1;//MODE长按标志置1
NumofTimerA=0;//清除计数累加值
}
}