📄 key.c
字号:
/*****************************************************************************\
文件名:key.c
编写者:czhang
描述:MSP430非行列式键盘。适用于MSP430F149,其他型号的需要适当改变。
使用P1.5、P1.6、P1.7三个I/O口接按键。
版本:1.0 2004-5-10
\*****************************************************************************/
#include <MSP430x14x.h>
#include "key.h"
#include "df_timera.h"
//选用端口定义
#define KEYDIR P1DIR
#define KEYIES P1IES
#define KEYIE P1IE
#define KEYIN P1IN
#define KEYIFG P1IFG
//定义键盘管脚
#define KEY0 BIT5
#define KEY1 BIT6
#define KEY2 BIT7
#define KEY_MOD (KEY0+KEY1+KEY2)
unsigned char KeyZhi=KEY_NONE; //经过确认的键值
unsigned char KeyCnt; //某次连续按键的次数
unsigned char KeyDown=KEY_NONE; //被按下的键
#define KEY_TIME 50 //连续按键经过此时间,按键次数加1
unsigned char KeyTime; //记录连续按键的时间
/*****************************************************************************
初始化
*****************************************************************************/
void InitKey()
{
KEYDIR &= ~(KEY0+KEY1+KEY2); //设置端口为输入
KEYIES |= KEY0+KEY1+KEY2; //设置下降沿中断
KEYIE |= KEY0+KEY1+KEY2; //打开端口中断
KeyCnt=0; //按键次数请零
}
/*****************************************************************************
打开或者关闭键盘中断
sw: 0:关闭 100:打开
*****************************************************************************/
void GoKey(unsigned char sw)
{
if(sw==0)
KEYIE &= ~(KEY0+KEY1+KEY2); //关闭端口中断
else
KEYIE |= KEY0+KEY1+KEY2; //打开端口中断
}
/*****************************************************************************
获得键值和连续按下的键的有效次数,并清除记录的键值和有效次数
key_cnt:返回某一键被连续按下的有效次数
返回值:按下的有效的键的键值
*****************************************************************************/
unsigned char GetKeyZhi(unsigned char *key_cnt)
{
unsigned char q0;
q0=KeyZhi;
KeyZhi=KEY_NONE; //清除键值
*key_cnt =KeyCnt;
KeyCnt=0;
return q0;
}
/*****************************************************************************
判断按键的有效性
*****************************************************************************/
void IsKey()
{
if((KEYIN&KEY_MOD)==KEY_MOD)
{
//没有键按下
KeyDown=KEY_NONE;
GotimeDfA(0); //关闭定时器
GoKey(100); //打开键盘中断
}
else
{
if(KeyTime==0)
{
//连续按键的时间到
KeyTime=KEY_TIME;
if((KEYIN|KEY0==KEY0)&&KeyDown==KEY_P15)
{
//P1.5按键按下
KeyCnt++;
KeyZhi=KEY_P15;
}
else if((KEYIN|KEY1==KEY1)&&KeyDown==KEY_P16)
{
//P1.6按键按下
KeyCnt++;
KeyZhi=KEY_P16;
}
else if((KEYIN|KEY2==KEY2)&&KeyDown==KEY_P17)
{
//P1.7按键按下
KeyCnt++;
KeyZhi=KEY_P17;
}
else
{
KeyDown=KEY_NONE;
GotimeDfA(0); //关闭定时器
GoKey(100); //打开键盘中断
}
}
else
{
KeyTime--;
}
}
}
/*****************************************************************************
端口1中断函数
多中断中断源:P1IFG.0~P1IFG7,只用到P1.5 P1.6 P1.7三个中断源
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断
******************************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
unsigned char q0=0;
if((KEYIFG&KEY0) ==KEY0)
{
//处理P1IN.5中断
KEYIFG &= ~KEY0; //清除中断标志
KeyDown=KEY_P15; //记录按下的键值
q0=1;
}
else if((KEYIFG&KEY1) ==KEY1)
{
//处理P1IN.6中断
KEYIFG &= ~KEY1; //清除中断标志
KeyDown=KEY_P16; //记录按下的键值
q0=1;
}
else if((KEYIFG&KEY2) ==KEY2)
{
//处理P1IN.7中断
KEYIFG &= ~KEY2; //清除中断标志
KeyDown=KEY_P17; //记录按下的键值
q0=1;
}
else
{
//其他干扰引起的中断,不进行处理,只清除中断标志
KEYIFG=0;
}
if(q0==1)
{
GoKey(0); //关闭键盘中断
KeyTime=0;
KeyCnt=0;
GotimeDfA(100); //打开定时器A
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -