找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3021|回复: 0
打印 上一主题 下一主题
收起左侧

[求助]一直不理解问题出在哪(关于中断的)

[复制链接]
跳转到指定楼层
楼主
ID:37411 发表于 2012-4-5 01:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

原本想实现的功能是:按按键1加一,按键2减一,按键三清零,按键4定时器定时一秒自动加一,按键5灯全亮,蜂鸣器响,再按就关了,按键6为P3.2口是中断,中断一次实行流水灯程序

可问题就出在当按了中断后,灯没有执行流水灯程序,反而数码管依次轮流闪亮,灯只亮了两展,不知道问题出在哪

以下是本人的程序,求大侠指点!!!!谢谢啊!!!!!

 

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned int
#define led P2
uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //0,1,2,3,4,5,6,7,8,9
uint code btm[]={0xe7,0xc3,0x81,0x00} ;
uint code mtb[]={0x7e,0x3c,0x18,0x00} ;
sbit smg1=P1^0;
sbit smg2=P1^1;
sbit smg3=P1^2;
sbit smg4=P1^3;
sbit key1=P3^7;
sbit key2=P3^6;
sbit key3=P3^5;
sbit key4=P3^4;
sbit key5=P3^3;
sbit sb=P1^5;
uint ge,shi,bai,qian,num,tt;
uint count=0;
void dely(uint);
void display(uint);


 void ltr()
 {led=0x7f;
 for(count=0;count<8;count++)
 {
 led=led>>1;
    dely(500); 
 }
 return;
 }

 void rtl()
 {led=0xfe;
 for(count=0;count<8;count++)
 {
 led=led<<1;
 dely(500);
         }
   return;
 }

 void bothtomiddle()
 {led=0xff;
 for(count=0;count<5;count++)
 {led=btm[count];
 dely(500);

 }
 return;

 }
   
   void middletoboth()
   {led=0xff;
   for(count=0;count<5;count++)
   {led=mtb[count];
   dely(500);
   }
   return;
   }

 


  

void dely(uint t)
{   uint x,y;
   for(x=0;x<t;x--)
     for(y=0;y<110;y--)
      {}
         }

void init()         //初始化T0和INT0
{    EA=1;
    ET0=1;
     EX0=1;
    IT0=0;
     TMOD=0X01;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)/256;
   
}

 

 

void keyscan()
{  
   if(key1==0)        //按键1加一
   {   
      dely(10);
      if(key1==0)
      {   num++;
       if(num==10000)
        {
         num=0;
         sb=0;
         dely(1000);
         sb=1;
         }
        while(!key1);
      }
   }
    
    
   if(key2==0)          //按键2减一 
   {   
      dely(10);
      if(key2==0)
      {   
       if(num==0)
        { 
         num=10000;
           sb=0;
         dely(1000);
         sb=1;
        }
         num--;
        while(!key2);
      }
   }

   if(key3==0)             //按键3清零作用
   { 
      dely(10);
      if(key3==0)
      {
       num=0;
      while(!key3);
         }
   }

   if(key4==0)
   {
        dely(10);
      if(key4==0)         //定时器工作
      {
           while(!key4);
           TR0=~TR0;
           }  
        
        }
   if(key5==0)            //按键5功能
   {      
      dely(10);
      if(key5==0)
      {
       while(!key5) ;
        dely(5);            //LED全亮,蜂鸣器响
        led=~led;
        sb=~sb;
        dely(100);
       
      }  
        
        }
}


void display(uint number)             //显示数据函数
{      qian=number/1000;
     bai=number%1000/100;
     shi=number%100/10;
     ge=number%10;

     smg1=0;
     P0=table[qian];     
     dely(5);
     P0=0xff;
     smg1=1;

     smg2=0;
     P0=table[bai];
     dely(5);
     P0=0xff;
     smg2=1;

     smg3=0;
     P0=table[shi];     
     dely(5);
     P0=0xff;
     smg3=1;

     smg4=0;
     P0=table[ge];     
     dely(5);
     P0=0xff;
     smg4=1;


}

void zhongduan() interrupt 0        //中断函数内容
{   
   ltr();
   rtl();
   bothtomiddle();
   middletoboth();
   led=0xff;   
        }  

void main()               //主函数入口
{       num=0;
     init();           //初始化定时中断函数
     while(1)
     {
         keyscan();
       display(num);
            }
}
            
void timet0() interrupt 1         //定义计数器功能
{ 
        TH0=(65536-45872)/256;
     TL0=(63336-45872)/256;
     tt++;
     if(tt==20)
     { 
       tt=0;
       num++;
       if(num==10000)
         {num=0;}
           }

}

 



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表