CC2530 按键中断--中断向量

/*************************************************
*项目名称:Zigbee——学习
*文件名称:key_led.c
*功能描述:key1中断方式点亮led灯
*开发平台:网蜂Zigbee基础版
*硬件连接:
*          LED1   P1_0   低电平亮
*          KEY1   P0_4   下拉有效
*
*建立时间:2013.5.11
*责任人:  ***
*版本号:  无
**************************************************/


#include <ioCC2530.h>

//定义数据类型
#define uchar unsigned char
#define uint unsigned int

//定义控制口
#define LED1 P1_0  //LED1的控制口
#define LED2 P1_1  //LED2的控制口
#define KEY1 P0_4  //中断口


//声明函数区
void delayms(uint);  //延时函数
void InitLed();   //P1口初始化
void InitKey();   //按键中断初始化--外部中断
uchar KeyValue = 0;//

uint flag = 0;
uint key_flag = 1;
//函数定义区

/**************************
*函数名称:delayms(uint ms)
*函数功能:延时函数
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void delayms(uint ms)
{
  uint i = 0;
  uint j = 0;
  
  for(i = 0; i < ms; ++i)
    for(j = 0; j < 586; ++j);
}

/**************************
*函数名称:InitLed()
*函数功能:LED初始化
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void InitLed()
{
  P1SEL &= ~0x02;//定义P1_0为普通IO口
  P1DIR |= 0x02;//定义P1_0为输出
  //LED1 = 1;//初始化LED1熄灭
  LED2 = 0;//初始化LED2熄灭
}

/**************************
*函数名称:InitKey()
*函数功能:按键中断初始化
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void InitKey()
{
#if key_flag
//中断方式
  flag = 0;
  P0IEN |= 0x10;//P0_4设置为中断方式
  PICTL |= 0x01;//下降沿触发
  IEN1  |= 0x20;//允许P0口中断
  P0IFG =  0x00;//初始化中断标志位
  EA = 1;//开总中断

#else
//扫描方式
  flag = 1;
  P0SEL &= ~0x10;//定义p0_4为普通IO口
  P0DIR &= ~0x10;//定义P0_4为输入
  P2INP &= ~0x11;//设置P0口全部为上拉
  P0INP &= ~0x10;//设置P0_4为上拉/下拉
  
#endif
}

/**************************
*函数名称:ScanKey()
*函数功能:按键中断处理函数
*入口参数:无
*出口参数:无
*返回值  :按键状态
            按下返回 1
            没按返回 0
**************************/
#pragma vector = P0INT_VECTOR //格式:#pragma vector = 中断向量
__interrupt void P0_ISR(void)
{
  delayms(20);//取出抖动
  //LED1 = ~LED1;//改变LED1的状态
  LED2 = ~LED2;//改变LED2的状态
  P0IFG = 0;//清除中断标志
  P0IF = 0;//清除中断标志
}
/**************************
*函数名称:ScanKey()
*函数功能:按键扫描函数
*入口参数:无
*出口参数:无
*返回值  :按键状态
            按下返回 1
            没按返回 0
**************************/
uchar ScanKey()
{
  if(0 == KEY1)//是否有按键按下
  {
    delayms(20);//延时让按键状态稳定
    if(0 == KEY1)//再次确认是否按键按下
    {
      while(!KEY1);//等待按键松手
      return 1;//按键返回 1
    }
  }
  return 0;//没有按键按下返回 0
}
/**************************
*函数名称:main()
*函数功能:主函数
*入口参数:无
*出口参数:无
*返回值  :无
**************************/
void main()
{
  InitLed();
  InitKey();
#if flag
  while(1)
  {
    if(ScanKey())
    {
      LED1 = ~LED1;//LED取反
    }
  }
#else
  while(1);//等待外部中断
#endif
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值