CC2530 练习小作业(1)按键中断

题目描述

K1接P1.2,LED1和LED2分别接P1.0、P1.1。当K1键按下时,LED1、LED2依次闪烁三遍后,LED1、LED2全灭。

代码

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>
#include "delay.h"
#include "led.h"
#include "key.h"
#include "extint.h"

/*********************************************************************************************
* 名称:main()
* 功能:实验逻辑代码
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void main(void)
{
  xtal_init();                                                  //系统时钟初始化
  led_init();                                                   //LED控制端口初始化;
  ext_init();                                                   //外部中断初始化   
  
  while(1);
}

/*********************************************************************************************
* 名称:中断服务子程序
* 功能:外部中断
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void)
{
  EA = 0;                                                       //关中断  
  if((P1IFG & 0x04 ) >0 )                                       //按键中断
  {    
    P1IFG &= ~0x04;                                             //中断标志清0
    delay_ms(10);  										    //按键防抖		
                                        
    if(K1 == DOWN)                                              //判断按键按下
    {  
      	D1 = !D1;                                                 //翻转LED0
      	D2 = !D2;                                                 //翻转LED1
      	delay_ms(100);
      	D1 = !D1;
      	D2 = !D2; 
      	delay_ms(100);
      	D1 = !D1;
      	D2 = !D2; 
      	delay_ms(100);
      	D1 = !D1;
      	D2 = !D2; 
      	delay_ms(100);
      	D1 = !D1;
      	D2 = !D2; 
      	delay_ms(100);
      	D1 = !D1;
      	D2 = !D2; 
    }
  }
  EA = 1;                                                       //开中断
}
/*********************************************************************************************
* 文件:led.h
* 作者:Meixin 2017.09.15
* 说明:led灯驱动代码头文件  
* 修改:liutong 20171027 修改了LED控制引脚初始化函数名称、优化了注释
* 注释:
*********************************************************************************************/

/*********************************************************************************************
* 宏条件编译
*********************************************************************************************/
#ifndef __LED_H__
#define __LED_H__

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>                                           //引入CC2530所对应的头文件(包含各SFR的定义)

/*********************************************************************************************
* 宏定义
*********************************************************************************************/
#define D1                      P1_1                            //宏定义D1灯控制引脚P1_1
#define D2                      P1_0                            //宏定义D2灯控制引脚P1_0

#define ON                      0                               //宏定义灯开状态控制为NO
#define OFF                     1                               //宏定义关闭状态控制为OFF

/*********************************************************************************************
* 函数声明
*********************************************************************************************/
void led_init(void);                                            //LED控制引脚初始化函数


#endif /*__LED_H_*/




/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include "led.h"

/*********************************************************************************************
* 名称:led_init()
* 功能:LED控制引脚初始化
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void led_init(void)
{
  P1SEL &= ~0x03;                                               //配置控制管脚(p1.0, p1.1)为通用IO模式
  P1DIR |= 0x03;                                                //配置控制管脚(p1.0, p1.1)为输出模式
  
  D1 = OFF;                                                     //初始状态为关闭
  D2 = OFF;                                                     //初始状态为关闭
}
  

/*********************************************************************************************
* 文件:key.h
* 作者:Meixin 2017.09.15
* 说明:按键驱动代码头文件  
* 修改:
* 注释:
*********************************************************************************************/

/*********************************************************************************************
* 宏条件编译
*********************************************************************************************/
#ifndef __KEY_H__
#define __KEY_H__

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>                                           //引入CC2530所对应的头文件(包含各SFR的定义)

/*********************************************************************************************
* 宏定义
*********************************************************************************************/
#define K1                      P1_2                            //宏定义按键检测引脚P1_2

#define UP                      1                               //按键弹起
#define DOWN                    0                               //按键被按下

/*********************************************************************************************
* 函数声明
*********************************************************************************************/
void key_init(void);                                            //管脚初始化函数


#endif /*__KEY_H_*/



/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include "key.h"

/*********************************************************************************************
* 名称:key_init()
* 功能:按键初始化
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void key_init(void)
{
  P1SEL &= ~0x04;                                               //配置按键检测管脚(p1.2, p1.3)为通用IO
  P1DIR &= ~0x04;                                               //配置按键检测管脚(p1.2, p1.3)为通输出模式
}


/*********************************************************************************************
* 文件:extint.h
* 作者:Meixin 2017.09.15
* 说明:外部中断驱动代码头文件  
* 修改:
* 注释:
*********************************************************************************************/

/*********************************************************************************************
* 宏条件编译
*********************************************************************************************/
#ifndef __EXTINT_H__
#define __EXTINT_H__

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>

/*********************************************************************************************
* 内部原型函数
*********************************************************************************************/
void xtal_init(void);                                           //时钟初始化函数
void ext_init(void);                                            //外部中断初始化

#endif /*__EXTINT_H_*/




/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include "extint.h"

/*********************************************************************************************
* 名称:xtal_init()
* 功能:CC2530时钟初始化
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void xtal_init(void)
{
  CLKCONCMD &= ~0x40;                                           //选择32MHz的外部晶振
  while(CLKCONSTA & 0x40);                                      //晶体振荡器开启且稳定
  CLKCONCMD &= ~0x07;                                           //选择32MH系统时钟
}

/*********************************************************************************************
* 名称:ext_init()
* 功能:外部中断初始化
* 参数:无
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void ext_init(void)
{
  IEN2 |= 0x10;                                                 //端口1中断使能
  P1IEN |= 0x04;                                                //端口P1_2外部中断使能
  PICTL |= 0x02;                                                //端口P1_2下降沿触发 
  EA = 1;                                                       //使能总中断 
}
/*********************************************************************************************
* 文件:delay.h
* 作者:Meixin 2017.09.27
* 说明:延时驱动头文件
* 修改:
* 注释:
*********************************************************************************************/

/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include <ioCC2530.h>                                           //引入CC2530所对应的头文件(包含各SFR的定义)

/*********************************************************************************************
* 宏条件编译
*********************************************************************************************/
#ifndef __DELAY_H__
#define __DELAY_H__

/*********************************************************************************************
* 申明定义无符号数据类型
*********************************************************************************************/
typedef unsigned char           u8;                             //将unsigned char 声明定义为 u8        
typedef unsigned short          u16;                            //将unsigned short 声明定义为 u16 
typedef unsigned long           u32;                            //将unsigned int 声明定义为 u32

/*********************************************************************************************
* 宏定义
*********************************************************************************************/
#define CLKSPD                  (CLKCONCMD & 0x07)              //宏定义系统时钟分频系数

/*********************************************************************************************
* 内部原型函数
*********************************************************************************************/
void delay_s(u16 times);                                        //硬件延时函数秒
void delay_ms(u16 times);                                       //硬件延时函数毫秒
void delay_us(u16 times);                                       //硬件延时函数微秒
void hal_wait(u8 wait);                                         //硬件毫秒延时函数

#endif /*__DELAY_H_*/


/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include "delay.h"

/*********************************************************************************************
* 名称:hal_wait(u8 wait)
* 功能:硬件毫秒延时函数
* 参数:wait——延时时间(wait < 255)
* 返回:无
* 修改:
* 注释:CC2530系统固件库系统的精确毫秒延时函数,由TI官方提供
*********************************************************************************************/
void hal_wait(u8 wait)
{
  unsigned long largeWait;                                      //定义硬件计数临时参数
  
  if(wait == 0) return;                                         //如果延时参数为0,则跳出                        
  largeWait = ((u16) (wait << 7));                              //将数据扩大64倍
  largeWait += 114*wait;                                        //将延时数据扩大114倍并求和      
  
  largeWait = (largeWait >> CLKSPD);                            //根据系统时钟频率对延时进行放缩
  while(largeWait --);                                          //等待延时自减完成
}

/*********************************************************************************************
* 名称:delay_s()
* 功能:在延时毫秒的基础上延时秒
* 参数:times——延时时间
* 返回:无
* 修改:
* 注释:延时为990,用于抵消while函数的指令周期
*********************************************************************************************/
void delay_s(u16 times)
{
  while(times --){
    delay_ms(990);                                              //延时1S
  }
}

/*********************************************************************************************
* 名称:delay_ms()
* 功能:再硬件延时上延时大于255的毫秒延时
* 参数:times——延时时间
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void delay_ms(u16 times)
{
  u16 i,j;                                                      //定于临时参数
  i = times / 250;                                              //获取要延时时长的250ms倍数部分
  j = times % 250;                                              //获取要延时时长的250ms余数部分
  while(i --) hal_wait(250);                                    //延时250毫秒
  hal_wait(j);                                                  //延时剩余部分        
}

/*********************************************************************************************
* 名称:delay_us()
* 功能:估算的微秒延时函数
* 参数:times——延时时间
* 返回:无
* 修改:
* 注释:
*********************************************************************************************/
void delay_us(u16 times)
{
  while (times--){
    asm("NOP");                                                 //汇编指令,空操作
    asm("NOP");                                                 //汇编指令,空操作
    asm("NOP");                                                 //汇编指令,空操作
  }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值