K1接P1.2,LED1和LED2分别接P1.0、P1.1。当K1键按下时,LED1、LED2依次闪烁三遍后,LED1、LED2全灭。
/*********************************************************************************************
* 头文件
*********************************************************************************************/
#include
#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 //引入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 //引入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
/*********************************************************************************************
* 内部原型函数
*********************************************************************************************/
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 //引入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"); //汇编指令,空操作
}
}