|
#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;
} |
|
|