MCU为430F149,编译环境为IAR,主时钟使用频率的800KHz,内部DCO。LED->P2.0, KEY1->P1.0, KEY2->P1.1。亲测可用。
/**********************************************
*程序描述:单片机的P1.0,P1.1连接两个独立按键,P1.0->KEY1,P1.1->kEY2,由外部中断下触发。P2.0->LED,MCLK = DCO 800KKHz
* 按键1按下每秒闪一下,按键2按下闪烁频率降低一半
***********************************************/
#include<msp430x14x.h>
#define keyin (P1IN & 0X0F) //用于读取按键接口的电平,延时消抖和松手检测
unsigned int KeyVal = 0; // 键值位全局变量,0表示异常,1,2分别为两个按键按下
void DelayXms(unsigned int i);
void keyInit(void); //键盘设置的初始化
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
keyInit(); //键盘初始化
P2DIR |= BIT0; //led口方向为输出
while(1){
P2OUT |= BIT0; //LED高电平
if(KeyVal==1)DelayXms(1000); //按键1按下延时1s
if(KeyVal==2)DelayXms(2000); //按键2按下延时2s
P2OUT &= ~BIT0; //LED低电平
if(KeyVal==1)DelayXms(1000); //按键1按下延时1s
if(KeyVal==2)DelayXms(2000); //按键1按下延时2s
}
return 0;
}
/****************************************************************************
*函数名: PORT1_ISR() /
*作用 :外部中断服务函数 /
*返回值:无 /
/
*****************************************************************************/
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void){
if(P1IFG&0x0f){
switch(P1IFG){
case 0x01:
if(keyin==0x0e)
{
DelayXms(5); //延时消抖
while(keyin==0x0e); //松手检测
KeyVal = 1; //键值为1
P1IFG = 0; //中断标志清零
return;
}
case 0x02:
if(keyin==0x0d)
{
DelayXms(5); //延时消抖
while(keyin==0x0d); //松手检测
KeyVal = 2; //键值为2
P1IFG = 0; //中断标志清零
return;
}
default:
{
KeyVal = 0;
LPM0_EXIT;
P1IFG = 0;
}
}
}
}
/****************************************************************************
*函数名: DelayXms() /
*作用 :800KHz的MCLK下,延时大约1s /
*返回值:无 /
/
*****************************************************************************/
void DelayXms(unsigned int i){
unsigned int j;
for( ; i>0; i--){
for(j=0;j<200;j++);
}
}
/****************************************************************************
*函数名: keyInit() /
*作用 :设置与四个独立按键相关的IO的配置,包括输入输出方向,中断触发方式 /
*返回值:无 /
/
*****************************************************************************/
void keyInit(void){
P1DIR &= ~(BIT0+BIT1+BIT2+BIT3);//设置四个按键的接受口为输入,注意,使用外部中断并不属于第二功能
P1IES |= BIT0+BIT1+BIT2+BIT3; //设置四个按键的中断触发方式为下降沿触发
P1IE |= BIT0+BIT1+BIT2+BIT3; //打开四个按键的外部中断
_EINT(); //打开总中断
}
|