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

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

原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13612044.html