📄 msp430key.c
字号:
#include<MSP430x16x.h>
#include"MSP430KEY.h"
#include"df_timera.h"
//选用端口定义
#define KEYDIR P1DIR
#define KEYIES P1IES
#define KEYIE P1IE
#define KEYIN P1IN
#define KEYOUT P1OUT
#define KEYIFG P1IFG
//定义键盘管脚
#define KEY_MOD_H 0x0F //行端口的模(0x0F)
#define KEY_MOD_L 0xF0 //列端口的模(0xF0)
#define KEY_LIE 4
unsigned char KeyZhi=KEY_NONE; //经过确认的键值
unsigned char KeyCnt; //某次连续按键的次数
unsigned char KeyDown=KEY_NONE; //记录连续按键的时间
#define KEY_TIME 50 //连续按键经过此时间,按键次数加1
unsigned char KeyTime; //记录连续按键的时间
/***************************************************************************
初始化
***************************************************************************/
void InitKey()
{
KEYDIR &=~KEY_MOD_H; //设置行端口为输入
KEYDIR |=KEY_MOD_L; //设置列端口为输出
KEYOUT &=~KEY_MOD_L; //设置列端口输出为低电平
KEYIES |=KEY_MOD_H; //设置行端口下降沿中断
KEYIE |=KEY_MOD_H; //打开行端口中断
KEYIFG=0;
KeyCnt=0; //按键次数清零
}
/***************************************************************************
打开或者关闭键盘中断
SW: 0:关闭; 100:打开
***************************************************************************/
void GoKey(unsigned char sw)
{
if(sw==0)
KEYIE &=~KEY_MOD_H; //关闭端口中断
else
KEYIE |=KEY_MOD_H; //打开端口中断
}
/***************************************************************************
获得键值和连续按下的键的有效次数,并清除记录的键值和有效次数
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()
{
unsigned char key;
key=ReadKey();
if(key==KEY_NONE)
{
//没有键按下
KeyDown=KEY_NONE;
GotimeDfA(0); //关闭定时器
GoKey(100); //打开键盘中断
}
else
{
if(KeyTime==0)
{
KeyTime=KEY_TIME;
if(key==KeyDown)
{
KeyCnt++;
KeyZhi=key;
}
else
{
KeyDown=KEY_NONE;
GotimeDfA(0); //关闭定时器
GoKey(100); //打开键盘中断
}
}
else
KeyTime--;
}
}
/*****************************************************************************
端口1中断函数
多中断中断源:P1IFG。0~P1IFG。7,只响应行端口的中断
进入中断后应首先判断中断源,退出中断前应清除出党中断标志,否则将再次触发中断
*****************************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1 ()
{
if((KEYIFG&KEY_MOD_H)!=0) //判断是否按键触发的中断
{
KeyDown=ReadKey();
if(KeyDown!=KEY_NONE)
{
GoKey(0); //关闭键盘中断
KeyTime=0;
KeyCnt=0;
GotimeDfA(100); //打开定时器A
}
}
KEYIFG=0; //清除中断标志
}
/*****************************************************************************
行列式键盘读取键值,判断哪一个键被按下
返回值:读取的键值
*****************************************************************************/
unsigned char ReadKey()
{
unsigned char key=0,hang,q0=0,q1;
//判断按键的列的掩码
unsigned char lie=0xEF;
//确定按键的行
hang=(~KEYIN)&KEY_MOD_H; //读入的数据取反,然后屏蔽不需要的位
if(hang!=0)
{
//确定按键的列
for(q0=0;q0<KEY_LIE-1;q0++)
{
KEYOUT=0xFF;
KEYOUT&=lie; //某一列输出为高电平 ,其他输出为低电平//某一列端口输出低电平,其他输出高电平
q1=KEYIN&KEY_MOD_H;
if((q1&hang)==0)
{
break; //确定了列值
}
lie<<=1;
}
if(q0!=KEY_LIE)
{
key=hang+((~lie)&KEY_MOD_L); //键值为行值+列值
}
else
key=KEY_NONE;
}
else
key=KEY_NONE;
KEYOUT &=(~KEY_MOD_L); //设置列端口为输出低电平
return key;
}
/**************************************************************
键盘处理,返回相应的整数值
**************************************************************/
unsigned int KeyHandle(unsigned char keyIndex)
{
P3DIR=0xFF;
P3OUT=~keyIndex;
if(keyIndex==0x11)
return 1;
if(keyIndex==0x21)
return 2;
if(keyIndex==0x41)
return 3;
if(keyIndex==0x12)
return 4;
if(keyIndex==0x22)
return 5;
if(keyIndex==0x42)
return 6;
if(keyIndex==0x14)
return 7;
if(keyIndex==0x24)
return 8;
if(keyIndex==0x44)
return 9;
if(keyIndex==0x28)
return 0;
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -