CC2530学习笔记(2)—— IO端口基本操作实验(按键控制亮灯)

CC2530学习笔记(2)—— IO端口基本操作(按键控制亮灯)

关于CC2530的IO端口基本知识、IO端口有关寄存器的介绍和描述请参照:CC2530学习笔记(1)——  IO端口


电路原理图如图1所示:

CC2530学习笔记(2)—— IO端口基本操作实验(按键控制亮灯)_第1张图片
图1    按键和LED灯电路连接原理图
分析:本操作中不涉及IO端口中断,采用轮询方式实现操作。要求按一个按键亮一个灯,再按键灯熄灭。所以我们需要及时的检测按键是否被按下。原理图中两个LED当IO端口输出低电平时亮,三个按键当被按下时IO端口为低电平。


寄存器配置:

  • LED对应的P0_1、P0_4配置为通用IO引脚,方向为输出,初始电平为高电平。
  • 按键对应的P1_1、P2_0配置为通用IO引脚,方向为输入。

程序:

/**************************************
 *本次操作只需添加以下这个头文件
 *************************************/
#include 

#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输出状态取反
    }
  }
}

你可能感兴趣的:(ZigBee)