//#include "msp430g2201.h"
//#include "msp430g2302.h"
#include "msp430g2553.h"
#define SET 1
#define RESET 0
#define ENABLE 1
#define DISABLE 0
#define P10 0x01 //中断1辅助测试灯
#define P11 0x02
#define P12 0x04
#define P13 0x08 //外部中断1
#define P14 0x10 //外部中断2
#define P16 0x40 //中断2辅助测试灯
void Config_IOIN_Mode(char IO_Pin,char IS_OpenInt);
void Config_IOOut_Mode(char IO_Pin);
void Delay_Ms(unsigned int z);
unsigned int tmp = 0;//调试
unsigned char Key1_Flag = 0,Key2_Flag = 0;
unsigned int KEY1_Count = 0,KEY2_Count = 0;
unsigned char P11Out_Flag = 0,P12Out_Flag = 0;
void main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Config_IOIN_Mode((P13 | P14),ENABLE);
Config_IOOut_Mode((P10|P16)); //配置P1.0,P1.6为输出模式
//定时器配置
CCTL0 = CCIE;//使能比较中断,打开定时器
CCR0 = 10000;//比较器值,中断一次10ms
TACTL = TASSEL_2 + MC_1;//SMCLK时钟源,up计数方式,定时器时钟不分频
_EINT();//使能全局中断;
// LPM4; //进入LPM4低功耗模式
while(1)
{
if(Key1_Flag == SET)
{
if(P12Out_Flag == SET)//如果按键2执行动作中则取消动作,同时改为输入模式
{
P12Out_Flag = RESET;
KEY2_Count = 0;
P1OUT &= ~P16;//关闭测试灯
P1OUT &= ~P14;//输出低电平
Config_IOIN_Mode(P14,ENABLE);//重新配置为输入模式
// LPM4;
}
else
{
Config_IOOut_Mode(P13);//io由输入变为输出
// Delay_Ms(5);
P11Out_Flag = SET;
}
Key1_Flag = RESET;
}
if(P11Out_Flag == SET)
{
if(KEY1_Count < 500)//输出持续5s高电平
{
P1OUT |= P13;
}
else
{
KEY1_Count = 0;
P11Out_Flag = RESET;
P1OUT &= ~P13;
Config_IOIN_Mode(P13,ENABLE);
// Delay_Ms(10);
// LPM4;
}
}
if(Key2_Flag == SET)
{
if(P11Out_Flag == SET)//如果按键1执行动作中则取消动作,同时改为输入模式
{
P11Out_Flag = RESET;
KEY1_Count = 0;
P1OUT &= ~P10;//关闭测试灯LED1
P1OUT &= ~P13;
Config_IOIN_Mode(P13,ENABLE);
}
else
{
Config_IOOut_Mode(P14);
P12Out_Flag = SET;
}
Key2_Flag = RESET;
}
if(P12Out_Flag == SET)
{
if(KEY2_Count < 500)//输出持续5s高电平
{
P1OUT |= P14;//测试灯打开
P1OUT |= P16;
}
else
{
P12Out_Flag = RESET;
KEY2_Count = 0;
P1OUT &= ~P16;
P1OUT &= ~P14;
Config_IOIN_Mode(P14,ENABLE);
// Delay_Ms(10);
// LPM4;
}
}
if(P11Out_Flag == SET)//测试灯
{
if(tmp < 10 ){P1OUT |= P10;}
else if(tmp >= 10 && tmp <= 20){P1OUT &= ~P10;}
else tmp = 0;
}
}
}
/*************************************
函数名称:外部中断0,1
功 能:外部中断0,1的中断服务函数
参 数:无
返回值 :无
*************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
switch(P1IFG & 0x18)//判断是哪一个io发生中断
{
case 0x08:
{
Delay_Ms(90);
if(0x08 & P1IN)
{
while(0x08 & P1IN);//等待解除
P1IFG &= ~0x08;//清除中断P1.1标志
Key1_Flag = SET;
// LPM4_EXIT;
}
P1IFG &= ~0x08;//清除中断P1.1标志
break;
}
case 0x10:
{
//P1OUT ^= 0x40;
Delay_Ms(90);
if(0x10 & P1IN)
{
while(0x10 & P1IN);
P1IFG &= ~0x10;//清除中断P1.1标志
Key2_Flag = SET;
// LPM4_EXIT;
}
P1IFG &= ~0x10;//清除中断P1.2标志
break;
}
default:break;
}
}
/*************************************
函数名称:Timer_A
功 能:定时器A的中断服务函数
参 数:无
返回值 :无
*************************************/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
//static unsigned int P11Int_Count = 0,P12Int_Count = 0;
if(P11Out_Flag == SET)
{
tmp++;
KEY1_Count++;
}
if(P12Out_Flag == SET)
{
KEY2_Count++;
}
}
/*************************************
函数名称:Config_IOIN_Mode
功 能:io口配置为输入模式
参 数:IO_Pin
返回值 :无
*************************************/
void Config_IOIN_Mode(char IO_Pin,char IS_OpenInt)
{
P1DIR &= ~IO_Pin; //设置IO-Pin为输入模式
P1REN |= IO_Pin; //使能上下拉电阻
P1OUT &= ~IO_Pin; //配置为下拉电阻
if(IS_OpenInt == ENABLE)
{
P1IFG &= ~IO_Pin; //清除中断标志
P1IE |= IO_Pin; //使能IO_Pin外部中断
P1IES &= ~IO_Pin; //中断触发方式:上升沿
}
}
/*************************************
函数名称:Config_IOIN_Mode
功 能:io口配置为输入模式
参 数:IO_Pin
返回值 :无
*************************************/
void Config_IOOut_Mode(char IO_Pin)
{
P1DIR |= IO_Pin; //设置IO-Pin为输出模式
P1REN &= ~IO_Pin; //关闭上下拉电阻使能
P1IE &= ~IO_Pin; //关闭中断
P1OUT &= ~IO_Pin; //默认输出低电平
}
void Delay_Ms(unsigned int z)
{
unsigned int x,y;
for(x = 0;x < 100;x++)
for(y = 0;y < z;y++);
}
|