MSP430F14-直接IO口按鍵檢處理程序
/*************************************************************************/
本文引用地址:http://m.butianyuan.cn/article/201611/316575.htm//分別使用了采個(gè)4個(gè)按鍵接到MSP430的通用IO口,按任意一個(gè)按鍵可以使板上的對(duì)應(yīng)LED反轉(zhuǎn).
//例程中,按鍵采用不斷查詢方式,以得到鍵值.并沒(méi)有使用到低功耗.此程序結(jié)構(gòu)比較適合
//用在非手持設(shè)備或非電池供電的設(shè)計(jì)中.此程序結(jié)構(gòu)比較通用,級(jí)用戶可參與或套用修改.
/*************************************************************************/
#include <msp430x14x.h>
//初級(jí)用戶要習(xí)慣采用宏定義,以方便的編寫(xiě)和修改
#define keyio 0xf0 //定義按鍵IO口,Px0-Px3 IO口.
#define key_1 0xfe //定義返回鍵值1
#define key_2 0xfd //定義返回鍵值2
#define key_3 0xfb //定義返回鍵值3
#define key_4 0xf7 //定義返回鍵值3
//聲明子程序
unsigned char key_chcek(void);
void display_update(unsigned char dta);
void key_process_0(void);
void key_process_1(void);
void key_process_2(void);
void key_process_3(void);
//*************************************************************************
//將單片機(jī)初始化程序放在main()前面是方便查看單片機(jī)的初始化狀態(tài)情況.
void MCU_int(void)
{//默認(rèn)MCLK主時(shí)鐘頻率為DCO=~800K
P1OUT |= BIT4+BIT5+BIT6+BIT7; //設(shè)置LED,上電為滅.電路可以查看MC430F14電路圖.
P1DIR |= BIT4+BIT5+BIT6+BIT7; //P1.0~P1.3設(shè)置為輸出.
//MSP430單片機(jī)IO口上電默認(rèn)方向?yàn)檩斎?所以接按鍵的IO無(wú)需再設(shè)為輸入.
}
//*************************************************************************
void main (void)
{ unsigned char key_value; //定義鍵值全局變是
WDTCTL = WDTPW + WDTHOLD; //關(guān)狗
MCU_int(); //初始化單片機(jī)
while(1) //主程序主循環(huán)
{
key_value=key_chcek(); //檢測(cè),有鍵按下并松開(kāi),返回一個(gè)鍵值.
switch (key_value) //對(duì)鍵值進(jìn)行處理.采switch語(yǔ)法結(jié)構(gòu)查詢
{
case key_1: key_process_0(); //調(diào)用鍵處理程序1
break;
case key_2: key_process_1(); //調(diào)用鍵處理程序2
break;
case key_3: key_process_2(); //調(diào)用鍵處理程序3
break;
case key_4: key_process_3(); //調(diào)用鍵處理程序4
break;
default: ;
break;
}
// display_update(key_value); //如果有需要可以在這里加上顯示更新程序.
key_value=0x00; //最后清除鍵值.將繼續(xù)主循環(huán).
}
}
//*************************************************************************
//按鍵檢測(cè)程序
//返回值: 無(wú)符號(hào)字符型鍵值
unsigned char key_chcek(void)
{
unsigned int i;
unsigned char timp,active;
active=0;
while(!active)
{
while(0xff ==( P2IN | keyio)); //一直等待有鍵按下
timp = P2IN | 0xf0; //若有鍵接下了,則讀入IO狀態(tài).
for(i=0;i<7000;i++); //延時(shí),是為了去按鍵抖動(dòng).
if (timp ==(P2IN | 0xf0)) //經(jīng)延時(shí)后,還是那鍵嗎?
{ active = 1; //是,則按鍵有效.
while(0xff !=( P2IN | keyio)); //一直等待按鍵松開(kāi)
}
else
{ //去按鍵抖動(dòng)后讀入的鍵值與之前不同.則先效.
active = 0; //再循環(huán)檢測(cè).
}
}
return timp; //返回一個(gè)鍵值.
}
//*************************************************************************
void key_process_0(void) //值處理,用戶可以自己修改...
{
P1OUT ^= BIT4;
}
//*************************************************************************
void key_process_1(void) //值處理,用戶可以自己修改...
{
P1OUT ^= BIT5;
}
//*************************************************************************
void key_process_2(void) //值處理,用戶可以自己修改...
{
P1OUT ^= BIT6;
}
void key_process_3(void) //值處理,用戶可以自己修改...
{
P1OUT ^= BIT7;
}
//*************************************************************************
/*void display_update(unsigned char dta)
{
; //用戶可以根據(jù)需要來(lái)放置顯示程序,如LCD,LED,Digital-LED....
//靈活應(yīng)用,
}*/
//*************************************************************************
評(píng)論