51单片机为什么加入1602后,程序不稳定了,数码管显示就很稳定

使用1602时,两个红外接收装置有可能重复扫描,无法清零,使得加减顺序变乱

#include <reg52.h>
#include<intrins.h>
#define uint unsigned int 
#define uchar unsigned char
uchar shi,ge,temp1,num=10,aa=0;
uint num1,num2;
char key_num,key_flag;
//uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管码
//uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选码
uchar code Table[]="renshu";
uchar code Table1[]="0123456789";
sbit dula=P2^6;
sbit wela=P2^7;
sbit hong1=P1^0;
sbit hong2=P1^1;
sbit led1=P1^5;
sbit led2=P1^6;
sbit led3=P1^7;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit lcdrw=P3^6;
sbit fengming=P2^3;
sbit guangmin=P1^4;
sbit k1=P2^4;
sbit k2=P1^2;
sbit led=P1^3;
void yaokong();
void delay(uint z);
void init();//初始化
void init1();
void display(uchar shi,uchar ge);//显示
void panduan1();//判断函数
void guangm();//光敏
void Timer0Init();
void write_com(uchar com);
void write_data(uchar date);
void init();
void main()
{   
	Timer0Init();
	
	while(1)
	{   	
		yaokong();
		panduan1();
		if(temp1>0)
			fengming=1;
		led1=1;
		led2=1;
		led3=1;
		 shi=temp1/10;
	     ge=temp1%10;
		guangm();
		if(!temp1)
		{
			display(shi,ge);			
		}
		else
		{	
			display(shi,ge);
			
		}		
		init1();			
	}
}
void delay(uint z)
{
	uint x,y;
  for(x=z;x>0;x--)
		for(y=110;y>0;y--)
			;
}
void display(uchar shi,uchar ge)
{
	 for(aa=0;aa<7;aa++)
		{
        write_data(Table[aa]);	
		}
		while(num--);
		write_com(0x80+0x40);//换行,第一行0-27H,第二行40H-60H   
        write_data(Table1[shi]); 
        while(num--);		
	    write_data(Table1[ge]);
       while(num--);
}
void guangm()
{
		if(guangmin==0)
	{
			led1=1;
			led2=1;
			led3=1;
	}
	else
	{	  	
		if(temp1<4&&temp1>0)
			{	
				led1=0;
			}
		if(temp1>3&&temp1<11)
			{
				led1=0;
				led2=0;
			}
		if(temp1>10)
			{ 
				led1=0;
				led2=0;
				led3=0;
			}
	}
	            delay(2);
}
void Timer0Init(void)		//3毫秒@11.0592MHz
{
	ET0=1;
	TMOD &= 0x0F;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x28;		//设置定时初值
	TF0 = 0;		//清除TF1标志
	EA=1;
	led=1;
}

void time1() interrupt 1
{   
	
	if(hong1==0)
	{
		num1++;
	}
	if(hong2==0)
	{
		num2++;
	}
}
void panduan1()
{
	if(hong1==0)
	{	delay(20);
		if(hong1==0)
		{			
			TR0=1;
		}		
	}
	if(hong2==0);
	{
		delay(20);
		if(hong2==0)
		{			
			TR0=1;
		}
	}
	if(num1!=0&&num2!=0)
	{
		if(num1>num2)
		{	temp1++;
			delay(300);
			
			if(hong2==1&&hong1==1)
			 { 
				 init();
			 }
			 
		} 
		if(num1<num2)
		{
			if(temp1<1)
				temp1=0;
			else
				temp1--; 				
			  delay(300);
			    if(hong1==1&&hong2==1)
				{
			       init();
				}			
		}		   
	}
}
void init()
{
	TR0=0;
	num1=0;
	num2=0;
	hong1=1;
	hong2=1;
    TL0 = 0x00;		//设置定时初值
	TH0 = 0x28;		//设置定时初值
}
void yaokong()
{
		if(k1==1)
	       key_flag=10;	
		if(k2==1)
			key_flag=11;
		if(key_flag==10)
		{
			led=0;
			guangmin=0;
		}
		else
		{
			led=1;
			guangmin=1;
		}
}
void write_com(uchar com)
{
    //写命令
    lcdrs=0;//数据命令选择端,选择命令
	 lcden=0;//使能
    P0=com;//送指令
	lcdrw=0;
    delay(5);
    lcden=1;
    delay(5);
    lcden=0;
}
void write_data(uchar date)
{
    //写数据
    lcdrs=1;//数据命令选择端,选择数据
	 lcden=0;//使能
    P0=date;//送数据
    delay(5);
	lcdrw=0;
    lcden=1;
    delay(5);
    lcden=0;
}
void init1()
{
    //第一步关闭数码管两个锁存器
    dula=0;
    wela=0;
    //第二步初始化液晶
 //   lcden=0;//使能
    write_com(0x38);//模式初始化
    write_com(0x0c);//开显示,显示光标,光标闪烁
    write_com(0x06);//光标+1,不整屏移动了
 // write_com(0x01);//显示清零,数据指针清零
    write_com(0x80);//数据地址指针初始化00
}

而使用数码管时,就较为稳定

#include <reg52.h>
#include<intrins.h>
#define uint unsigned int 
#define uchar unsigned char
uchar shi,ge,temp1,num=10;
uint num1,num2;
char key_num,key_flag;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管码
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选码
sbit dula=P2^6;
sbit wela=P2^7;
sbit hong1=P1^0;
sbit hong2=P1^1;
sbit led1=P1^5;
sbit led2=P1^6;
sbit led3=P1^7;
sbit fengming=P2^3;
sbit guangmin=P1^4;
sbit k1=P2^4;
sbit k2=P1^2;
sbit led=P1^3;
void yaokong();
void delay(uint z);
void init();//初始化
void display(uchar shi,uchar ge);//显示
void panduan1();//判断函数
void guangm();//光敏
void Timer0Init();
void init();
void main()
{   
	Timer0Init();
	while(1)
	{   
		
//		yaokong();
		panduan1();
		
		 shi=temp1/10;
	     ge=temp1%10;
		guangm();
	}
}
void delay(uint z)
{
	uint x,y;
  for(x=z;x>0;x--)
		for(y=110;y>0;y--)
			;
}
void display(uchar shi,uchar ge)
{
		P0=0xff;
		wela=1;
		P0=table1[0];
		wela=0;
		dula=1;
		P0=table[shi];
		dula=0;	
        while(num--);	
		P0=0xff;
		wela=1;
		P0=table1[1];
		wela=0;
		dula=1;
		P0=table[ge];
		dula=0;	
        while(num--);	
}
void guangm()
{
		
	
		if(guangmin==0)
	{
			led1=1;
			led2=1;
			led3=1;
	}
	else
	{	  	
		if(temp1<4&&temp1>0)
			{	
				led1=0;
			}
		if(temp1>3&&temp1<11)
			{
				led1=0;
				led2=0;
			}
		if(temp1>10)
			{ 
				led1=0;
				led2=0;
				led3=0;
			}
	}
	            delay(2);
}
void Timer0Init(void)		//3毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TL1 = 0x66;		//设置定时初值
	TH1 = 0x7E;		//设置定时初值
	TF1 = 0;		//清除TF0标志
	TR1 = 1;		//定时器0开始计时
	ET1=1;
	ET0=1;
	TMOD &= 0x0F;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值
	TH0 = 0x7E;		//设置定时初值
	TF0 = 0;		//清除TF1标志
	EA=1;
	led=1;
}
void time0() interrupt 3
{
	display(shi,ge);
}
void time1() interrupt 1
{   
	
	if(hong1==0)
	{
		num1++;
	}
	if(hong2==0)
	{
		num2++;
	}
}
void panduan1()
{
	if(hong1==0)
	{	delay(10);
		if(hong1==0)
		{			
			TR0=1;
		}		
	}
	if(hong2==0);
	{
		delay(10);
		if(hong2==0)
		{			
			TR0=1;
		}
	}
	if(num1!=0&&num2!=0)
	{
		if(num1>num2)
		{	temp1++;
			delay(200);
			if(temp1==100)//超出蜂鸣器响
			{
				P0=0xff;
				wela=1;
				P0=0xfc;
				wela=0;
				dula=1;
				P0=0x3f;
				dula=0;	
				delay(1);
			    fengming=0;
               while(num--);					  
			 }
			 if(hong2==1&&hong1==1)
			 { 
				 init();
			 }
		} 
		if(num1<num2)
		{
			if(temp1<1)
				temp1=0;
			else
				temp1--; 
				delay(200);
			    if(hong1==1&&hong2==1)
				{
			       init();
				}
		}		   
	}
}
void init()
{
	TR0=0;
	num1=0;
	num2=0;
	hong1=1;
	hong2=1;
	TL0 = 0x66;		//设置定时初值
	TH0 = 0x7E;		//设置定时初值	
}
void yaokong()
{
		if(k1==1)
	       key_flag=10;	
		if(k2==1)
			key_flag=11;
		if(key_flag==10)
		{
			led=0;
			guangmin=0;
		}
		else
		{
			led=1;
			guangmin=1;
		}
}

求大佬帮忙改正

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。