标题: 用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发 [打印本页]

作者: 天才鱼yhx    时间: 2017-1-24 22:55
标题: 用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发
#include<reg52.h>
void delay(unsigned int t) //0-65535
{
while(--t);
}
void main()
{
    unsigned char q;//0-255
    while(1)
        {
        P1=0xfe;//1111 1110    初始化   点亮第一个灯  该语句必须放在循环内部,否则只能让每个灯亮一次,不能循环,因为没有循环初始化
     for(q=0;q<8;q++)
         {
          delay(50000);
          P1<<=1;
          P1=P1|0X01; //0000 0001        这条语句用于使上一个LED灯熄灭
         }
        }
}


(proteus仿真:用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发)
请教一下这个程序应该如何补充。我只能做到循环点亮,做不到外部中断边沿触发这个功能。按键接的是P3.2口外部中断功能。



作者: 不倒翁.WZT    时间: 2017-1-25 10:20
标题: RE: 用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发
利用外部第一个中断启动,利用外部第二个中断停止。没有上机实验。
#include<reg52.h>
unsigned char i=0;
void delay(unsigned int t) //0-65535
{
while(--t);
}
void main()
{
  unsigned char q;
  IT0=1;       //下降沿触发
  EX0=1;       //INT0中断允许
  IT1=1;       //下降沿触发
  EX1=1;
  EA=1;        //总中断允许
  while(i==1)
  {
    P1=0xfe;//1111 1110,初始化点亮第一个灯,该语句必须放在循环内部,否则只能让每个灯亮一次,不能循环,因为没有循环初始化
    for(q=0;q<8;q++)
    {
      delay(50000);
      P1<<=1;
      P1=P1|0X01; //0000 0001,这条语句用于使上一个LED灯熄灭
    }
  }
}
/*INT0中断服务函数*/
void Interrupt1(void)interrupt 0 using 1
{  
  EX0=0;   //进入外部INT0中断关闭,防止误操作
  i=1;
  delay(20);
  EX0=1;   //中断函数结束,外部INT0中断打开,中断生效   
}
/*INT1中断服务函数*/
void Interrupt2(void)interrupt 2 using 2
{  
  EX1=0;   //进入外部INT0中断关闭,防止误操作
  i=0;
  delay(20);
  EX1=1;   //中断函数结束,外部INT0中断打开,中断生效   
}
作者: 天才鱼yhx    时间: 2017-1-25 14:53
不倒翁.WZT 发表于 2017-1-25 10:20
利用外部第一个中断启动,利用外部第二个中断停止。没有上机实验。
#include
unsigned char i=0;

好的   我试试    谢谢
作者: 天才鱼yhx    时间: 2017-1-25 14:59
不倒翁.WZT 发表于 2017-1-25 10:20
利用外部第一个中断启动,利用外部第二个中断停止。没有上机实验。
#include
unsigned char i=0;

所有的LED都没有亮起来
作者: 不倒翁.WZT    时间: 2017-1-26 08:53
标题: RE: 用按键控制LED按顺序循环点亮。按键用的是外部中断功能,触发方式为边沿触发
天才鱼yhx 发表于 2017-1-25 14:59
所有的LED都没有亮起来

看来用负边沿触发是不行的,只能用低电平触发。请看修改后的程序,以上机调试过。
#include<reg52.h>
unsigned char i=0;
void delay(unsigned int t) //0-65535
{
  while(--t);
}
void main()
{
  unsigned char q;
  IT0=0;       //低电平触发
  EX0=1;       //INT0中断允许
  IT1=0;       //低电平触发
  EX1=1;
  EA=1;        //总中断允许
  while(i==1)
  {
    P1=0xfe;//1111 1110,初始化点亮第一个灯,该语句必须放在循环内部,否则只能让每个灯亮一次,不能循环,因为没有循环初始化
    for(q=0;q<8;q++)
    {
      delay(50000);
      P1<<=1;
      P1=P1|0X01; //0000 0001,这条语句用于使上一个LED灯熄灭
    }
  }
}
/*INT0中断服务函数*/
void Zong1(void)interrupt 0 using 1
{  
  EX0=0;   //进入外部INT0中断关闭,防止误操作
  i=1;
  delay(20);
  EX0=1;   //中断函数结束,外部INT0中断打开,中断生效   
}
/*INT1中断服务函数*/
void Zong2(void)interrupt 2 using 2
{  
  EX1=0;   //进入外部INT0中断关闭,防止误操作
  i=0;
  delay(20);
  EX1=1;   //中断函数结束,外部INT0中断打开,中断生效   
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1