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

📄 time.c

📁 一个有关电子时钟的单片机程序,可显示年月日,以及小时,分秒,可以手动修改时间.
💻 C
字号:
#include<reg52.h>
#include<absacc.h>
#include <stdio.h>
#include <intrins.h>

xdata unsigned char CW _at_ 0xf9fc;     //?????
xdata unsigned char CR _at_ 0xf9fe;
xdata unsigned char DW _at_ 0xf9fd;
xdata unsigned char DR _at_ 0xf9ff;
unsigned char key;
bit flag;
int k;

int g; //取月份
int f=29;  //f进位标志

int clockon;   //闹钟开关


void delay(unsigned int i)
{	while(i--);
}
unsigned char lc_read(void)
{	unsigned char a;
	delay(100);
	a=CR;
	return(a);
}
void readbf(void)
{	while(flag)
	{	flag=(bit)(lc_read())&0x80;  //????
	}
}
void lc_write(unsigned char a)
{	delay(20);
	CW=a;
	delay(20);
}
void ld_write(unsigned char a)
{	delay(20);
	DW=a;
	delay(20);
}
void inttilcs(void)
{	
	readbf();
	lc_write(0x38);
	delay(500);
	readbf();
	lc_write(0x38);
	delay(500);
	readbf();
	lc_write(0x38);
	delay(500);
	lc_write(0x01);
	readbf();
	lc_write(0x0f);
	readbf();
	delay(500);
	lc_write(0x0f);
	readbf();
	delay(500);
	lc_write(0x06);
	delay(500);
}

unsigned char code display_code[10]=
 {
 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39 //0,1,2,3,4,5,6,7,8,9                                    
 };
unsigned char data display_data_buff[15]={2,0,0,6,0,1,0,1,1,2,0,0,0,0,1};//数据显示缓冲区     ??????
unsigned char data display_code_buff[15]={2,0,0,6,0,1,0,1,1,2,0,0,0,0,1};//段码显示缓冲区

struct time_str
{signed char year;
 unsigned char month;
 unsigned char day;
 signed char hour;
 signed char minute;
 signed char second;
 unsigned char second20;
 unsigned char week;
}time;


/* struct clock_str
{unsigned char hour;
 unsigned char minute;
 }clock;*/
//**************************************************************************
void dp_data_to_dp_code_buff(void)
{
 unsigned char i;
 for (i=0;i<15;i++)
  {
  display_code_buff[i]=display_code[display_data_buff[i]]; 
  }
}
//**************************************************************************

 void js_week()
{
	 //计算星期几
	 int i;

	 int n;
	 
	 int year,month,day;
	 
	 int a1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	 
	 year=time.year+2000;
	 month=time.month;
	 day=time.day;
 
 if (year%4==0 && year%100!=0)
 
 {	a1[1]=29;f=30;}
 	
 if (year%400==0)
 
 	{a1[1]=29;f=30;}
 	
 for(i=0;i<month-1;i++)
 
      day+=a1[i];
      
      
  n=year-1900+(year-1901)/4+day;
  
  n=n%7;   //星期几

  time.week=n;
  
   
}

int jinwei(int d)
{
	g=time.month;
		switch(g)
		
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12: f=32;break;
			
		    case 4:
		    case 6:
		    case 9:
		    case 11:f=31;break;
		    
		  
				
			
		}
		return f;
		      
		      
		   	
}
  void time_to_display_data_buff(void)
{ display_data_buff[0]=2;
  display_data_buff[1]=0;
  display_data_buff[2]=time.year/10;
  display_data_buff[3]=time.year%10;
  display_data_buff[4]=time.month/10;
  display_data_buff[5]=time.month%10;
  display_data_buff[6]=time.day/10;
  display_data_buff[7]=time.day%10;
  display_data_buff[8]=time.hour/10;
  display_data_buff[9]=time.hour%10;
  display_data_buff[10]=time.minute/10;
 display_data_buff[11]=time.minute%10;
 display_data_buff[12]=time.second/10;
 display_data_buff[13]=time.second%10;
 
 js_week();//计算星期
 
 display_data_buff[14]=time.week;
 
 dp_data_to_dp_code_buff();
 
}
  
void display2(void)
{
                ld_write(0x20);       //空格
				ld_write(display_code_buff[0]);
				ld_write(display_code_buff[1]);
				ld_write(display_code_buff[2]);
				ld_write(display_code_buff[3]);
				ld_write(0xb0);

				ld_write(display_code_buff[4]);
				ld_write(display_code_buff[5]);
				ld_write(0xb0);
				ld_write(display_code_buff[6]);
				ld_write(display_code_buff[7]);
                ld_write(0x3c);
				ld_write(display_code_buff[14]);

				ld_write(0x3e);

			    lc_write(0x40);
	   	        lc_write(0x14);
		        readbf();

				ld_write(display_code_buff[8]);
				ld_write(display_code_buff[9]);
				ld_write(0x3a);   //  “:”

				ld_write(display_code_buff[10]);
				ld_write(display_code_buff[11]);
				ld_write(0x3a);
				ld_write(display_code_buff[12]);
				ld_write(display_code_buff[13]);
			/*	if(clockon==1&time.hour==clock.hour&time.minute==clock.minute)
	   {
	   ld_write(0x20);
            ld_write(0x40);
			
        }*/
      
}




void display(void)
{
 
      time.second20++;
      if (time.second20==18)
          {
       time.second20=0;
       time.second++;
      if (time.second==60)
        {
     time.second=0;
     time.minute++;
     if (time.minute==60)
      {
       time.minute=0;
       time.hour++;
       if (time.hour==24)
        {
        time.hour=0;
		 time.day++; 
     	 
		 if(time.week==8)
           time.week=1;
           
           
         if(time.day==jinwei())
		  { 
	        time.day=1;
	        
		     time.month++;
		    
			 if(time.month==13)
			  { 
			  time.month=1;
			  time.year++;
			  
			  }
           }

       }

      }
    }

	delay(500);
       lc_write(0x01);
       time_to_display_data_buff();
	   
	   
	   delay(500);
	    display2();         
        	   



				




  }


   

}






void keyboard(void) interrupt 2 using 0          //键盘中断子程序
    { 
     unsigned char i,j,w;                     
     EX1=0;                                      //键盘中断关
     key=0;
     delay(200);                                 //延时去处抖动
	 XBYTE[0x0010];           //?????????%¥¥#¥¥
     if(~XBYTE[0xf800]&0x0f)                     //是否有键按下
         {
            w=XBYTE[0xf8f0]&0x0f;                //键植查询,key高4位为列信息,左列对应其中的低位,
              if(~w&0x0f)                        //key低4位对应行信息 ,即i值,键盘最上行为5,
                {
                  i=4;
                  j=w;
                  w=0xff;
                }   
            w=XBYTE[0xf8e8]&0x0f;
              if(~w&0x0f)
                {
                  i=3;
                  j=w;
                  w=0xff;
                }   
            w=XBYTE[0xf8d8]&0x0f;
              if(~w&0x0f)
                {
                  i=2;
                  j=w;
                  w=0xff;
                }   
            w=XBYTE[0xf8b8]&0x0f;
              if(~w&0x0f)
                {
                  i=1;
                  j=w;
                  w=0xff;
                }   
            w=XBYTE[0xf878]&0x0f;
              if(~w&0x0f)
                {
                  i=0;
                  j=w;
                  w=0xff;
                }    
              w=~j;
              key=(w<<4)|i;
         }
		 //-----编码键值左上起1--20---------键值编码,返回1到20的16进制数,
       switch (key)
      {
      case 0x14 :key=0x01;break;  //00010100
      case 0x24 :key=0x02;break;  //00100100
      case 0x44 :key=0x03;break;  //01000100
      case 0x84 :key=0x04;break;  //10000100
      case 0x13 :key=0x05;break;  //00010011
      case 0x23 :key=0x06;break;  //00100011
      case 0x43 :key=0x07;break;  //01000011
      case 0x83 :key=0x08;break;  //10000011
      case 0x12 :key=0x09;break;  //00010010
      case 0x22 :key=0x0a;break;  //00100010
      case 0x42 :key=0x0b;break;  //01000010
      case 0x82 :key=0x0c;break;  //10000010
      case 0x11 :key=0x0d;break;  //00010001
      case 0x21 :key=0x0e;break;  //00100001
      case 0x41 :key=0x0f;break;  //01000001
      case 0x81 :key=0x10;break;  //10000001
      case 0x10 :key=0x11;break;  //00010000
      case 0x20 :key=0x12;break;  //00100000
      case 0x40 :key=0x13;break;  //01000000
      case 0x80 :key=0x14;break;  //10000000
      default: key=0;

      }
      
       while(~XBYTE[0xf800]&0x0f)
	    k=1;
       EX1=1;
     

}   




void main(void)
{   
  int a;
  


	//XBYTE[0xf801];

	inttilcs();
	time.year=0;
	time.month=1;
	time.day=1;
	time.hour=0;
 time.minute=0;
 time.second=0;
 time.second20=0; 
 time.week=6;
//clockon=0;
//clock.hour=0;
//clock.minute=0;

 lc_write(0x0c);

	EA=1;

    EX1=1;

	k=0;
	
    a=0;
	while (1)

	{   
	   if(k)
	 { if(key==0x01)         //键盘1更改年+
	    {lc_write(0x01);
	
		lc_write(0x0f);
		time.year++;
		if (time.year>99 )
			time.year=0;
		
		
		k=0;a=1;
		delay(500);
		time_to_display_data_buff();

		 display2();   
      				       
		}
		
		
	else if(key==0x0d)         //键盘1更改年-
	    {lc_write(0x01);
	
		lc_write(0x0f);
		
		
		
		time.year--;
		
		if(time.year<=0)
		time.year=0;
		
		
		
		
		k=0;a=1;
		delay(500);
		time_to_display_data_buff();

		 display2();   
      				       
		}
	else if(key==0x02)         //键盘2更改月+
	    {lc_write(0x01);
		lc_write(0x0f);
		time.month++;
		
		if (time.day>=jinwei())
		
			time.day=1;
		
		if(time.month==13)
		time.month=1;
		


		k=0;a=1;
		delay(500);
		time_to_display_data_buff();
      
		display2();   
      
		
		
        
		}
		
		else if(key==0x0e)         //键盘2更改月-
	    {lc_write(0x01);
		lc_write(0x0f);
		time.month--;
		
		if (time.day>=jinwei())
		
			time.day=1;
		
		if(time.month==0)
		time.month=12;
		


		k=0;a=1;
		delay(500);
		time_to_display_data_buff();
      
		display2();   
      
		
		
        
		}
		else if(key==0x03)         //键盘3更改天+
	    {lc_write(0x01);
		lc_write(0x0f);
		time.day++;
		
		if (time.day==jinwei()) time.day=1;
		
		
		
		//jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
		
		
		
		k=0;a=1;
		delay(500);
		time_to_display_data_buff();
      
		  display2();   
		
        
		}
	 
	 	else if(key==0x0f)         //键盘3更改天-
	    {lc_write(0x01);
		lc_write(0x0f);
		time.day--;
		
		
		if (time.day<=0) time.day=jinwei()-1;
		
		
		k=0;a=1;
		delay(500);
		time_to_display_data_buff();
      
		  display2();   
		
        
		}
	else if(key==0x05)         //键盘5更改小时+
	    {lc_write(0x01);
	lc_write(0x0f);
		time.hour++;
		if(time.hour==24)
		time.hour=0;
		
		k=0;a=1;
		delay(500);
		time_to_display_data_buff();
      
	display2();   
      
		
		
        
		}
		
			else if(key==0x11)         //键盘5更改小时-
	    {lc_write(0x01);
	lc_write(0x0f);
		time.hour--;
		if(time.hour==-1)
		time.hour=23;
		
		k=0;a=1;
		delay(500);
		time_to_display_data_buff();
      
	display2();   
      
		
		
        
		}
	    
     else if(key==0x06)         //键盘6更改分钟+
	 {lc_write(0x01);
	 lc_write(0x0f);
	 time.minute++;
	 if(time.minute==60)
	 time.minute=0;
	 k=0;a=1;
	 delay(500);
	 time_to_display_data_buff();
      
		display2();   
      
	 
	 }
	 
	  else if(key==0x12)         //键盘6更改分钟-
	 {lc_write(0x01);
	 lc_write(0x0f);
	 time.minute--;
	 if(time.minute==-1)
	 time.minute=59;
	 k=0;a=1;
	 delay(500);
	 time_to_display_data_buff();
      
		display2();   
      
	 
	 }
	 else if(key==0x07)         //键盘7更改秒+
	 {lc_write(0x01);
	 lc_write(0x0f);
	 time.second++;
	 if(time.second==60)
	 time.second=0;
	 k=0;a=1;
	 delay(500);
	 time_to_display_data_buff();
      
		display2();   
      
	
	 
	 }
	 
	  else if(key==0x13)         //键盘7更改秒-
	 {lc_write(0x01);
	 lc_write(0x0f);
	 time.second--;
	 if(time.second==-1)
	 time.second=59;
	 k=0;a=1;
	 delay(500);
	 time_to_display_data_buff();
      
		display2();   
      
	
	 
	 }
	/* else if(key==0x04)         //键盘4更改星期
	 {lc_write(0x01);
	 lc_write(0x0f);
	 time.week++;
	 if(time.week==8)
	 time.week=1;
	 k=0;a=1;
	 delay(500);
	 time_to_display_data_buff();
      
		 display2();   
      
	
	 
	 }*/
	 else if(key==0x08)     //键盘8恢复时钟
	 {a=0;k=0;
	 lc_write(0x0c);
	
         }


/*
 else if (key==0x09) //键盘9闹钟开,小时+
		 {
		 lc_write(0x01);
	 lc_write(0x0f);
		 
		 
		 clockon=1;

		k=0;
		a=1;
		clock.hour++;
		if(clock.hour==24)
		clock.hour=0;
	
        
		 display_data_buff[0]=clock.hour/10;
  display_data_buff[1]=clock.hour%10;
  display_data_buff[2]=clock.minute/10;
  display_data_buff[3]=clock.minute%10;
display_code_buff[0]=display_code[display_data_buff[0]]; 
display_code_buff[1]=display_code[display_data_buff[1]]; 
display_code_buff[2]=display_code[display_data_buff[2]]; 
display_code_buff[3]=display_code[display_data_buff[3]]; 

   ld_write(0x20);  //空白
   lc_write(0x40);   //闹钟符号
  
				ld_write(display_code_buff[0]);
				ld_write(display_code_buff[1]);
                ld_write(0x3a);           //显示:
				ld_write(display_code_buff[2]);
				ld_write(display_code_buff[3]);

 }
    else if (key==0x0a) //键盘9闹钟开,分钟+
		 {
		 lc_write(0x01);
	 lc_write(0x0f);
		 
		 clockon=1;
		k=0;
		a=1;
		clock.minute++;
		if(clock.minute==60)
		clock.minute=0;
	
        
		 display_data_buff[0]=clock.hour/10;
  display_data_buff[1]=clock.hour%10;
  display_data_buff[2]=clock.minute/10;
  display_data_buff[3]=clock.minute%10;
display_code_buff[0]=display_code[display_data_buff[0]]; 
display_code_buff[1]=display_code[display_data_buff[1]]; 
display_code_buff[2]=display_code[display_data_buff[2]]; 
display_code_buff[3]=display_code[display_data_buff[3]]; 

   ld_write(0x20);  //空白
   lc_write(0x40);   //闹钟符号
  
				ld_write(display_code_buff[0]);
				ld_write(display_code_buff[1]);
                ld_write(0x3a);           //显示:
				ld_write(display_code_buff[2]);
				ld_write(display_code_buff[3]);

 }
  else if(key==0x0b)     //键盘11关闹钟
	 {a=1;k=0;clockon=0;
	 lc_write(0x01);
	 delay(500);
	 lc_write(0x0c);
	 ld_write(0x20);
	 ld_write(0x20);
	 ld_write(0x20);
	 ld_write(0x4f);
	 ld_write(0x46);
	 ld_write(0x46);

         }
	

*/




else {}
	}
    else if(a==0)            
	{
	
	
         TMOD=0X01;
          TR0=1;
              TH0=(65536-50000)/256;
              TL0=(65536-50000)%256;    //????
               do{}while(!TF0);
                display();
                  TF0=0;
	}
  else {}
   }
}


⌨️ 快捷键说明

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