zoukankan      html  css  js  c++  java
  • MSP430-按键检测代码详解

    使用MSP430F149的开发板,首先在一个函数进行讲解,然后下边是将部分代码写入了新建的key.c程序中

    • P1口的0,1,2,3 I/O口用于检测四个按键的电平
    • P2口的0,1,2,3 I./O口用于点亮对应的LED灯
    • P3口的4 I/O口用于点亮按键按下指示灯
    #include <MSP430X14x.h>   // 这是程序都要包含的头文件,里边包含的很多寄存器和接口函数
    
     
    
    #define KEY_Input (P1IN & 0x0f)  // 这是定义一个变量用于检测按下的是哪一个键(一共四个按键)
    
                                                          // 使用P1.0,1,2,3来检测,高四位跟0相与都是零,低四位跟1相与是该位本来的值 
    void delay(void);                            //创建了一个简单的延时函数,这是对他的一个简单声明
    
     
    
    unsigned char scandata[5] = {0xFF,0x7F,0xBF,0xDF,0xEF};  //这是定义了一个char类型的数组,根据不同的按键点亮对
    
    void main( void)
    
    {
    
     unsigned char temp,keyval=0XFF;   // 创建了一个temp用于存储P1IN的值,keyval用于做数组的索引从而点亮不同的灯
    
     WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
    
     P1DIR=0X00;   // P1的方向寄存器(direction register),设置成输入模式
     P1OUT=0X00; // 首先将P1八个端口设置成高电平
    
     P3DIR |= BIT4;  // 这个是另外一个LED灯,用于提示是否有按键按下
     P3OUT |= BIT4;  // 设置成输出模式
     P2DIR=0XFF; //这个是连接按键对应的LED灯的,将他设置成输出模式
    
     while(1)
      {
       if(KEY_Input != 0XFF) // 在上边已经将P1口设置成都是高电平,如果0XFF,那就是有按键按下了
               {
        delay();  //进行一个消抖
        if(KEY_Input != 0XFF) // 再次确认按键的确是按下了
          {
         temp=KEY_Input;  将KEY_Input赋值给temp。因为按键是自动弹开的,不将他赋值给temp,他就会恢复成原值
         switch(temp) // 对temp进行判断
           { 
          case 0x0e:  // 0000 0111  说明按按键4按下(没按下的时候是高电平。按下低电平)
            keyval = 4;break;  
          case 0x0d:  // 0000 1011  说明按按键3按下
            keyval = 3;break;
          case 0x0b:  // 0000 1101  说明按按键2按下
            keyval = 2;break;
          case 0x07:  // 0000 1110  说明按按键1按下
            keyval = 1;break;
          default:       // 如果出现其他值执行下边语句
            keyval = 0;break;
         }
       P2OUT=scandata[keyval]; // 赋值给P2,用于点亮对应的LED
       P3OUT &= ~BIT4;   // 点亮一下按键指示灯
       delay();delay();  //延时一下
       P3OUT |= BIT4;  // 关闭按键指示灯
             }
          }
      }
    }
    /*******************************************
    函数名称:delay
    功 能:用于消抖的延时
    参 数:无
    返回值 :无
    ********************************************/
    void delay(void)
    {
    unsigned int tmp;
    
    for(tmp = 12000;tmp > 0;tmp--);
    }

    *************************下边是我自己喜欢32那种,把初始化都独立起来****************************

    main函数

    #include <MSP430x14x.h>
    #include "key.h"
    
    void main( void )
    {
      unsigned char temp; 
      KEY_Init();
      while(1)
      {
        if(KEY_Input != 0XFF) 
        {
          delay();
          if(KEY_Input != 0XFF) 
          {
      temp=KEY_Input; 
      switch(temp)
       {
         case 0x0e: 
        P2OUT = KEY4_PRE;break; 
       case 0x0d: 
        P2OUT = KEY3_PRE;break;
       case 0x0b: 
        P2OUT = KEY2_PRE;break;
       case 0x07: 
        P2OUT = KEY1_PRE;break;
       default: 
        P2OUT = KEY_NO_PRE;break;
            }
    
      P3OUT &= ~BIT4; 
      delay();delay(); 
      P3OUT |= BIT4; 
         }
        }
      }
    }

    key.c

    #include "key.h"
    
    void KEY_Init()
    {
      WDTCTL = WDTPW + WDTHOLD;
      P1DIR=0X00; 
      P1OUT=0X00; 
      P3DIR |= BIT4; 
      P3OUT |= BIT4; 
      P2DIR=0XFF; 
    }
    
    
    void delay(void)
    {
      unsigned int tmp;
    
      for(tmp = 12000;tmp > 0;tmp--);
    }

    key.h

    #include <MSP430x14x.h>
    
     
    
    #define KEY_Input (P1IN & 0x0f) 
    #define KEY1_PRE 0x7F
    #define KEY2_PRE 0xBF
    #define KEY3_PRE 0xDF
    #define KEY4_PRE 0xEF
    #define KEY_NO_PRE 0xFF
    
     
    
    void KEY_Init(void);
    void delay(void);
    #endif

    本人愚昧,上边如果有错误,还希望各位指正。

  • 相关阅读:
    全链路压测(4):全链路压测的价值是什么?
    基于SVN的版本范围汇总
    一篇值得思考的职业教育之路!
    分享35个讨人喜欢的漂亮进度条UI设计
    转一篇难得的好文章CPU流水线的探秘之旅
    超棒的获奖动物摄影作品集
    解决web.py在SAE云中的Session使用问题
    2012年度最新免费web开发设计资源荟萃
    Endless icon: 每天都更新的图标集
    不容错过的超棒Javascript日期处理类库Moment.js
  • 原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13612044.html
Copyright © 2011-2022 走看看