打印
[菜农助学交流]

【第四批】新手笔记二_按键中断

[复制链接]
3086|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
357482894|  楼主 | 2011-11-24 21:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
gp, IO, GPIO, pi, se
开始时,想着用按键中断来控制LED的点亮方式。按我开始的思路写好程序后,一直无法实现。仔细想想,有点问题,参数不能正确传递。然后纠结了几天,改了又改,今天终于成功了,但已完全没了当初的想法。

本程序主要利用两个按键产生两个外部中断控制两种系列的LED点亮方式,程序虽长,实质性的东西就只有中断这部分。按照群里老师的说法,下一步用定时器试试。

下面是程序:
 

#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "led.h"
int L_num=0,R_num=0;
int flag=0;
int i;
char j;
void EINT0CALLBACK(void)
{
DrvGPIO_SetBit(E_GPB,10);
L_num++;
flag=1;        
}
void EINT1CALLBACK(void)
{
DrvGPIO_SetBit(E_GPB,10);
R_num++;
flag=2;      
}
void Sys_Init()
{
    UNLOCKREG();         
    SYSCLK->PWRCON.XTL12M_EN = 1;//设定12M外部晶振
    DrvSYS_Delay(5000);//等待时钟就绪
DrvGPIO_Open(E_GPA,2,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,3,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,4,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,5,E_IO_OUTPUT);
DrvGPIO_Open(E_GPB,10,E_IO_OUTPUT);
DrvGPIO_ClrBit(E_GPB,10);
DrvGPIO_EnableInt(E_GPB,14,E_IO_FALLING,E_MODE_EDGE);        //设置端口GPB14为外部中断模式
DrvGPIO_SetDebounceTime(10,E_DBCLKSRC_10K);   
DrvGPIO_EnableDebounce(E_GPB,14);
DrvGPIO_InitFunction(E_FUNC_EXTINT0);                 //指定外部中断0引脚功能
DrvGPIO_EnableEINT0(E_IO_FALLING,E_MODE_EDGE,EINT0CALLBACK);
DrvGPIO_EnableInt(E_GPB,15,E_IO_FALLING,E_MODE_EDGE);        //设置端口GPB15为外部中断模式
DrvGPIO_SetDebounceTime(10,E_DBCLKSRC_10K);   
DrvGPIO_EnableDebounce(E_GPB,15);
DrvGPIO_InitFunction(E_FUNC_EXTINT1);                 //指定外部中断1引脚功能
DrvGPIO_EnableEINT1(E_IO_FALLING,E_MODE_EDGE,EINT1CALLBACK);
}
int main(void)
{
Sys_Init();
while(1)
{
  DrvGPIO_ClrBit(E_GPB,10);
  if(flag==1)
  {
   if(L_num>=10) L_num=0;
   flag=0;
   switch(L_num)
   {
    case 0:
     while(1)
     {
      led_allon();
      if(flag) break;
     }
     break;
    case 1:
     while(1)
     {
      led_one(1);
      if(flag) break;
     }
     break;
    case 2:
     while(1)
     {
      led_one(2);
      if(flag) break;
     }
     break;
    case 3:
     while(1)
     {
      led_one(3);
      if(flag) break;
     }
     break;
    case 4:
     while(1)
     {
      led_one(4);
      if(flag) break;
     }
     break;
    case 5:
     i=0;
     DrvGPIO_SetBit(E_GPA,2);
     DrvGPIO_SetBit(E_GPA,3);
     DrvGPIO_SetBit(E_GPA,4);
     DrvGPIO_SetBit(E_GPA,5);
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,i+2);  
      if(i==0) DrvGPIO_SetBit(E_GPA,5);
      else DrvGPIO_SetBit(E_GPA,i+1);
      DrvSYS_Delay(250000);
      i++;
      if(i==4) i=0;
      if(flag) break;
     }
     break;
    case 6:
     i=0;
     DrvGPIO_SetBit(E_GPA,2);
     DrvGPIO_SetBit(E_GPA,3);
     DrvGPIO_SetBit(E_GPA,4);
     DrvGPIO_SetBit(E_GPA,5);
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,i+2);  
      if(i==0|i==1) DrvGPIO_SetBit(E_GPA,i+4);
      else DrvGPIO_SetBit(E_GPA,i);
      DrvSYS_Delay(250000);
      i++;
      if(i==4) i=0;
      if(flag) break;
     }
     break;
    case 7:
     i=0;
     DrvGPIO_SetBit(E_GPA,2);
     DrvGPIO_SetBit(E_GPA,3);
     DrvGPIO_SetBit(E_GPA,4);
     DrvGPIO_SetBit(E_GPA,5);
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,i+2);  
      if(i==3) DrvGPIO_SetBit(E_GPA,2);
      else DrvGPIO_SetBit(E_GPA,i+3);
      DrvSYS_Delay(250000);
      i++;
      if(i==4) i=0;
      if(flag) break;
     }
    case 8:
     i=0;
     j=0;
     while(1)
     {
      if(!j) DrvGPIO_ClrBit(E_GPA,i+2);
      else DrvGPIO_SetBit(E_GPA,i+2);
      DrvSYS_Delay(250000);
      i++;
      if(i==4){i=0; j=~j;}
      if(flag) break;
     }
     break;
    case 9:
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,2);
      DrvGPIO_ClrBit(E_GPA,3);
      DrvGPIO_ClrBit(E_GPA,4);
      DrvGPIO_ClrBit(E_GPA,5);
      DrvSYS_Delay(250000);
      DrvGPIO_SetBit(E_GPA,2);
      DrvGPIO_SetBit(E_GPA,3);
      DrvGPIO_SetBit(E_GPA,4);
      DrvGPIO_SetBit(E_GPA,5);
      DrvSYS_Delay(250000);
      if(flag) break;
     }
     break;
    default:break;
   }
  }
  if(flag==2)
  {
   if(R_num>=10) R_num=0;
   flag=0;
   switch(R_num)
   {
    case 0:
     while(1)
     {
      led_allon();
      if(flag) break;
     }
     break;
    case 1:
     while(1)
     {
      led_one(1);
      if(flag) break;
     }
     break;
    case 2:
     while(1)
     {
      led_one(2);
      if(flag) break;
     }
     break;
    case 3:
     while(1)
     {
      led_one(3);
      if(flag) break;
     }
     break;
    case 4:
     while(1)
     {
      led_one(4);
      if(flag) break;
     }
     break;
    case 5:
     i=3;
     DrvGPIO_SetBit(E_GPA,2);
     DrvGPIO_SetBit(E_GPA,3);
     DrvGPIO_SetBit(E_GPA,4);
     DrvGPIO_SetBit(E_GPA,5);
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,i+2);  
      if(i==3) DrvGPIO_SetBit(E_GPA,2);
      else DrvGPIO_SetBit(E_GPA,i+3);
      DrvSYS_Delay(250000);
      if(i==0) i=4;
      i--;
      if(flag) break;  
     }
     break;
    case 6:
     i=3;
     DrvGPIO_SetBit(E_GPA,2);
     DrvGPIO_SetBit(E_GPA,3);
     DrvGPIO_SetBit(E_GPA,4);
     DrvGPIO_SetBit(E_GPA,5);
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,i+2);  
      if(i==3|i==2) DrvGPIO_SetBit(E_GPA,i);
      else DrvGPIO_SetBit(E_GPA,i+4);
      DrvSYS_Delay(250000);
      if(i==0) i=4;
      i--;
      if(flag) break;  
     }
     break;
    case 7:
     i=3;
     DrvGPIO_SetBit(E_GPA,2);
     DrvGPIO_SetBit(E_GPA,3);
     DrvGPIO_SetBit(E_GPA,4);
     DrvGPIO_SetBit(E_GPA,5);
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,i+2);  
      if(i==0) DrvGPIO_SetBit(E_GPA,5);
      else DrvGPIO_SetBit(E_GPA,i+1);
      DrvSYS_Delay(250000);
      if(i==0) i=4;
      i--;
      if(flag) break;  
     }
     break;
    case 8:
     i=3;
     j=0;
     while(1)
     {
      if(!j) DrvGPIO_ClrBit(E_GPA,i+2);
      else DrvGPIO_SetBit(E_GPA,i+2);
      DrvSYS_Delay(250000);
      if(i==0){i=4; j=~j;}
      i--;
      if(flag) break;  
     }
     break;
    case 9:
     while(1)
     {
      DrvGPIO_ClrBit(E_GPA,2);
      DrvGPIO_ClrBit(E_GPA,3);
      DrvGPIO_ClrBit(E_GPA,4);
      DrvGPIO_ClrBit(E_GPA,5);
      DrvSYS_Delay(250000);
      DrvGPIO_SetBit(E_GPA,2);
      DrvGPIO_SetBit(E_GPA,3);
      DrvGPIO_SetBit(E_GPA,4);
      DrvGPIO_SetBit(E_GPA,5);
      DrvSYS_Delay(250000);
      if(flag) break;
     }
     break;
    default:break;
   }
  }
}
}



相关帖子

沙发
357482894|  楼主 | 2011-11-24 21:17 | 只看该作者
按大叔的指示,还有工程文件:
key_led.rar (878.26 KB)

使用特权

评论回复
板凳
aijuan| | 2011-11-24 21:40 | 只看该作者
不错,学习了

使用特权

评论回复
地板
tendence| | 2011-11-26 20:44 | 只看该作者
不错,学习了!
要是你的程序能够加一点注释就好了,这样看起来就会舒服一些了。

使用特权

评论回复
5
357482894|  楼主 | 2011-11-28 20:15 | 只看该作者
4# tendence

谢谢你的建议!这次都是基本操作,所以没注意到,以后尽量注意!
共同学习,呵呵!

使用特权

评论回复
6
357482894|  楼主 | 2011-11-28 20:23 | 只看该作者
今晚又想了想这个程序,发现按最初的想法还是可以的。

声明flag为外部变量,这样就可以实现参数传递了。还是C语言水平不行,呵呵。

下面是我修改后的程序,相比以前的简洁了很多。

key_led.c

 
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "led.h"
int L_num=0,R_num=0;
int flag=0;
int i;
char j;
void EINT0CALLBACK(void)
{
DrvGPIO_SetBit(E_GPB,10);
L_num++;
flag=1;        
}
void EINT1CALLBACK(void)
{
DrvGPIO_SetBit(E_GPB,10);
R_num++;
flag=2;      
}
void Sys_Init()
{
    UNLOCKREG();         
    SYSCLK->PWRCON.XTL12M_EN = 1;//设定12M外部晶振
    DrvSYS_Delay(5000);//等待时钟就绪
DrvGPIO_Open(E_GPA,2,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,3,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,4,E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,5,E_IO_OUTPUT);
DrvGPIO_Open(E_GPB,10,E_IO_OUTPUT);
DrvGPIO_ClrBit(E_GPB,10);
DrvGPIO_EnableInt(E_GPB,14,E_IO_FALLING,E_MODE_EDGE);        //设置端口GPB14为外部中断模式
DrvGPIO_SetDebounceTime(10,E_DBCLKSRC_10K);   
DrvGPIO_EnableDebounce(E_GPB,14);
DrvGPIO_InitFunction(E_FUNC_EXTINT0);                 //指定外部中断0引脚功能
DrvGPIO_EnableEINT0(E_IO_FALLING,E_MODE_EDGE,EINT0CALLBACK);
DrvGPIO_EnableInt(E_GPB,15,E_IO_FALLING,E_MODE_EDGE);        //设置端口GPB15为外部中断模式
DrvGPIO_SetDebounceTime(10,E_DBCLKSRC_10K);   
DrvGPIO_EnableDebounce(E_GPB,15);
DrvGPIO_InitFunction(E_FUNC_EXTINT1);                 //指定外部中断1引脚功能
DrvGPIO_EnableEINT1(E_IO_FALLING,E_MODE_EDGE,EINT1CALLBACK);
}
int main(void)
{
Sys_Init();
while(1)
{
  if(flag==1)
  {
   DrvGPIO_ClrBit(E_GPB,10);
   if(L_num>=10) L_num=0;
   flag=0;
   switch(L_num)
   {
    case 0:
     led_allon();
     break;
    case 1:
     led_one(1);
     break;
    case 2:
     led_one(2);
     break;
    case 3:
     led_one(3);
     break;
    case 4:
     led_one(4);
     break;
    case 5:
     led_l2r_one();
     break;
    case 6:
     led_l2r_two();
     break;
    case 7:
     led_l2r_three();
     break;
    case 8:
     led_l2r_four();
     break;
    case 9:
     led_all();
     break;
    default:break;
   }
  }
  if(flag==2)
  {
   DrvGPIO_ClrBit(E_GPB,10);
   if(R_num>=10) R_num=0;
   flag=0;
   switch(R_num)
   {
    case 0:
     led_allon();
     break;
    case 1:
     led_one(1);
     break;
    case 2:
     led_one(2);
     break;
    case 3:
     led_one(3);
     break;
    case 4:
     led_one(4);
     break;
    case 5:
     led_r2l_one();
     break;
    case 6:
     led_r2l_two();
     break;
    case 7:
     led_r2l_three();
     break;
    case 8:
     led_r2l_four();
     break;
    case 9:
     led_all();
     break;
    default:break;
   }
  }
}
}




led.h


#ifndef _LED_H_
#define _LED_H_

void led_one(int num);
void led_allon(void);
void led_all(void);
void led_l2r_one(void);
void led_l2r_two(void);
void led_l2r_three(void);
void led_l2r_four(void);
void led_r2l_one(void);
void led_r2l_two(void);
void led_r2l_three(void);
void led_r2l_four(void);

#endif



led.c



#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "led.h"

extern int flag;

//将第num个LED点亮,其他灭
void led_one(int num)
{
int i;
DrvGPIO_ClrBit(E_GPA,num+1);
for(i=1;i<5;i++) //其他灯灭
{
if(i!=num)
{
DrvGPIO_SetBit(E_GPA,i+1);
}
}
while(1)
{
if(flag) break;
}
}

//LED全亮
void led_allon(void)
{
DrvGPIO_ClrBit(E_GPA,2);
DrvGPIO_ClrBit(E_GPA,3);
DrvGPIO_ClrBit(E_GPA,4);
DrvGPIO_ClrBit(E_GPA,5);
while(1)
{
if(flag) break;
}
}

//四个LED一起闪烁
void led_all(void)
{
while(1)
{
if(flag) break;
DrvGPIO_ClrBit(E_GPA,2);
DrvGPIO_ClrBit(E_GPA,3);
DrvGPIO_ClrBit(E_GPA,4);
DrvGPIO_ClrBit(E_GPA,5);
DrvSYS_Delay(250000);
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
DrvSYS_Delay(250000);
}
}

//从左到右依次点亮一个LED,循环执行
void led_l2r_one(void)
{
int i=0;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
DrvGPIO_ClrBit(E_GPA,i+2);
if(i==0) DrvGPIO_SetBit(E_GPA,5);
else DrvGPIO_SetBit(E_GPA,i+1);
DrvSYS_Delay(250000);
i++;
if(i==4) i=0;
}
}

//从左到右依次点亮两个LED,循环执行
void led_l2r_two(void)
{
int i=0;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
DrvGPIO_ClrBit(E_GPA,i+2);
if(i==0|i==1) DrvGPIO_SetBit(E_GPA,i+4);
else DrvGPIO_SetBit(E_GPA,i);
DrvSYS_Delay(250000);
i++;
if(i==4) i=0;
}
}

//从左到右依次点亮三个LED,循环执行
void led_l2r_three(void)
{
int i=0;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
DrvGPIO_ClrBit(E_GPA,i+2);
if(i==3) DrvGPIO_SetBit(E_GPA,2);
else DrvGPIO_SetBit(E_GPA,i+3);
DrvSYS_Delay(250000);
i++;
if(i==4) i=0;
}
}

//从左到右依次每个LED,然后依次熄灭,循环执行
void led_l2r_four(void)
{
int i=0;
char j=0;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
if(!j) DrvGPIO_ClrBit(E_GPA,i+2);
else DrvGPIO_SetBit(E_GPA,i+2);
DrvSYS_Delay(250000);
i++;
if(i==4){i=0; j=~j;}
}
}

//从右到左依次点亮一个LED,循环执行
void led_r2l_one(void)
{
int i=3;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
DrvGPIO_ClrBit(E_GPA,i+2);
if(i==3) DrvGPIO_SetBit(E_GPA,2);
else DrvGPIO_SetBit(E_GPA,i+3);
DrvSYS_Delay(250000);
if(i==0) i=4;
i--;
}
}

//从右到左依次点亮两个LED,循环执行
void led_r2l_two(void)
{
int i=3;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
DrvGPIO_ClrBit(E_GPA,i+2);
if(i==3|i==2) DrvGPIO_SetBit(E_GPA,i);
else DrvGPIO_SetBit(E_GPA,i+4);
DrvSYS_Delay(250000);
if(i==0) i=4;
i--;
}
}

//从右到左依次点亮三个LED,循环执行
void led_r2l_three(void)
{
int i=3;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
DrvGPIO_ClrBit(E_GPA,i+2);
if(i==0) DrvGPIO_SetBit(E_GPA,5);
else DrvGPIO_SetBit(E_GPA,i+1);
DrvSYS_Delay(250000);
if(i==0) i=4;
i--;
}
}

//从右到左依次每个LED,然后依次熄灭,循环执行
void led_r2l_four(void)
{
int i=3;
char j=0;
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
while(1)
{
if(flag) break;
if(!j) DrvGPIO_ClrBit(E_GPA,i+2);
else DrvGPIO_SetBit(E_GPA,i+2);
DrvSYS_Delay(250000);
if(i==0){i=4; j=~j;}
i--;
}
}



工程:
key_led2.rar (873.66 KB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

756

帖子

1

粉丝