⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main2.c

📁 这是用89S52做的带时间日历功能的计算器。调试通过。
💻 C
字号:
#include <AT89X51.h>     //头文件
#include <intrins.H>
#include <absacc.h>

//################## lcd #######################
  extern void lcd_init(void);    //lcd 初始化
  extern void lcd_data(char);    //lcd 写数据
  extern char lcd_rdata(void);   //lcd 读数据
  extern void lcd_command(char); //lcd 写命令
  extern void lcd_address(char); //lcd 显示地址
//################# display ####################
  extern void display(void);     //显示内容刷新
//################## key ##############
  extern char key(void);         //返回按键键值 1--16
  extern char number(void);      //返回按键数字 1--16
  extern void nokey(void);       //误操作,连操作
//###################################################


void delay(int);      //延时
void time0_int(void);  //定时器



char time_temp[6]={0x05,0x04,0x09,00,00,00};   //万年历更新缓冲区
char time_en=1;temp;                           //时间更新允许位
char disp_temp[32]={"^^^^^^^^^^^^^^^^5/04/09-22:41:00"};  //显示缓冲区
int time=0;                                    //定时器状态标志


main()
{char i,k,ke=0;
 unsigned char e,x,y,z;
 long int jia=0,bjia=0,jieguo=0;

 lcd_init();     //lcd初始化
 EA=1;           //开全局中断
 ET0=1;          //开T0中断
 TMOD=0x01;      //用T0。模式1。16位
 TH0=0xb8;       //设定时时长20ms      
 TL0=0x00;
 TR0=1;          //开计数器
   
_caculator:   
   
 for(i=0;i<16;i++)         //第一行清零
  { disp_temp[i]=' '; }
 disp_temp[15]='0';

while(1)
{
  time_en=1;
  e=key();
  if(e==14) 
     {goto _time;}



   while(1)             //先输被加数
      {e=number();
          if(e<=9&&e>=0) 
            {bjia=bjia*10+e; 
             for(i=1;i<=14;i++)
               disp_temp[i]=disp_temp[i+1];
             disp_temp[15]=e+0x30;
             nokey();
             }
			 else 
			   {e=key();
			    if(e==16) {ke=1; disp_temp[0]='+';}
                if(e==8)  {ke=2; disp_temp[0]='-';}
                if(e==4)  {ke=3; disp_temp[0]='*';}
			    break;
				}
		}

  while(1)
       {
        e=key(); 
          if((e==16)||(e==12)||(e==8))                      //做被加数=被加数+加数操作
            {if(ke==1){ bjia=bjia+jia; jieguo=bjia; }
             if(ke==2){ bjia=bjia-jia; jieguo=bjia; }
             if(ke==3){ bjia=bjia*jia; jieguo=bjia; }
			 if(ke==0){ bjia=bjia+jia; jieguo=bjia;}
			 if(e==16) {ke=1; disp_temp[0]='+';}
             if(e==12) {ke=2; disp_temp[0]='-';}
             if(e==8)  {ke=3; disp_temp[0]='*';}
             for(i=1;i<16;i++)   { disp_temp[i]=' '; }        //第一行清零
             for(i=15;i>0;i--)
               {k=jieguo%10+0x30;  disp_temp[i]=k;  
                jieguo=jieguo/10;  if(jieguo==0) break;  //显示结果
                }
			 jia=0;                   //加数清零
			 nokey();
			 }
			 else if(e==14) break;
			   else if(e==15)    //c
			     {bjia=0; jia=0; jieguo=0;
				   for(i=1;i<16;i++)   { disp_temp[i]=' '; }        //第一行清零
				   disp_temp[15]='0';
				   nokey();
				   goto _caculator;
				  }
				  
				  

		 e=number();                //输入加数
           if(e<=9&&e>=0) 
              {jia=jia*10+e; 
               for(i=0;i<16;i++)   { disp_temp[i]=' '; }        //第一行清零
			   jieguo=jia;
               for(i=15;i>0;i--)
                 {k=jieguo%10+0x30;  disp_temp[i]=k;  
                  jieguo=jieguo/10;  if(jieguo==0) break;  //显示加数结果
                  }
               nokey();
               }

		  e=key();
            if(e==4)
			  {for(i=1;i<16;i++)   { disp_temp[i]=' '; }        //第一行清零
               if(ke==1){ bjia=bjia+jia; jieguo=bjia; }
               if(ke==2){ bjia=bjia-jia; jieguo=bjia; }
               if(ke==3){ bjia=bjia*jia; jieguo=bjia; }
			    for(i=15;i>0;i--)
                  {k=jieguo%10+0x30;  disp_temp[i]=k;  
                   jieguo=jieguo/10;  if(jieguo==0) break;  //显示结果
                   }
			    nokey();
			   }

		 delay(100);
        }

	if(e==14)   goto _time;
    
  delay(200);
}
 


//=================================  time  =======================
_time:  
    time_en=0;        //时间更新停止
    for(i=0;i<16;i++)  { disp_temp[i]=' '; }     //清第一行
    disp_temp[0]='v';  x=1;        //第一位修改标志
    nokey();            //防止连按
    while(1)
       {e=key();
        if(e==1)   //左移
           {x--;
            if(x==0) x=16;
            while(x==2||x==3||x==5||x==6||x==8||x==9||x==11||x==12||x==14||x==15)   x--;     //判断箭头位置
            for(i=0;i<16;i++)  { disp_temp[i]=' '; }       //清空第一行屏幕
            disp_temp[x-1]='v';      //重新写箭头          
            nokey();                 //防止误操作
            }
        if(e==2)   //右移
           {x++;
            if(x==17) x=1;
            while(x==2||x==3||x==5||x==6||x==8||x==9||x==11||x==12||x==14||x==15)   x++;
            for(i=0;i<16;i++)  { disp_temp[i]=' '; }
            disp_temp[x-1]='v';  
            nokey();
            }
        if(e==3)    //  在箭头标志位置加
           {if(x==1) time_temp[0]++;    //年加
                       if(time_temp[0]==10) time_temp[0]=0;
            if(x==4) time_temp[1]++;    //月加
                       if(time_temp[1]==13) time_temp[1]=1;
            if(x==7) time_temp[2]++;    //日加
                       if(time_temp[2]==32) time_temp[2]=1; 
            if(x==10) time_temp[3]++;   //时加
                       if(time_temp[3]==24) time_temp[3]=0;  
            if(x==13) time_temp[4]++;   //分加
                       if(time_temp[4]==60) time_temp[4]=0;  
            if(x==16) time_temp[5]++;   //秒加
                       if(time_temp[5]==60) time_temp[5]=0;  
                                        //  把重新设定的时间更新到显示缓冲区  时间刷新  
              k=time_temp[5];  y=(k%10)+0x30; z=(k/10)+0x30;  //秒更新   个位和十位
              disp_temp[31]=y;   disp_temp[30]=z;
              k=time_temp[4];  y=(k%10)+0x30; z=(k/10)+0x30;  //分更新
              disp_temp[28]=y;   disp_temp[27]=z;
              k=time_temp[3];  y=(k%10)+0x30; z=(k/10)+0x30;  //时更新
              disp_temp[25]=y;   disp_temp[24]=z;  
              k=time_temp[2];  y=(k%10)+0x30; z=(k/10)+0x30;  //日更新
              disp_temp[22]=y;   disp_temp[21]=z;
              k=time_temp[1];  y=(k%10)+0x30; z=(k/10)+0x30;  //月更新
              disp_temp[19]=y;   disp_temp[18]=z;
              k=time_temp[0];  y=(k%10)+0x30;    //年更新
              disp_temp[16]=y;         
                         
              display();
              nokey();
            }
         if(e==14)        //跳出设置状态,返回计算器  
            {for(i=0;i<16;i++)  { disp_temp[i]=' '; }
             nokey();  
             time_en=1;break;      //时间允许打开,跳出
             }
         delay(100);               //WHILE的延时 给其他分支留有时间
       }
        
     time_en=1;
     goto _caculator;
   
   

 


}


void time0_int(void) interrupt 1  // T0 中断 显示刷新
{char x,y,z;
 TR0=0;        //关计数器
 TH0=0xb8;
 TL0=0x00;
 TR0=1;         //开计数器
 time++;        //更新记数累加器
 if((time%3)==0)    //60毫秒刷屏
    display();
 if(time%50==0&&time_en==1) 
  {  
    time_temp[5]++;
    if(time_temp[5]>=60) 
      {time_temp[5]=0; time_temp[4]++;}  //秒到60  分进位
    if(time_temp[4]>=60) 
      {time_temp[4]=0; time_temp[3]++;}  //59分   时进位
    if(time_temp[3]>=24) 
      {time_temp[3]=0; time_temp[2]++;}  // 24小时 日进位
    
    if(time_temp[1]==1||time_temp[1]==3||time_temp[1]==5|| \
       time_temp[1]==7||time_temp[1]==8||time_temp[1]==10||time_temp[1]==12)    
       {
         if(time_temp[2]>=32)  //如果是1,3,5,7,8,10,12月,日调整
           {time_temp[2]=1; time_temp[1]++;}
        }
        else if(time_temp[1]==4||time_temp[1]==6||time_temp[1]==9||time_temp[1]==11)
          {
           if(time_temp[2]>=31)  //如果是4,6,9,11月,日调整
              {time_temp[2]=1; time_temp[1]++;}
           }
          else if(time_temp[1]==2)   //如果是2月
            {if((time_temp[0]+2000)%4==0)  //如果是闰年,日调整
               {if(time_temp[2]>=30)
                 {time_temp[2]=1; time_temp[1]++;}
                }
                else     //如果不是闰年,日调整
                 {if(time_temp[2]>=29)
                    {time_temp[2]=1; time_temp[1]++;}
                  }
             }
             else ;
  if(time_temp[1]>=13)     //12 月 年进位
    {time_temp[1]=1; time_temp[0]++;}
  if(time_temp[0]>=100)   //年更新
    {time_temp[0]=1; }
  
  x=time_temp[5];  y=(x%10)+0x30; z=(x/10)+0x30;  //秒更新
  disp_temp[31]=y;   disp_temp[30]=z;
  x=time_temp[4];  y=(x%10)+0x30; z=(x/10)+0x30;  //分更新
  disp_temp[28]=y;   disp_temp[27]=z;
  x=time_temp[3];  y=(x%10)+0x30; z=(x/10)+0x30;  //时更新
  disp_temp[25]=y;   disp_temp[24]=z;  
  x=time_temp[2];  y=(x%10)+0x30; z=(x/10)+0x30;  //日更新
  disp_temp[22]=y;   disp_temp[21]=z;
  x=time_temp[1];  y=(x%10)+0x30; z=(x/10)+0x30;  //月更新
  disp_temp[19]=y;   disp_temp[18]=z;
  x=time_temp[0];  y=(x%10)+0x30; //z=(x/16)+0x30;//年更新
  disp_temp[16]=y;  // disp_temp[30]=c;
  time=0;
  }
}

void delay(int x)
{char i=81;
 for(;x>0;x--)
  {i=81; while((i--)>0) _nop_();}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -