一.前言
通過前一次的實驗,相信大家都已經對cc2530程序的編寫有了一定的認識,這次我們來操作和實驗的是cc2530上的按鍵模塊。
二.原理分析
我們先來看一下按鍵的原理圖:
根據原理圖我們可以得出,按鍵不按下的時候值為0,因為接地,所以,按鍵要被按下的時候,BUT1和BUT2輸入值為1,當檢測到它們為1時,按鍵就為按下的狀態,因為P0DIR默認的狀態是輸入,所以不需要配置IO寄存器,當按鍵按下時,改變led的狀態,來驗證實驗。
三.程序
#define LED1 P1_0 //LED1為P1_0端口控制
#define LED2 P1_1 //LED2為P1_1端口控制
#define LED3 P1_4 //LED3為P1_4端口控制
#define KEY1 P0_4 //KEY1為P0_4端口控制
/***************** 函 數 名 : Delayms 功能描述 : 毫秒延時 輸入參數 : xms:延時時間,如 i=xms 即延時i毫秒 輸出參數 : none 返 回 值 : none *********************/
void Delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); }
/ 函 數 名 : InitLed 功能描述 : LED IO初始化 輸入參數 : none 輸出參數 : none 返 回 值 : none *************/
void InitLed(void)
{ P1DIR |= 0xff; //P1端口定義為輸出
LED1 = 1; //LED1燈熄滅
LED2 = 1;
LED3 = 1; }
/******************** 函 數 名 : KeyScan 功能描述 : 按鍵檢測函數 輸入參數 : none 輸出參數 : none 返 回 值 : 0:無按鍵按下 1:按鍵按下 ***********************/
uchar KeyScan(void)
{
if(KEY1==0)
{ Delayms(2); //延時去抖
if(KEY1==0)
{ while(!KEY1); //松手檢測,如果一直按着按鍵,將一直停在這條語句
return 1; //有按鍵按下 }
} return 0; //無按鍵按下 }
/************************* 函 數 名 : main 功能描述 : KEY測試(通用IO的輸入/輸出使用) 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE **************************/
void main(void) { InitLed(); //調用初始化函數
while(1)
{ if(KeyScan())
{ LED1=~LED1; //按鍵改變LED狀態
LED2=~LED2;
LED3=~LED3; }
} }
四.總結
通過本次實驗,我們學習了如何使用按鍵來控制cc2530的外設,用鍵盤掃描函數來檢測按鍵狀態的改變,函數中有調用延時函數,用於延時去抖,增加系統的穩定性,可是不斷檢測會造成占用cpu的工作時間,下一講介紹一種更好的方式。