新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > MSP430G2553測試程序(長短按鍵識別)

MSP430G2553測試程序(長短按鍵識別)

作者: 時間:2016-11-11 來源:網(wǎng)絡 收藏
//原始狀態(tài)P1.6亮,P1.0暗,利用狀態(tài)機進行按鍵檢測,短按鍵情況下并釋放的瞬間P1.0翻轉,P1.6翻轉

//長按鍵P1.0,P1.6按照10Hz的頻率閃爍
// MSP430G2xx3
// -----------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// P1.3|KEY P1.6|-->LED
// | P1.0|-->LED
// 作者http://jiwm.blog.163.com
// Built with IAR Embedded Workbench Version: 5.40
//******************************************************************************
#include "msp430g2553.h"
#define NOKEY 0 //未按下狀態(tài)
#define PUSH_KEY 1 //短按狀態(tài)
#define LONG_KEY 2 //長按狀態(tài)
unsigned char KEY=0; //按鍵狀態(tài)處理
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 關閉看門狗
BCSCTL1= CALBC1_1MHZ; //1M內部時鐘
DCOCTL = CALDCO_1MHZ;
P1DIR |=BIT6+BIT0; // 設置 P1.6,P1.0為輸出
P1OUT|=BIT0; //設置初值,P1.0亮
P1OUT&=~BIT6; //設置初值,P1.6不亮
P1REN|=BIT3; //配置上拉電阻
TACCTL0 |= CCIE; // CCR0 interrupt enabled
TACCR0 =2500; //計到2.5K,約20ms
TACTL = TASSEL_2+ID_3+MC_1+TACLR; //設置TIMERA的時鐘源為SMCLK(1M),8分頻后(125K),計數(shù)模式為up,到CCR0再自動從0開始計數(shù)
_BIS_SR(GIE); //開總中斷
TACCTL0 |= CCIE; // CCR0 interrupt enabled
while(1)
{
switch(KEY) //按鍵動作
{ case 1: //短按狀態(tài)時進行按鍵處理
{P1OUT^=BIT0; //翻轉
P1OUT^=BIT6; //翻轉
KEY=0;}
break;
case 2: //長按初始狀態(tài)
{P1OUT|=BIT0; //設置初值,P1.0亮
P1OUT|=BIT6; //設置初值,P1.6亮
KEY=0;}
break; //必須要,需要退出循環(huán)
case 3: //長按狀態(tài)時進行按鍵處理
{P1OUT^=BIT0; //翻轉
P1OUT^=BIT6; //翻轉
KEY=0;}
break;
}
}
}

本文引用地址:http://butianyuan.cn/article/201611/316569.htm

/************************************************
定時中斷響應
*************************************************/
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)

{ //TACCTL0&=~ CCIE; //關中斷
static unsigned char KEY_State=0; //按鍵的狀態(tài)變量
static unsigned char i,j=0; //計數(shù),用于處理時間
switch(KEY_State) //處理按鍵狀態(tài)
{case NOKEY: //未按鍵時進行按鍵處理
if ((P1IN&BIT3)==0)
{KEY_State=PUSH_KEY; //按下按鍵后,進入短按狀態(tài)
}
break; //必須要,需要退出循環(huán)
case PUSH_KEY: //短按狀態(tài)時進行按鍵處理
if((P1IN&BIT3)!=0) //釋放按鍵,認為是一次短按,加以處理
{ KEY=1; //按鍵賦值
KEY_State=NOKEY; //回到未按狀態(tài)
}
else
{
if (i<100)
{ //KEY=0; //KEY返回0,接收下一次數(shù)據(jù)
i++; //計數(shù),以實現(xiàn)長按鍵,約2秒
}
else
{
i=0;
KEY=2; //輸出長按初始狀態(tài)
KEY_State=LONG_KEY; //長按狀態(tài)
}
}
break;

case LONG_KEY: //長按狀態(tài)時進行按鍵處理
if((P1IN&BIT3)!=0) //釋放按鍵,退出
{ KEY=0; //按鍵賦值
KEY_State=NOKEY; //回到未按狀態(tài)
}
else
{
if (j<5)
{
j++; //計數(shù),以實現(xiàn)長按鍵狀態(tài)計時,約0.1秒
}
else
{j=0; //重新計數(shù)
KEY=3; //長按狀態(tài)的處理
}
}
break;

}
TACCTL0|= CCIE; //開中斷
}



評論


技術專區(qū)

關閉