矩陣鍵盤控制forMSP430

/*****************************************************************
//文件名	: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);
}

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章