1. 程式人生 > >CC2530學習筆記(2)—— IO埠基本操作實驗(按鍵控制亮燈)

CC2530學習筆記(2)—— IO埠基本操作實驗(按鍵控制亮燈)

CC2530學習筆記(2)—— IO埠基本操作(按鍵控制亮燈)

關於CC2530的IO埠基本知識、IO埠有關暫存器的介紹和描述請參照:CC2530學習筆記(1)——  IO埠


電路原理圖如圖1所示:

圖1    按鍵和LED燈電路連線原理圖 分析:本操作中不涉及IO埠中斷,採用輪詢方式實現操作。要求按一個按鍵亮一個燈,再按鍵燈熄滅。所以我們需要及時的檢測按鍵是否被按下。原理圖中兩個LED當IO埠輸出低電平時亮,三個按鍵當被按下時IO埠為低電平。


暫存器配置:

  • LED對應的P0_1、P0_4配置為通用IO引腳,方向為輸出,初始電平為高電平。
  • 按鍵對應的P1_1、P2_0配置為通用IO引腳,方向為輸入。

程式:

/**************************************
 *本次操作只需新增以下這個標頭檔案
 *************************************/
#include <ioCC2530.h>

#define LED2 P0_1
#define LED3 P0_4
#define KEY3 P1_1
#define KEY4 P2_0
/***********************************
 *初始化LED
 **********************************/
void LEDInit(void)
{
  /*********LED2************/
  P0SEL &= ~(1<<1); //通用IO
  P0DIR |= 1<<1;    //方向為輸出
  LED2 = 1;         //初始輸出高電平,燈滅
  
  /*********LED3************/
  P0SEL &= ~(1<<4); //通用IO
  P0DIR |= 1<<4;    //方向為輸出
  LED3 = 1;         //初始輸出高電平,燈滅
}  
  
/***********************************
 *初始化按鍵
 **********************************/
void KEYInit(void)
{
  /*********KEY3************/
  P1SEL &= ~(1<<1); //通用IO
  P1DIR &= ~(1<<1); //方向為輸入
  
  /*********KEY3************/
  P2SEL &= ~(1<<0); //通用IO
  P2DIR &= ~(1<<0); //方向為輸入
}  
  
/***********************************
 *毫秒級延遲函式
 **********************************/
void Delayms(unsigned int ms)  
{
  unsigned int i,j;
  for (i = ms; i > 0; i--)
  {
    for (j = 587; j > 0; j--);
  }
}

/***********************************
 *按鍵掃描函式
 **********************************/
void KEYScan(void)
{
  if (0 == KEY3)//當KEY3按下
  {
    Delayms(10);//去抖
    LED2 = ~LED2; //P0_1輸出狀態取反
  }
  else if(0 == KEY4)//當KEY4按下
  {
    Delayms(10);//去抖
    LED2 = ~LED2; //P0_4輸出狀態取反
  }
}

void main()
{
  LEDInit();
  KEYInit();
  
  while(1)
  {
    KEYScan();
  }
}

2018.07.10更新:

前面的程式碼中,按鍵掃描函式其實是有點小問題的,改成下面的樣子效果會好些。

/***********************************
 *按鍵掃描函式
 **********************************/
void KEYScan(void)
{
  if (0 == KEY3)//當KEY3按下
  {
    Delayms(10);//去抖
    if (0 == KEY3)//再次判斷
    {
      LED2 = ~LED2; //P0_1輸出狀態取反
    }
  }
  else if(0 == KEY4)//當KEY4按下
  {
    Delayms(10);//去抖
    if(0 == KEY4)//再次判斷
    {
      LED2 = ~LED2; //P0_4輸出狀態取反
    }
  }
}