?? 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 + -