CC2530 按键中断--中断向量

来源:互联网 发布:上元网络 编辑:程序博客网 时间:2024/05/16 10:31
/**************************************************项目名称: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}