使用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
本人愚昧,上邊如果有錯誤,還希望各位指正。