用51单片机实现电子时钟1602显示异常


#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
 sbit EN=P3^4;
 sbit RS=P3^5;
 sbit K1=P1^0;
 sbit K2=P1^1;
 sbit K3=P1^2;
 sbit K4=P1^3;
 sbit beep=P1^4;
 uchar count;
unsigned char A[]="2021-10-17";
unsigned char time[]={11,15,10};
 void delay(uchar n)                //延时----毫秒
 {
  uint x,y;
  for(x=n;x>0;x--)
  for(y=110;y>0;y--);
 }
 void di()
 {
  beep=0;
  delay(10);
  beep=1;
 }
  void write_com(uchar com)              //写指令
 {
  RS=0;
  EN=0;
  P0=com;
  delay(5);
  EN=1;
  delay(5);
  EN=0;
 }
  void write_date(uchar date)           //写数据
 {
  RS=1;
  EN=0;
  P0=date;
  delay(5);
  EN=1;
  delay(5);
  EN=0;
 }
 void inite()
 {
  uchar a; 
  TMOD|=0X01;   //选择为定时器0模式,工作方式1
  ET0=1;        //打开定时器0中断允许
  EA=1;        //打开总中断
  TR0=1;       //打开定时器
  EX0=1;              //打开外部中断0
  IT0=1;             //边沿触发方式
  EX1=1;              //打开外部中断1
  IT1=1;
  write_com(0x38);                       //初始化1602
  write_com(0x0c);
  write_com(0x01);
  write_com(0x80);
  for(a=0;a<15;a++)            
  {
   write_date(A[a]);
   delay(5);
  }
   write_com(0x80+0x40+6);
   write_date(':');
   delay(5);
   write_com(0x80+0x40+9);
   write_date(':');
   delay(5);
  }
void input(uchar add,uchar date)
{
 uchar a,b;
 a=date/10;
 b=date%10;
 write_com(0x80+0x40+add);
 write_date(0x30+a);
 write_date(0x30+b);
}
void main()
{
 inite();
while(1)
{
 uchar num=0;
 if(K1==0)
 {
 delay(5);
 if(K1==0);
 {
   num++;
   while(!K1);
   di();
   if(num==1)
   {
    TR0=0;
    write_com(0x80+0x40+10);      //指向秒
    write_com(0x0f);              //光标显示
   }
   if(num==2)
   {
    write_com(0x80+0x40+7);      //指向分        
   }
   if(num==3)
   {
    write_com(0x80+0x40+4);      //指向时        
   }
   if(num==4)
   {
    num=0;
    write_com(0x0c);
    TR0=1;
   }
   }
   }
    if(num!=0)
    {
     if(K2==0)
     {
      delay(5);
      if(K2==0)
      {
       while(!K2);
       di();
       if(num==1)
       {
           time[3]++;
        if(time[3]==60)
         time[3]=0;
        input(10,time[3]);
        write_com(0x80+0x40+10);
        //缺少存入
       }
       if(num==2)
       {
           time[2]++;
        if(time[2]==60)
         time[2]=0;
        input(7,time[2]);
        write_com(0x80+0x40+7);
        //缺少存入
       }
       if(num==3)
       {
           time[1]++;
        if(time[1]==24)
         time[1]=0;
        input(4,time[1]);
        write_com(0x80+0x40+4);
        //缺少存入
       }
      }
     }
     if(K3==0)
     {
      delay(5);
      if(K3==0)
      {
       while(!K2);
       di();
       if(num==1)
       {
           time[3]--;
        if(time[3]==60)
         time[3]=0;
        input(10,time[3]);
        write_com(0x80+0x40+10);
        //缺少存入
       }
       if(num==2)
       {
           time[2]--;
        if(time[2]==60)
         time[2]=0;
        input(7,time[2]);
        write_com(0x80+0x40+7);
        //缺少存入
       }
       if(num==3)
       {
           time[1]--;
        if(time[1]==24)
         time[1]=0;
        input(4,time[1]);
        write_com(0x80+0x40+4);
        //缺少存入
       }
      }
     }    
    }
}
}
void time_c() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 count++;
 if(count==20);
 {
  count=0;
  time[3]++;
  if(time[3]==60)
  {
   time[3]=0;
   time[2]++;
   if(time[2]==60)
   {
    time[2]=0;
    time[1]++;
    if(time[1]==24)
    {
     time[1]=0;
    }
    input(4,time[1]);
   }
   input(7,time[2]);
  }
  input(10,time[3]);
 }

在加入最后的time——c函数后前面正常的日期显示也无法正常运行,而时间出出现奇怪的字符

img