/*****************************************************************
//文件名 :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] = '