ZigBee——外部中断实验

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcml0aW5n44CB,size_20,color_FFFFFF,t_70,g_se,x_16

 所需的原理图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcml0aW5n44CB,size_20,color_FFFFFF,t_70,g_se,x_16

不同按键的配置过程不一样,我采用了按键p1_1

1、配置LED的初始化

void LED_init()   // LED灯初始化
{
    P0SEL &=~0X12;
    P0DIR |=0X12; 
} 

2、配置外部中断函数:

void NVIC_Init()//按键P1_1中断初始化
{   
    EA=1;                //开启总中断
    IEN2=0X10;           //中断端口2初始化
    P1IEN |=0X02;        //p1_1位中断使能  
    PICTL |=0X02;        //配置为下降沿触发
    P1IFG |=0X00;        //初始化中断标志位,默认值为0,

}

3、中断服务函数:

#pragma vector =P1INT_VECTOR
__interrupt void P1_ISR(void)
{
  if(P1IFG>0)
      {
        Delay10ms();           //按键消抖
        if(S3==0)              //判断按键是否按下
        {
        static int digital_bety=0; //定义一个标志位
        digital_bety++;            //数字累加,计数范围为0~9
        if(digital_bety==10)
        {
          digital_bety=0;
        }
        digital_tube_BYTE(digital_bety);//数码管显示不同的数字 
        led2=!led2;led3=!led3;          //led取反
        }
        
      }   
          P1IFG=0;             //清除中断标志位
          IEN2|=0;             //清除中断标志
}

4、数码管的初始化以及读取数码管的键值:

static UCHAR digital[]={0x3f,0x06,0x5b,0x4f,//0,1,2,3,4,5,6,7,8,9,灭
                        0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x00};
void digital_tube_Init()//数码管的初始化 P1_2以及P1_3
{
    P1SEL &=~0x0C; // 配置为普通IO模式
    P1DIR |=0x0C;//  配置为输出模式
}
void digital_tube_BYTE(UCHAR Index) //P1.3  DATA   P1.2  CLK
{  
    UCHAR i=0;
    UCHAR Data=digital[Index];//读取数码管的位值
    for(;i<8;i++)//8位将数据一位一位的读取出来
    {
        if(0x80 & Data)
        {
            P1_3=1;            
        }
        else
        {
            P1_3=0; 
        }
        Data=Data << 1;//移位
        P1_2=0;
        P1_2=1;
    }
}

5、main函数;


void main()
{    
  
    LED_init();
    NVIC_Init();
    digital_tube_Init();
    digital_tube_BYTE(0);
    led2=1;//灭灯
    led3=1;
    while(1)
    {
        
    }
      
}

 

最后完整代码:

//test.c:
#include <iocc2530.h>
#include "test.h"
#include "digital.h"
void NVIC_Init()//按键P1_1中断初始化
{   
    EA=1;                //开启总中断
    IEN2=0X10;           //中断端口2初始化
    P1IEN |=0X02;        //p1_1位中断使能  
    PICTL |=0X02;        //配置为下降沿触发
    P1IFG |=0X00;        //初始化中断标志位,默认值为0,

}
void LED_init()   // LED灯初始化
{
    P0SEL &=~0X12;
    P0DIR |=0X12; 
} 

void main()
{    
  
    LED_init();
    NVIC_Init();
    digital_tube_Init();
    digital_tube_BYTE(0);
    led2=1;//灭灯
    led3=1;
    while(1)
    {
        
    }
      
}


#pragma vector =P1INT_VECTOR
__interrupt void P1_ISR(void)
{
  if(P1IFG>0)
      {
        Delay10ms();           //按键消抖
        if(S3==0)              //判断按键是否按下
        {
        static int digital_bety=0; //定义一个标志位
        digital_bety++;            //数字累加,计数范围为0~9
        if(digital_bety==10)
        {
          digital_bety=0;
        }
        digital_tube_BYTE(digital_bety);//数码管显示不同的数字 
        led2=!led2;led3=!led3;          //led取反
        }
        
      }   
          P1IFG=0;             //清除中断标志位
          IEN2|=0;             //清除中断标志
}



//test.h
#define led2 P0_1//LED
#define led3 P0_4//LED
#define S3 P1_1//按键
void LED_init();

void Delay10ms()		//@11.0592MHz,延时函数
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}


//digital.c
#include <ioCC2530.h>
#include "digital.h"
static UCHAR digital[]={0x3f,0x06,0x5b,0x4f,//0,1,2,3,4,5,6,7,8,9,灭
                        0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x00};
void digital_tube_Init()//数码管的初始化 P1_2以及P1_3
{
    P1SEL &=~0x0C; // 配置为普通IO模式
    P1DIR |=0x0C;//  配置为输出模式
}
void digital_tube_BYTE(UCHAR Index) //P1.3  DATA   P1.2  CLK
{  
    UCHAR i=0;
    UCHAR Data=digital[Index];//读取数码管的位值
    for(;i<8;i++)//8位将数据一位一位的读取出来
    {
        if(0x80 & Data)
        {
            P1_3=1;            
        }
        else
        {
            P1_3=0; 
        }
        Data=Data << 1;//移位
        P1_2=0;
        P1_2=1;
    }
}

//digital.h
#ifndef __digital_H__
#define __digital_H__
#include<ioCC2530.h>


#define  UCHAR  unsigned char 

void digital_tube_Init();
void digital_tube_BYTE(UCHAR Data);//P1.3  DATA   P1.2  CLK
#endif
  
    


 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值