搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2010-9-15 10:11:14 | 显示全部楼层 |阅读模式
#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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 06:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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