peterliuzq 发表于 2010-9-15 10:11:14

方便移植的中断扫描按键方式(包括单击按键、组合键、持续按键)

#include "msp430x41x.h"

#define KEY_IN      P1DIR&=~0x3f
#define KEY_IN_VALUEP1IN&0x3f
#define KEY1          0x01
#define KEY2          0x02
#define KEY3          0x04
#define KEY4          0x08
#define KEY5          0x10
#define KEY6          0x20

#define Key_mask      0x00
#define No_key      0xff

unsigned char Timer_keyFlag;

/*
初始化KEY及LED端口
in: 无
out:无
*/
void Init_key (void)
{
KEY_IN;
}


/*
读取判断按键值
in: 无
out:按键值 key_return
*/
unsigned char Read_key(void)
{
static unsigned char key_state = 0;
static unsigned intkey_value1,key_value;
unsigned char key_return=No_key;
if(Timer_keyFlag==1)//判断扫描KEY时间标志位
{
    Timer_keyFlag=0;
    //如果是N*N键盘方式,再次添加循环检测代码,检测有按键时,返回按键输入值,没有返回无按键
    switch (key_state)
    {
    case 0: //判断是否有按键
      {
      key_value=KEY_IN_VALUE;
      if(key_value==Key_mask)//无按键重新判断
      {
          key_state=0;
      }
      else                   //有按键判断按键值
      {
          key_state++;
      }
      break;
      }
    case 1://判断按键值
      {
      key_value1=KEY_IN_VALUE;
      if(key_value1==Key_mask)//无按键重新判断
      {
          key_state=0;
      }
      else if(key_value==key_value1)//有按键判断按键值是否与上一次读取值相等,相等判断按键值(可判断持续按键及组合键)
      {
          switch (key_value)
          {
          case KEY1: //
            {
            key_return = 1;
            break;
            }
          case KEY2: //
            {
            key_return = 2;
            break;            
            }
          case KEY3: //
            {
            key_return = 3;
            break;            
            }
          case KEY4: //
            {
            key_return = 4;
            break;            
            }
          case KEY5: //
            {
            key_return = 5;
            break;            
            }
          case KEY6: //
            {
            key_return = 6;
            break;            
            }
          }
      }
      else//有按键与上一次读取值不等,等按键松开后重新判断
      {
          key_state++;
      }
      break;
      }
    case 2://松开按键判断
      {
      key_value=KEY_IN_VALUE;
      if(key_value==Key_mask)
      {
          key_state=0;
      }
      break;
      }
    }
}
return key_return;
}

/*
TimerA0初始化
in: 定时时间vlaue    //vlaue=2048   1/16 S
out:无
*/
void Init_TimerA0(unsigned int vlaue)
{
TACTL=TASSEL0+TACLR; //32K ACLK
TACCTL0=CCIE;
if(vlaue>32768)
{
    vlaue=32768;
}
TACCR0=vlaue;   
TACTL|=MC0;
}


/*
TimerA0中断
in: 无
out:无
*/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
Timer_keyFlag=1;
}
页: [1]
查看完整版本: 方便移植的中断扫描按键方式(包括单击按键、组合键、持续按键)