zoukankan      html  css  js  c++  java
  • zigbee学习之路(四):按键控制(中断方式)

    一.前言

           通过上次的学习,我们学习了如何用按键控制led,但是在实际应用中,这种查询方式占用了cpu的时间,如果通过中断控制就可以解决这个问题,我们今天就来学习按键控制的中断方式。

    二.原理分析

          传统的51单片机如果要使用中断,也要对相应的寄存器进行控制,cc2530芯片也不例外,而且相对复杂。需要配置多个中断寄存器,下面来一一介绍。

    这个寄存器是来控制端口0中断使能的,要开启中断,应设为1.

    这个是配置各种中断使能的,我们只需要配置P0IE.

    这个是配置中断触发方式的,根据上次的按键原理图,我们应该选择低下降沿触发模式。

    中断状态标志位,当中断没有发生或者结束时,应将标志位置0.

    三.程序代码

    #include <ioCC2530.h>

    #define uint unsigned int

    #define uchar unsigned char

    #define LED1 P1_0      //LED1为P1_0端口控制

    #define LED2 P1_1      //LED2为P1_1端口控制

    #define LED3 P1_4      //LED3为P1_4端口控制

    //函数声明 void Delayms(uint);    

    //延时函数 void InitLed(void); 

    //LED_IO初始化 void KeyInit(void);    

    //KEY_IO初始化

    /************** 函 数 名  : Delayms  功能描述  : 毫秒延时  输入参数  : xms:延时时间,如 i=xms 即延时i毫秒  输出参数  : none  返 回 值  : none **/

    void Delayms(uint xms)

    {     uint i,j;   

      for(i=xms;i>0;i--)      

    for(j=587;j>0;j--);

    }

    /******************* 函 数 名  : InitLed  功能描述  : LED_IO初始化  输入参数  : none  输出参数  : none  返 回 值  : none *********************************/

    void InitLed(void)

    {     P1DIR |= 0xff;       //P1端口定义为输出   

      LED1 = 1;            //LED1灯熄灭    

    LED2 = 1;            //LED2灯熄灭    

    LED3 = 1;            //LED3灯熄灭 }

    /*********************  函 数 名  : InitKey  功能描述  : KEY_IO初始化(中断方式配置)  输入参数  : none  输出参数  : none  返 回 值  : none ******************/

    void InitKey(void)

    {     P0IEN |= 0x10;  //设置P0_4为中断方式    

    IEN1 |= 0x20;   //允许P0口中断    

    PICTL |= 0x01;  //下降沿触发    

    P0IFG = 0x00;   //清中断标志位  

       EA = 1;         //开总中断 }

    /**************  函 数 名  : P0_ISR  功能描述  : 中断处理函数  输入参数  : none  输出参数  : none  返 回 值  : none ***********/

    #pragma vector = P0INT_VECTOR         //格式:#pragma vector = 中断向量

    __interrupt void P0_ISR(void)     //接着是中断处理程序(函数名可以任意取)

    {     LED1=~LED1;      //改变LED状态    

    LED2=~LED2;    

    LED3=~LED3;        

    P0IFG = 0;       //清中断标志  

       P0IF = 0; }

    /******************* 函 数 名  : main  功能描述  : KEY测试(通用IO中断的使用)  输入参数  : NONE   输出参数  : NONE  返 回 值  : NONE ************/

    void main(void)

    {     InitLed();  //调用初始化函数   

      InitKey();    

        while(1);     }

    四.总结

    led的控制函数和之前一样,大家要注意中断函数的定义,这是一种定义中断的格式,还有一定要使POIF=0,用来清除标志位,这样中断才能发生,还有大家学会用模块化的思想去写程序。

  • 相关阅读:
    作业 20181030-3互评Alpha版本
    Alpha阶段事后诸葛亮会议记录
    Alpha发布用户使用报告
    20181023-2 贡献分配
    作业 20181016-1 Alpha阶段贡献分配规则
    Scrum立会报告+燃尽图(十月三十日总第二十一次)
    OC中时间函数的使用
    OC中的集合详解
    面向对象的概念详解(转)
    集中类
  • 原文地址:https://www.cnblogs.com/sjsxk/p/5294585.html
Copyright © 2011-2022 走看看