ZigBee入门-CC2530-实验(二)-按键(查询/中断)控制LED代码

ZigBee入门-CC2530-实验(二)-按键(查询/中断)控制LED代码

实验目的:

熟悉通用I/O寄存器,学会使用寄存器进行GPIO的编程。
以及学会通过按键的(查询/中断)的方式去控制LED灯的状态。

实验内容:

1.硬件连接。
2.相关的寄存器的设置。
3.程序编写。

实验过程:

1.硬件电路设计:
(1).LED采用低电平有效的方式,即相应的的I/O端口输出低电平时,LED灯点亮。
(2).按键采用输入上拉模式:即没有按键按下时,该端口为高电平,如果有按键按下时,该端口为低电平。

2.相关的寄存器配置:
PXSEL:功能选择寄存器 0:通用I/O 1:外设功能
PXDIR:方向寄存器 0:输出 1:输出
PXINP:用作输入时,通用 I/O 端口引脚可以设置为上拉、下拉或三态操作模式。
相关寄存器的配置流程

3.编写代码

/*按键查询的方式控制LED灯的亮灭,每当按键按下后松开一次,
 *LED灯的状态就改变一次                            */
#include <ioCC2530.h>

#define uint unsigned int
#define uchar unsigned char

#define LED1 P1_0      //定义P1.0口为LED1控制端
#define SW1 P0_5       //定义按键SW1 为P0_5脚

void Init_Led();        //声明初始化LED函数
void Init_Key();        //声明初始化按键函数
void Scan_Key();       //声明按键检测函数
void Delay(uint ms);   //声明延时函数
/*====================主程序入口====================*/
void main()            
{

  Init_Led();          //初始化LED1灯
  Init_Key();          //初始化按键SW1

  while(1)
  {
    Scan_Key();        //一直检测按键
  }
}
/*================声明函数的具体实现================*/
void Init_Led()
{
  P1SEL &=~ 0x01;      //配置P1.0 为通用I/O口
  P1DIR |=  0x01;      //配置P1.0 为输出
  LED1 = 0;            //初始LED1为熄灭
}
void Init_Key()
{
  P0SEL &= ~0x20;      //配置P0.5 为通用I/O口
  P0DIR &= ~0x20;      //配置P0.5 为输入 
  P0INP &= ~0x20;      //配置P0.5 的端口输入方式为:上拉/下拉
  P2INP &= ~0x20;      //将P0端口和P1端口引脚设置为:上拉
}
void Scan_Key()
{
  if(SW1 == 0)         //判断SW1有低电平信号
  {                       
    Delay(100);        //延时去抖动
    if(SW1 == 0)       //再次判断SW1有低电平信号
    {                      
      while(SW1 == 0); //等待SW1松开
      LED1 ^= 1;       //LED1灯的状态改变
    }
  }
}
void Delay(uint ms)    //毫秒级延时函数
{
  uint i,j;
  for(i=0;i<ms;i++)
    for(j=0;j<535;j++);
}

实验 :按键外部中断 涉及到的寄存器
PXIEN:端口中断屏蔽寄存器: 0:中断禁止 1:中断使能
PICTL:端口中断控制寄存器: 0:上升沿触发 1:下降沿触发
IEN1:中断使能控制寄存器: 0:中断使能 1:中断禁止
PXIFG:端口X的中断状态标志位:0:无中断 1:中断产生

/*按键中断的方式控制LED灯的亮灭,每当按键按下后松开一次,
 *LED灯的状态就改变一次                            */
#include <ioCC2530.h>

#define uint unsigned int
#define uchar unsigned char

#define LED1 P1_0      //定义P1.0口为LED1控制端
#define SW1 P0_5       //定义按键SW1 为P0_5脚

void Init_Led();        //声明初始化LED函数
void Init_Key();        //声明初始化按键函数
void Scan_Key();       //声明按键检测函数
void Delay(uint ms);   //声明延时函数
/*====================主程序入口====================*/
void main()            
{

  Init_Led();          //初始化LED1灯
  Init_Key();          //初始化按键SW1

  while(1);            //等待中断产生
}
/*================中断响应服务子程序================*/
#pragma vector = P0INT_VECTOR //P0口的中断入口矢量地址
__interrupt void P0_ISR()     //中断服务子程序
{ 
  if( P0IFG & 0X20)           //确保是P0.5脚引发的中断
  {
    P0IFG = 0;                //先清0中断标志位,一定要手动清除
    LED1 = !LED1;             //LED灯状态改变
  }
}
/*================声明函数的具体实现================*/
void Init_Led()
{
  P1SEL &=~ 0x01;      //配置P1.0 为通用I/O口
  P1DIR |=  0x01;      //配置P1.0 为输出
  LED1 = 0;            //初始LED1为熄灭
}
void Init_Key()
{
  P0SEL &= ~0x20;      //配置P0.5 为通用I/O口
  P0DIR &= ~0x20;      //配置P0.5 为输入 
  P0INP &= ~0x20;      //配置P0.5 的端口输入方式为:上拉/下拉
  P2INP &= ~0x20;      //将P0端口和P1端口引脚设置为:上拉
  P0IFG &= 0X00;       //初始化中断标志位(清零)
  P0IEN |= 0X20;       //P0.5设置为中断使能 (管脚打开中断)
  IEN1  |= 0X20;       //允许P0口中断       (端口打开中断)
  PICTL |= 0x01;       //设置下降沿触发     (配置触发方式)
  EA     = 1;          //开总中断           (最后开总开关)
}
void Delay(uint ms)    //毫秒级延时函数
{
  uint i,j;
  for(i=0;i<ms;i++)
    for(j=0;j<535;j++);
}

CC2530的GPIO上电复位后每个I/O口都是默认通用、输入、上拉模式,所以网上别的代码就直接省略了这部分寄存器的配置,我都写出来了,就是想让大家把这些最基础的寄存器配置要搞明白不要忘掉,如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解,数据手册网上多的是。
啃骨头,要好好啃,使劲啃,啃到底,才能啃到精髓嘛~~
我会每天更新一篇ZigBee入门-CC2530-的基础实验,让大家学习Zigbee技术不在是从入门到“入土”,而是从入门到巅峰~!!!
欢迎大家的留言和评论我会在看到的第一时间内答复。
看完后感觉得到帮助的小伙伴,要点点赞哦~
给笔者一些动力嘛!谢谢啦~

原创文章 13 获赞 10 访问量 550

猜你喜欢

转载自blog.csdn.net/weixin_45636395/article/details/105748667