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

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

  • 相关阅读:
    页面加载完没有其他操作的情况下直接获取音频时长为NAN问题
    关于mysql的一些操作
    阿里云服务器登录不上 提示:之前用于连接到 (公网ip) 的凭据无法工作(1核1G) 以及阿里云新版本安全组策略没有开启80端口导致网站只能ping通 访问不到的问题
    微信浏览器禁止页面下拉查看网址(不影响页面内部scroll)
    2018年11月17号第一次参加源创会记录
    使用了eclipse10年之后,我终于投向了IDEA
    spring/spring boot/spring cloud书籍推荐
    python数据库连接例子
    Spring Cloud Eureka配置文件例子与较为详细说明
    spring源代码下载并导入eclipse技巧
  • 原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13612044.html
Copyright © 2011-2022 走看看