查看: 1746|回复: 0
打印 上一主题 下一主题

方便移植的中断扫描按键方式

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-14 21:43:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "msp430x41x.h"

#define KEY_IN        P1DIR&=~0x3f
#define KEY_IN_VALUE  P1IN&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 int  key_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;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表