该程序由IAR编译运行,使用单片机的P1.0~P1.3口作为四个独立按键。由外部中断的下降沿触发。
/**********************************************
*程序描述:单片机的P1.0~P1.3连接四个独立按键,外部中断下触发
*作者 :huasir
*时间 :2017.10.28 22:10
***********************************************/
#include<msp430x14x.h>
#define keyin (P1IN & 0X0F)
unsigned int KeyVal = 0; // 键值,0表示异常,1,2,3,4分别为四个按键按下
void DelayXms(unsigned int i);
void keyInit(void); //键盘设置的初始化
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
keyInit(); //键盘初始化
LPM0; //进入低功耗模式
return 0;
}
/****************************************************************************
*函数名: PORT1_ISR() /
*作用 :外部中断服务函数 /
*返回值:无 /
*参数 :无 /
*作者 :huasir /
*时间 :2017.10.28 /
*****************************************************************************/
#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;
LPM0_EXIT;
P1IFG = 0;
return;
}
case 0x02:
if(keyin==0x0d)
{
DelayXms(5); //延时消抖
while(keyin==0x0d); //松手检测
KeyVal = 2;
LPM0_EXIT;
P1IFG = 0;
return;
}
case 0x04:
if(keyin==0x0b)
{
DelayXms(5); //延时消抖
while(keyin==0x0b); //松手检测
KeyVal = 3;
LPM0_EXIT;
P1IFG = 0;
return;
}
case 0x08:
if(keyin==0x07)
{
DelayXms(5); //延时消抖
while(keyin==0x07); //分手检测
KeyVal = 4;
LPM0_EXIT;
P1IFG = 0;
return;
}
default:
{
KeyVal = 0;
LPM0_EXIT;
P1IFG = 0;
}
}
}
}
void DelayXms(unsigned int i){
unsigned int j;
for( ; i>0; i--){
for(j=0;j<200;j++);
}
}
/****************************************************************************
*函数名: keyInit() /
*作用 :设置与四个独立按键相关的IO的配置,包括输入输出方向,中断触发方式 /
*返回值:无 /
*参数 :无 /
*作者 :huasir /
*时间 :2017.10.28 /
*****************************************************************************/
void keyInit(void){
P1DIR &= ~(BIT0+BIT1+BIT2+BIT3);//设置四个按键的接受口为输入,注意,使用外部中断并不属于第二功能
P1IES |= BIT0+BIT1+BIT2+BIT3; //设置四个按键的中断触发方式为下降沿触发
P1IE |= BIT0+BIT1+BIT2+BIT3; //打开四个按键的外部中断
_EINT();
}