当前位置: 代码迷 >> 综合 >> CC2530 练习小作业(1)按键中断
  详细解决方案

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

热度:102   发布时间:2023-11-14 14:34:29.0

题目描述

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;                                             //中断标志清0delay_ms(10);  										    //按键防抖 if(K1 == DOWN)                                              //判断按键按下{
      D1 = !D1;                                                 //翻转LED0D2 = !D2;                                                 //翻转LED1delay_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)为通用IOP1DIR &= ~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");                                                 //汇编指令,空操作}
}