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

本人愚昧,上邊如果有錯誤,還希望各位指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM