查看: 636|回复: 0
打印 上一主题 下一主题

【MSP430F149学习】18 矩阵键盘

[复制链接] qrcode

18

主题

22

帖子

67

积分

注册会员

Rank: 2

积分
67
楼主
跳转到指定楼层
发表于 2015-12-12 10:41 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【MSP430F149学习】18 矩阵键盘


准备工具:电脑;TS8900--MSP430F149开发板;1602液晶屏;USB线一根


开发环境:IAR EW for MSP430 V5.30

键盘原理图




矩阵键盘按键检测部分程序


***************全局变量***************/
uchar key_Pressed;      //按键是否被按下:1--是,0--否
uchar key_val;          //存放键值
uchar key_Flag;         //按键是否已放开:1--是,0--否
//设置键盘逻辑键值与程序计算键值的映射
uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

/*******************************************
函数名称:Init_Keypad
功    能:初始化扫描键盘的IO端口
参    数:无
返回值  :无
********************************************/
void Init_Keypad(void)
{     
    P1DIR = 0xf0;       //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态
    P1OUT |= 0xf0;      // P1.4~P1.7输出高电平
    key_Flag = 0;       
    key_Pressed = 0;   
    key_val = 0;
}
/*******************************************
函数名称:Check_Key
功    能:扫描键盘的IO端口,获得键值
参    数:无
返回值  :无
********************************************/
void Check_Key(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为是
                {          
                    key_val = key_Map[row * 4 + col];  // 获取键值
                    return;                         // 退出循环
                }
                tmp2 <<= 1;                        // tmp2右移1位 
            }
        }
    }      
}
/*******************************************
函数名称:delay
功    能:延时约15ms,完成消抖功能
参    数:无
返回值  :无
********************************************/
void delay()
{
    uint tmp;
     
    for(tmp = 12000;tmp > 0;tmp--);
}
/*******************************************
函数名称:Key_Event
功    能:检测按键,并获取键值
参    数:无
返回值  :无
********************************************/
void Key_Event(void)
{     
    uchar tmp;
     
    P1OUT &= 0x00;              // 设置P1OUT全为0,等待按键输入
    tmp = P1IN;                 // 获取 p1IN
    if ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下
    {                     
        key_Pressed = 1;        // 如果有按键按下,设置key_Pressed标识
        delay();                //消除抖动
        Check_Key();            // 调用check_Key(),获取键值 
    }     
    else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放
    {                     
        key_Pressed = 0;        // 清除key_Pressed标识
        key_Flag    = 1;        // 设置key_Flag标识
    }
    else 
    {
        _NOP();
    }     
}


主函数


xtern unsigned char key_val;         
extern unsigned char key_Flag; 
/********************主函数********************/
void main(void)
{
   WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
    uchar Strings[]={"Key Value:"};
    uchar temp;
    
    /*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF1OUT = 0XFF;
    P2DIR = 0XFF2OUT = 0XFF;
    P3DIR = 0XFF3OUT = 0XFF;
    P4DIR = 0XFF4OUT = 0XFF;
    P5DIR = 0XFF5OUT = 0XFF;
    P6DIR = 0XFF6OUT = 0XFF;
    
   
    P6DIR |= BIT26OUT |= BIT2;  //关闭电平转换      
    
    LcdReset();                     //初始化LCD
    Init_Keypad();                  //初始化键盘端口
    DispNChar(2,0,10,Strings);        //显示提示文字
    while(1)
    {
        Key_Event();
    
        if(key_Flag == 1)
        {
            key_Flag = 0;
            
            //显示十位
            temp = key_val / 10;
            if(temp)
                Disp1Char(6,1,0x30+temp);  //数字的ASCII码值等于其本身数值加上0x30
            else
                Disp1Char(6,1,0x20);       //0x20是空格对应的ASCII码
            //显示个位
            temp = key_val % 10;
            Disp1Char(7,1,0x30+temp);   
        }
    }
}


下载运行效果







【MSP430F149学习】汇总贴



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表