[资料分享] 矩阵键盘控制forMSP430

Aguilera   2018-8-10 21:27 楼主
/*****************************************************************
//文件名        :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);
}


回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复