大发快3

硬件集成电路设计热门培训内容之按键检测(外部中断)实验

时间:2018-01-08 10:43:25

【实验目的】
1.掌握IAR的配置、程序代码的编写,以及编译及调试的过程
2.学会如何运用 IAR 编写并在线调试程序按键检测(外部中断)实验


【实验设备】
1.IAR开发环境
2.USB ZigBee Debug Adapter(仿真器) 一个
3.接口编程???一套


【实验要求】
1.熟悉IAR开发环境
2.能够在IAR开发环境中建设按键检测实验工程项目,并完成程序编写和调试


【实验原理】
    利用CC2530数据手册、按键及LED灯的原理图,来编程按键检测的驱动程序, 设置与小灯相应的端口P0_1、P0_2方向为输出,设置与按键相应的端口P1_2、P1_3方向为输入,当按下key1时LED1闪烁,当按下key2时LED2闪烁。

【实验流程图】

【实验步骤】
1.新建工程及C文件步骤详见“环境搭建实验”实验指导手册。
2.通过下载仿真器将协调器??榱拥缒?。具体连接方式详见“环境搭建实验”实验指导手册。
3.程序代码的编写:
新建程序文件
选择File->New->File,新建文件main.c。
引入头文件:
基于CC2530的程序,必须包含对ioCC2530.h的引用,此文件定义了CC2530的各类特殊功能寄存器(SFR)的地址映射。
#include <ioCC2530.h>         //引入CC2530所对应的头文件(包含各SFR的定义)
此文件内置于IAR中(类似于stdio.h),将鼠标至于此行代码上,右键,选择 OPen "ioCC2530.h" ,即可看到此头文件的全部内容。
定义LED引脚:
查看接口编程板板电路图,如下所示:

可知led1和led2分别受引脚P0_1和P0_2的控制,S1和S2与P1_2和P1_3相连。
#define led1    P0_1          //定义LED1为P0_1口控制
#define led2    P0_2          //定义LED2为P0_2口控制
#define key1    P1_2
#define key2    P1_3
main函数:
接下来,开始编写main函数。
首先,在使用P0_1、P0_2、P1_2、P1_3端口前,需对其工作方式以及输入/输出方向进行设置,其中涉及到两个SFR:P0SEL、P0DIR。
  P0SEL  = 0x00;          //设置P0为普通 I/O 口
  P0DIR |= 0x06;          //设置P0_1,P0_2为输出
CC2530具有 P0_0 ~ P0_7 , P1_0~P1_7 , P2_0~P2_7 共21个I/O口。它们可作为通用数字I/O,也可用于连接ADC、定时/计数器或USART等外设IO。
CC2530的SFR中有三类寄存器可用于配置这些IO口:
①PxSEL(x为0/1/2):P0/P1/P2口功能选择
                                0:通用数字IO,1:外设IO,缺省默认为0
②PxDIR(x为0/1/2):P0/P1/P2口方向
                                0:输入,1:输出,缺省默认为0
③PxINP(x为0/1):P0/P1口输入模式
                                0:上拉/下拉,1:三态,缺省默认为0
在使用IO口时需配置,若缺省,则取系统默认值。
接着,定义P1_2、P1_3为外部中断,下降沿触发:
void hal_init_key(void)
{  
    P1IEN |= 0X0C;     //P12 P13设置为中断方式
    PICTL |= 0X02;     //下降沿触发
    EA = 1;
    IEN2 |= 0x10;
    P1IFG  = 0;
}
定义两个标志位flag1和flag2,用来控制led1和led2闪烁和熄灭。两个按键分别控制flag1和flag2。P1IFG=0x04时表明S1触发,P1IFG=0x08时表明S2触发。
#pragma vector = P1INT_VECTOR
 __interrupt void P1_ISR(void)
 {
   if(P1IFG>0)
   {
     if(P1IFG == 0x04)          //P1IFG对应位置1
     {
       Delay(100);              //按键去抖
       if(key1==0)flag1=!flag1;
     }
     if(P1IFG == 0x08)         //P1IFG对应位置1
     {
       Delay(100);             //按键去抖
       if(key2==0)flag2=!flag2;
     }
     P1IFG  = 0;               //清除标志位
   }
   P1IF = 0;
 } 
然后初始化2个LED灯和两个标志位:
  led1 = 1;   //初始化,2个led灯全熄
  led2 = 1;
  flag1=0;    //初始化key1和key2标志位
  flag2=0;
最后,编写LED灯控制函数:
void LED_Control(void)              //LED1和LED2控制函数
{
 if(flag1==1)led1=0;
 if(flag2==1)led2=0;
 Delay(1000);
 led1=1;
 led2=1;
 Delay(1000);
}
其中涉及到一个延时子函数Delay(unsigned char n):
void Delay(int n)   
{
  unsigned char i;
  while(n--)
  {
    for(i=200;i>0;i--);
  }

实验源码:
将上述代码合并为一个整体,如下所示:
/*******************************************************************
*文 件 名:     KEY.c
*作    者:     yoodao
*目标器件:     cc2530
*版    本:     1.0.3
*修    订:     2016-7-6
*描    述:     按键外部中断控制LED小灯闪烁
************************************************************************/
//引入头文件
#include <ioCC2530.h>         //引入CC2530所对应的头文件(包含各SFR的定义)
//定义LED引脚
#define led1    P0_1          //定义LED1为P0_1口控制
#define led2    P0_2          //定义LED2为P0_2口控制
#define key1    P1_2
#define key2    P1_3

unsigned char flag1;    //按键1标志位
unsigned char flag2;    //按键2标志位
void Delay(int n);
void hal_init_key(void);

void Delay(int n)   
{
  unsigned char i;
  while(n--)
  {
    for(i=200;i>0;i--);
  }
}

/****************************************************************
*函数功能 :初始化按键中断                                
*入口参数 :无                            
*返 回 值 :无                        
*说    明 :                            
****************************************************************/
void hal_init_key(void)
{  
    P1IEN |= 0X0C;     //P12 P13设置为中断方式
    PICTL |= 0X02;     //下降沿触发
    EA = 1;
    IEN2 |= 0x10;
    P1IFG  = 0;
}

/****************************************************************
*函数功能 :按键中断函数                                
*入口参数 :无                            
*返 回 值 :无                        
*说    明 :                            
****************************************************************/
#pragma vector = P1INT_VECTOR
 __interrupt void P1_ISR(void)
 {
   if(P1IFG>0)
   {
     if(P1IFG == 0x04)          //P1IFG对应位置1
     {
       Delay(100);              //按键去抖
       if(key1==0)flag1=!flag1;
     }
     if(P1IFG == 0x08)         //P1IFG对应位置1
     {
       Delay(100);             //按键去抖
       if(key2==0)flag2=!flag2;
     }
     P1IFG  = 0;               //清除标志位
   }
   P1IF = 0;
 }
void LED_Control(void)              //LED1和LED2控制函数
{
 if(flag1==1)led1=0;
 if(flag2==1)led2=0;
 Delay(1000);
 led1=1;
 led2=1;
 Delay(1000);
}
/****************************************************************
*函数功能 :主函数                                
*入口参数 :无                            
*返 回 值 :无                        
*说    明 :key1控制led1闪烁、熄灭;key2控制led2闪烁、熄灭                            
****************************************************************/
void main(void)
{
  P0SEL  = 0x00;          //设置P0为普通 I/O 口
  P0DIR |= 0x06;          //设置P0_1,P0_2为输出

  led1 = 1;   //初始化,2个led灯全熄
  led2 = 1;
  flag1=0;    //初始化key1和key2标志位
  flag2=0;
  
  hal_init_key();
  
  while(1)     //开始循环
  {
    LED_Control();//调用LED控制函数控制LED1和LED2闪烁、熄灭
  }
}
本实验主要用到的寄存器:

【实验现象】
选择Project -> Make,编译代码,若成功,则会出现以下输出:

按Zigbee开发板 → 调试器 → PC的USB接口 的顺序连接Zigbee设备,然后选择Project -> Debug,程序就会被自动下载到开发板中。
然后选择 Debug -> Go,即可启动程序,这时,你就可以通过S1和S2控制LED1和LED2闪烁了!


【实验总结】
         本文以“按键检测(外部中断)”为基础,分别从IAR的配置、程序代码的编写,以及编译及调试的过程介绍了整个实现过程。接下来的一篇,则会在了解了开发程序的基本过程的基础上,介绍几个CC2530开发的基础实验,涉及定时器、串口通信、AD转换以及看门狗等。

?

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!