此计数程序为什么成了秒表

[复制链接]
2230|7
 楼主| 2001myp 发表于 2009-3-10 16:05 | 显示全部楼层 |阅读模式
#include <REG51.H>        
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x12,0xb7,0x19,0x91,0xb4,0xd0,0x50,0x97,0x10,0x90};
uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; 
/***************************************************************/
uint data cnt=0;            
bit bdata bitflag;            
/**********************************************/
void init(void)                    
{                            
    bitflag=0;                    
    EX0=1;                    
    IT0=1;                    
    EA=1;                    
}                            
/**************************************************/
void delay(uint k)                
{                            
uint data i,j;                    
    for(i=0;i<k;i++)            
    {                        
    for(j=0;j<121;j++){;}        
    }                        
}                            
/**************************************************/
void main(void)                
{    uchar i;                    
    init();            
    while(1)                    
    {                        
    if(bitflag=!bitflag)cnt++;            
    if(cnt>99)cnt=0;            
        for(i=0;i<200;i++)        
        {                                    
        P1=SEG7[cnt/10];
        P2=ACT[0];            
        delay(1);                
        P1=SEG7[cnt%10];    
        P2=ACT[1];            
        delay(1);                
        }            
    }                        
}                            
/************************************************/
void extern_int0(void) interrupt 0 using 0    
{                            
bitflag=!bitflag;                
}                            
                            
上面这个计数程序,用数码管显示。我用下降沿中断有效,我在INTO出接了个对地的开关,我这个程序的目的是按一下记一个数的,可是现在只要通电运行后就开始自己一个数一个数自加,就像秒表一样,为什么呢,是程序问题么,可我看不出有问题啊,高手请指教
HWM 发表于 2009-3-10 16:11 | 显示全部楼层

仔细看看这玩意儿:“if(bitflag=!bitflag)cnt++;”

 楼主| 2001myp 发表于 2009-3-10 16:41 | 显示全部楼层

HWM大哥在啊

谢谢提醒,我注意到了,我改成了if(bitflag==!bitflag)cnt++;或者:“if(bitflag!=bitflag)cnt++;”,无论怎么加外部中断,都在00处不会动了,为什么呢
HWM 发表于 2009-3-10 16:51 | 显示全部楼层

你应该判bitflag,成立后(即该计数了)再将它取反。

 楼主| 2001myp 发表于 2009-3-10 18:19 | 显示全部楼层

谢谢指教

不过我还觉得不对,你说成立后再取反,在哪里取反呢,我找了好几个位置想添加取反的语句,但都不对,呵呵,小弟愚钝,请指教
 楼主| 2001myp 发表于 2009-3-11 08:48 | 显示全部楼层

问题蠢了点,但新人希望高手指点

我在后面加了取反后,发现还是不行,想了想几个取反的位置都不对,中断后本来标志位都已经取反为1了,结果我再取反为零了又,那样的话岂不是判断后又为假了,不执行了,高手指教
welson 发表于 2009-3-11 09:25 | 显示全部楼层

改成下面就可以了

 #include <REG51.H>        
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x12,0xb7,0x19,0x91,0xb4,0xd0,0x50,0x97,0x10,0x90};
uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; 
/***************************************************************/
uint data cnt=0;            
bit bdata bitflag;            
/**********************************************/
void init(void)                    
{                            
    bitflag=0;                    
    EX0=1;                    
    IT0=1;                    
    EA=1;                    
}                            
/**************************************************/
void delay(uint k)                
{                            
uint data i,j;                    
    for(i=0;i<k;i++)            
    {                        
    for(j=0;j<121;j++){;}        
    }                        
}                            
/**************************************************/
void main(void)                
{    uchar i;                    
    init();            
    while(1)                    
    {                        
    if(bitflag==1)
                {
               cnt++;
          bitflag=0;
        }          
    if(cnt>99)cnt=0;            
        for(i=0;i<200;i++)        
        {                                    
        P1=SEG7[cnt/10];
        P2=ACT[0];            
        delay(1);                
        P1=SEG7[cnt%10];    
        P2=ACT[1];            
        delay(1);                
        }            
    }                        
}                            
/************************************************/
void extern_int0(void) interrupt 0 using 0    
{                            
bitflag=1;                
}                            
 楼主| 2001myp 发表于 2009-3-11 09:51 | 显示全部楼层

谢谢WELSON大哥指点

谢谢WELSON大哥指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

210

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部