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

📄 quan.c

📁 用单片机做的数字电子钟
💻 C
📖 第 1 页 / 共 4 页
字号:

void Init_T0(void)
 { 
  TMOD=0x01;            //定时器T0,工作模式1//
  TH0=0x3c;             //50ms//
  TL0=0xb0;
  EA=1; 
  ET0=1;
  TR0=1;
 }
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   闪烁信号产生子函数           //////
///// 函数功能: 用定时中断方式产生闪烁信号   //////
///// 调用:     无                           //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void T0_flash(void) interrupt 1          // 中断程序,产生时钟秒信号 //
 {
  TR0=0;          
  fla_cou++;
  if(fla_cou==10)             //闪烁间隔为50ms*10次=500ms//
   {
    flash=!flash;
    fla_cou=0;
   }
  TH0=0x3c;             //50ms//
  TL0=0xb0;
  TR0=1;
 }
/**************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   时间闪烁子函数               //////
///// 函数功能: 选择确定闪烁位等待调整       //////
///// 调用:     Add();                       //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void FlashKey(void)             //闪烁子函数//
{
 if(P2_5==0)
  {
   while(P2_5==0)
    Refresh();
   n++;                        
  }                            
 if(n==8)  n=0;                         
 if(n!=1)  K1=1;
 if(n!=2)  K2=1;
 if(n!=3)  K3=1;                      
 if(n!=4)  K4=1;
 if(n!=5)  K5=1;
 if(n!=6)  K6=1;                      
 if(n!=7)  K7=1;
 switch(n)
  {
   case 0:KT=0;break;
   case 1:K1=flash;hms=year;KT=1;break;        //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中//
   case 2:K2=flash;hms=month;KT=1;break;
   case 3:K3=flash;hms=date;KT=1;break;
   case 4:K4=flash;hms=hour;KT=1;break;
   case 5:K5=flash;hms=min;KT=1;break;
   case 6:K6=flash;hms=sec;KT=1;break;
   case 7:K7=flash;hms=day;KT=1;break;
  }
 tiaoshi();
} 
/*********************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   时间调整子函数               //////
///// 函数功能: 对闪烁位进行调整(加减一)       //////
///// 调用:     SetTime();Refresh();         //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void tiaoshi(void)                        //调时子函数//
 {
  signed char item,max,mini;
  unsigned char ye;
  item=(hms/16)*10+hms%16;
  ye=(year/16)*10+year%16;
  if(P2_6==0)                           //按P2_6键进行时间加调整//
   {
    while(P2_6==0)
      Refresh();
    if(KT==1)                           //检验可调标志位KT//
	{
      item++;	
	  if(n==1) {max=99; mini=0;}                //根据n不同,返回给不同的位: n=1  ->  返回给年位//
	  if(n==2) {max=12; mini=1;}				  // 							n=2  ->  返回给月位//
      if((n==3)&(ye%4))  {max=28; mini=1;}	  //不闰年2月28天               依次类推		   //
	  if(!(ye%4)&(n==3)) {max=29; mini=1;}      //  闰年2月29天				  		  
	  if((n==3)&((month==0x01)|(month==0x03)|(month==0x05)|(month==0x07)|(month==0x08)|(month==0x10)|(month==0x12)))
	    {max=31; mini=1;}				      //1,3,5,7,8,10,12月31天
      if((n==3)&((month==0x04)|(month==0x06)|(month==0x09)|(month==0x11)))
	    {max=30; mini=1;}					  //4,6,9,11月满30天
      if(n==4) {max=23; mini=0;}                // 24小时制 //
      if(n==5) {max=59; mini=0;}               
      if(n==6) {max=59; mini=0;} 
      if(n==7) {max=7;  mini=1;}
	  if(item>max)
	    item=mini;
  hms=(item/10)*16+item%10;
     switch(n)
     {
        case 1:year=hms;break;           //根据n不同,返回给不同的位: n=1  ->  返回给年位  //
        case 2:month=hms;break;          // 						   n=2  ->  返回给月位  //
        case 3:date=hms;break;           //                            n=3  ->  返回给日位  //
        case 4:hour=hms;break;           //                            n=4  ->  返回给小时位//
        case 5:min=hms;break;            //                            依次类推             //
		case 6:sec=hms;break;
		case 7:day=hms;break;
	  }
      Curtime[0] = sec;
      Curtime[1] = min;
      Curtime[2] = hour;
	  Curtime[3] = date;
	  Curtime[4] = month;
      Curtime[5] = day;
	  Curtime[6] = year;
      SetTime(&Curtime[0]);         // 将调整过后的时间值写入DS1302 //
     }
	}
	if(P2_7==0)            //按P2_7键进行时间减调整//
   {
    while(P2_7==0)
      Refresh();
    if(KT==1)                           //检验可调标志位KT//
	{
      item--;	
	  if(n==1) {max=99; mini=0;}                //根据n不同,返回给不同的位: n=1  ->  返回给年位//
	  if(n==2) {max=12; mini=1;}				  // 							n=2  ->  返回给月位//
      if((n==3)&(ye%4))  {max=28; mini=1;}	  //不闰年2月28天               依次类推		   //
	  if(!(ye%4)&(n==3)) {max=29; mini=1;}      //  闰年2月29天				  		  
	  if((n==3)&((month==0x01)|(month==0x03)|(month==0x05)|(month==0x07)|(month==0x08)|(month==0x10)|(month==0x12)))
	    {max=31; mini=1;}				      //1,3,5,7,8,10,12月31天
      if((n==3)&((month==0x04)|(month==0x06)|(month==0x09)|(month==0x11)))
	    {max=30; mini=1;}					  //4,6,9,11月满30天
      if(n==4) {max=23; mini=0;}                // 24小时制 //
      if(n==5) {max=59; mini=0;}               
      if(n==6) {max=59; mini=0;} 
      if(n==7) {max=7;  mini=1;}	  
	  if(item<mini)
	    item=max;
  hms=(item/10)*16+item%10;
     switch(n)
     {
        case 1:year=hms;break;           //根据n不同,返回给不同的位: n=1  ->  返回给年位  //
        case 2:month=hms;break;          // 						   n=2  ->  返回给月位  //
        case 3:date=hms;break;           //                            n=3  ->  返回给日位  //
        case 4:hour=hms;break;           //                            n=4  ->  返回给小时位//
        case 5:min=hms;break;            //                            依次类推             //
		case 6:sec=hms;break;
		case 7:day=hms;break;
	  }
      Curtime[0] = sec;
      Curtime[1] = min;
      Curtime[2] = hour;
	  Curtime[3] = date;
	  Curtime[4] = month;
      Curtime[5] = day;
	  Curtime[6] = year;
      SetTime(&Curtime[0]);         // 将调整过后的时间值写入DS1302 //
     }
	}
   }
   
/********************************************************************************************************/
/*******************************************************************************************************/
////////////////////////////////////////////////////
///// 函数名:   时钟初始化子函数             //////
///// 函数功能: 对所有时钟程序变量初始化     //////
///// 调用:     Init_T0();                   //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 

void Init_Clock(void)
 {
  K1=1; K2=1; K3=1; K4=1; K5=1;
  K6=1; K7=1; KT=0; n=0;
  Init_T0();
 }
/*******************************************************************************************///时钟部分// ↑ 
////////////////////////////////////////////////////
///// 函数名:   刷新显示子函数               //////
///// 函数功能: 即时刷新时钟数据进行显示     //////
///// 调用:  InputCommand();DisplayChar();   //////
///// 函数参数: 无                           //////
///// 返回值:   无                           //////
//////////////////////////////////////////////////// 
void Refresh(void)
 {
  unsigned int t;
  GetTime();
  CS1=1;CS2=0; 
    if(K2)
   { sz_disp16(2,8,shuzi[month&0x0f]);       // 月份位 //
     sz_disp16(2,0,shuzi[month>>4]);  }
  else
   { hz_disp16(2,0,kongbai2); }	
  if(K3)
   { sz_disp16(2,40,shuzi[date&0x0f]);       // 日期位 //
     sz_disp16(2,32,shuzi[date>>4]);  }
  else
   { hz_disp16(2,32,kongbai2); }  
  if(K4)
   { sz_disp16(4,8,shuzi[hour&0x0f]);       // 小时位 //
     sz_disp16(4,0,shuzi[hour>>4]); }     // 十时位 //
  else
   { hz_disp16(4,0,kongbai2); }
	
    if(K5)
   { sz_disp16(4,32,shuzi[min&0x0f]);        // 分钟位 //
     sz_disp16(4,24,shuzi[min>>4]); }        // 十分位 //
  else
   { hz_disp16(4,24,kongbai2); }

   if(K6)									 // 秒位  十秒位 //
   { sz_disp16(4,56,shuzi[sec&0x0f]);       // 秒位 //
     sz_disp16(4,48,shuzi[sec>>4]); }       // 十秒位 //
  else
   { hz_disp16(4,48,kongbai2); } 


  CS1=0;CS2=1;
  if(K1)
   { sz_disp16(0,8,shuzi[year&0x0f]);       // 年份位 //
     sz_disp16(0,0,shuzi[year>>4]);  }
  else
   { hz_disp16(0,0,kongbai2); } 
   if(K7)
   { hz_disp16(2,48,xingqi[(day&0x0f)-1]); }
  else
   { hz_disp16(2,48,kongbai2); }
  t=ReadTemperature();
  sz_disp16(4,16,shuzi[(t/100)]);
  sz_disp16(4,24,shuzi[((t%100)/10)]);
  sz_disp16(4,40,shuzi[(t%10)]); 
 } 
/*-----------------------------状态判断于提示------------------------*/
void State(void)
 {   
  if(KT==1)
   { 
     CS1=1;CS2=0;
     hz_disp16(6,0,she);
	 hz_disp16(6,16,ding);
	 if(n==1)
	 {
	 hz_disp16(6,32,kongbai2);
	 hz_disp16(6,48,nian);
	 }				  
	 if(n==2)
	 {
	 hz_disp16(6,48,yue);
	 }
	 if(n==3)
	 {
	 hz_disp16(6,48,xq7);
	 }
	 if(n==4)
	 {
	 hz_disp16(6,48,shi);
	 }
	 if(n==5)
	 {
	 hz_disp16(6,48,fen);
	 }
	 if(n==6)
	 {
	 hz_disp16(6,48,miao);
	 }
	 if(n==7)
	 {
	 hz_disp16(6,32,xing);
	 hz_disp16(6,48,qi);
	 }
	 CS1=0;CS2=1;
	 hz_disp16(6,0,kongbai2);
	 hz_disp16(6,32,kongbai2);
	 hz_disp16(6,16,jia);
	 hz_disp16(6,48,jian);	 
   }
  else
   {
      days();
	}
 } 
/*------------------------------主函数---------------------------------*/

main()
 {
  Init_Clock() ;
  init_lcd();
  Disp_Img(FirstPage);
  delays(1000);
  delays(1000);
  Clr_Scr();
  StartMsg();
  delays(1000);
  delays(1000);
  Clr_Scr();
  ClockMsg();
  while(1)
   {
    Refresh();
    FlashKey();
	State();
	delays(80);                 
   } 
 }

⌨️ 快捷键说明

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