/*****************************************************************
//文件名 :Keypad.c
//描述 :該文件定義與矩陣鍵盤有關的各種接口、函數,適用於MSP430F149
//編寫人 :小邪@清水
//版本號 :1.01
*****************************************************************/
#include <msp430x14x.h>
#include "12864.h"
uchar keyPressed; //按鍵是否被按下:1--是,0--否
uchar keyval; //存放鍵值
uchar keyFlag; //按鍵是否已放開:1--是,0--否
//設置鍵盤邏輯鍵值與程序計算鍵值的映射
// 1 2 3 13(enter)
// 4 5 6 14(up)
// 7 8 9 15(down)
// 11(.) 0 12(back) 16(clear)
uchar key_Map[] = {1,2,3,13,4,5,6,14,7,8,9,15,11,0,12,16};
/*************************************************************************
//名稱 : InitKeypad
//參數 : 延時的時間n
//返回值: 無
//功能 : 初始化矩陣鍵盤的IO口
*************************************************************************/
void InitKeypad(void)
{
P1DIR = 0xf0; //P1.0~P1.3設置爲輸入狀態, P1.4~P1.7設置爲輸出狀態
P1OUT |= 0xf0; // P1.4~P1.7輸出高電平
keyFlag = 0;
keyPressed = 0;
keyval = 0;
}
/*************************************************************************
//名稱 : CheckKey
//參數 : 無
//返回值: 無
//功能 : 掃描矩陣鍵盤,獲取鍵值
*************************************************************************/
void CheckKey(void)
{
uchar row ,col,tmp1,tmp2;
tmp1 = 0x80;
for(row = 0;row < 4;row++) //行掃描
{
P1OUT = 0xf0; //P1.4~P1.7輸出全1
P1OUT -= tmp1; //P1.4~p1.7輸出四位中有一個爲0
tmp1 >>=1;
if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位爲0
{
tmp2 = 0x01; //tmp2用於檢測出那一位爲0
for(col = 0;col < 4;col++) //列檢測
{
if((P1IN & tmp2) == 0x00) //是否是該列,等於0爲是
{
keyval = key_Map[row * 4 + col]; //獲取鍵值
return; //退出循環
}
tmp2 <<= 1; //tmp2右移1位
}
}
}
}
/*************************************************************************
//名稱 : delay
//參數 : 無
//返回值: 無
//功能 : 延時 15 ms的時間,用於消抖
*************************************************************************/
void delay()
{
uint tmp;
for(tmp = 12000;tmp > 0;tmp--);
}
/*************************************************************************
//名稱 : KeyEvent
//參數 : 無
//返回值: 無
//功能 : 檢測按鍵,獲取鍵值
*************************************************************************/
void KeyEvent(void)
{
uchar tmp;
P1OUT &= 0x00; //設置P1OUT全爲0,等待按鍵輸入
tmp = P1IN; //獲取 p1IN
if ((keyPressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有鍵按下
{
keyPressed = 1; //如果有按鍵按下,設置keyPressed標識
delay(); //消除抖動
CheckKey(); //調用checkKey(),獲取鍵值
}
else if ((keyPressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按鍵已經釋放
{
keyPressed = 0; //清除keyPressed標識
keyFlag = 1; //設置keyFlag標識
}
else
{
keyval = 17;
}
}
/*************************************************************************
//名稱 : KeyScan
//參數 : 儲存矩陣鍵盤結果的數組的指針
//返回值: 無
//功能 : 將矩陣鍵盤掃描到的數據存儲到數組中
*************************************************************************/
void KeyScan(uchar *keyscan)
{
uchar i,n,flag;
i = 0;
flag = 0;
for(;;)
{
KeyEvent();
if(keyFlag == 1)keyFlag = 0;
if(keyval >= 0 && keyval <= 9)keyscan[i] = keyval + '0'; //按下數字鍵
if(keyval == 11)keyscan[i] = '.'; //按下小數點
if(keyval == 12) //按下退格鍵
{
keyscan[i-1]=' '; //清除前一位
i=i-2; //數組指針前移兩位
flag=1; //小數點標誌位置1
}
if(keyval == 13) //按下確定鍵
{
keyscan[i] = '\0';
break;
}
if(keyval == 16)
{
for(n = 0;n < i;n ++)keyscan[n] = ' ';
WriteStr(0x90,keyscan,(i+1)/2);
i = -1;
}
if(keyval == 17)i--; //無鍵按下
keyval = 17;
i++;
//在這裏寫入顯示keyscan數組的語句,長度爲i
WriteStr(0x90,keyscan,(i+1)/2);
if(flag == 1) //有小數點鍵按下
{
//在這裏寫入在顯示末尾寫入空格的語句
Send(1,' ');
flag = 0;
}
}
}
/*************************************************************************
//名稱 : Str2Float
//參數 : 儲存浮點數據result,儲存鍵盤結果的數組指針
//返回值: result
//功能 : 將矩陣鍵盤掃描到的數據轉化爲浮點數
*************************************************************************/
float Str2Float(uchar *keyscan)
{
float result;
uchar i;
uint dot;
i = 0;
dot = 0;
for(i = 0;;i ++)
{
if(keyscan[i] == '.')
{
if(keyscan[i + 2] == '\0')keyscan[i + 2] = '0';
if(i == 1)result = (keyscan[0] - '0') + (keyscan[2] - '0') * 0.1 + (keyscan[3] - '0') * 0.01;
if(i == 2)result = (keyscan[0] - '0') * 10 + (keyscan[1] - '0') + (keyscan[3] - '0') * 0.1 + (keyscan[4] - '0') * 0.01;
break;
}
if(keyscan[i] == '\0' && dot == 0)
{
if(i == 1)result = keyscan[0] - '0';
if(i == 2)result = (keyscan[0] - '0') * 10 + keyscan[1] - '0';
break;
}
}
return(result);
}
矩陣鍵盤控制forMSP430
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.