/*****************************************************************
//文件名 :Keypad.c
//描述 :该文件定义与矩阵键盘有关的各种接口、函数,适用于MSP430F149
//编写人 :小邪@清水
//版本号 :1.01
*****************************************************************/
#include
#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);
}