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

📄 digitalclock.c

📁 主要使用12864液晶及DS1302,DS18B20完成的数字钟使多级菜单
💻 C
📖 第 1 页 / 共 5 页
字号:
}



/*显示模式1的界面*/
void dis_mode1(void)
{
  dis_date_mode1(); 
  dis_time_mode1();
  dis_temp_mode1();
}



/*篮球器时间显示*/
void nba_dis_time(void)
{
  uchar d,dis[2];
  for(d=2;d<4;d++)
  {
	dis[0]=char_num[resu[d]/10];
	dis[1]=char_num[resu[d]%10];
	display_cnasc(0x81+d*2,1,dis);
  }
  display_cnasc(0x86,1,": ");
  if(resu[0]==1)
  {
	dis[0]='\x07';
	dis[1]=char_num[resu[4]/10];
	display_cnasc(0x93,1,dis);
	dis[1]='\x07';
	dis[0]=char_num[resu[4]%10];
	display_cnasc(0x94,1,dis);
  }
}


/*=====================================================================================
 函数名称:键盘扫描
 功能描述:读取键盘操作数据及部分状态的实现
 全局变量:dis_sig  t0_isr  temprun  b20time  alm_run als_temp	 buzstop  als
           lock_op  nba_tim 
 参数说明:无
 返回说明:键盘锁与密码锁时间到达后返回 255
 设 计 人:LIJH
 版    本:1.0
 说    明:
 ======================================================================================*/

/*扫描键盘*/
uchar  keypad_scan()
{
  uchar key,dis[2];
  keyboard=0xf0;
  while (keyboard==0xf0)     // 等待按键按下
  {	 
 
  /*--------------------- 背光灯关闭延时 -----------------------*/
	
	delay(1000);	 			     
	if((++dis[0])==0&&bl_delay!=0) bl_delay--;  // 当有按键按下bl_delay重新赋值 	
	if(bl_delay==0&&!bl0) lcd_bl=close;         // 背光时间到且不是常开模式时关闭背光

	  
  /*----------------------- 键盘锁延时 -------------------------*/	

	if(keb&&dis_sig&&bl_delay==0&&resu[11]<2) resu[11]++; // 当有按键按下j清零
	if(bl_delay==0) bl_delay=15; 


  /*--------------------- 密码锁30秒锁延时 ---------------------*/		

	if(lock_op)				         
	{
	  if((++i)==0) save1++;	  	
	  if(save1==15) return(255);
	}
	

  /*---------------------- 时钟界面时间显示 ---------------------*/
	
	if(dis_sig&&t0_isr||nba_tim&&oth_run)     // 正常时钟界面与篮球器返回时钟界面显示
    {    
	  rds1302_date();	    // 读出日期 
      rds1302_time();		// 读出时间
	  if(di0) 	            // 模式2
	  {
	    dis_time_mode2(); 
		if(now.hour==0&&now.minute==0&&now.second==0)	dis_date_mode2(0x81); 
	  }
      else if(di1) 			// 模式3
	  { 
	    if(now.hour!=save_time.hour||now.minute!=save_time.minute)   // 时,分变化后显示
	      dis_mode3();	   
      }
      else 
	  {
	    dis_time_mode1();   // 模式1
	    if(now.hour==0&&now.minute==0&&now.second==0) dis_date_mode1();
	  }
	  save_time=now;        // 重新记录作下次比较
	  t0_isr=0;
	}
  
  
  /*-------------------- 温度计提示按键操作 ----------------------*/
  	
	if(temprun)
	{
	  if(!oth_run)
	  {
	    display_cnasc(0x96,2," key");    // 温度计时提示按键操作
		for(dis[1]=0;dis[1]<250;dis[1]++)
	    {
	      delay(1000);
		  if(keyboard!=0xf0)
		  {
		    keyboard=0x7f;
			if(keyboard==0x7d) return 0x7d;
			else  keyboard=0xf0;
		  }
	    }
		oth_run=1;
		display_cnasc(0x96,2,"    ");
	  }
	}
  
  
   /*------------------------ 蜂鸣器警报 --------------------------*/

	
	if(((alm_run&&alm)||thl_als)&&!buzstop)	// 温度,闹铃蜂鸣器警报
	{									    // 有按键按下时停止
	  if(now.second==0)	lcd_bl=close;
	  delay(15000);							// 读出温度时间比较
	  if(keyboard!=0xf0) break;
	  delay(15000);
	  if(keyboard!=0xf0) break;
	  delay(15000);
	  if(keyboard!=0xf0) break;
	  delay(15000);
	  if(alm_run)  lcd_bl=!lcd_bl;			// 只在闹铃功能闪
	  if(!als)buzzer=!buzzer;               // 警报开启后蜂鸣器开启			    
	} 


  /*----------------------- 温度刷新显示 -------------------------*/

  	
	if((temprun&&oth_run)||(b20time&&!di0&&!di1&&dis_sig))    // 温度计功能于模式1界面 
    {  
	 
	    ds18b20_func();					          // 温度检测功能
		oth_run=0;                          	  // 作交替标记用
	    if(temprun) return 20;		              // 温度计开启后返回
	    if(b20time){ dis_temp_mode1();b20time=0;} // 时钟界面5分钟更新一次,T0计时
    } 

  
   
   /*------------------------ 篮球器显示时间 ------------------------*/
	
	if(nba_tim&!oth_run)	    // 当篮球器模式下 oth_run==0为篮球器计时状态 
	{
	  if(EA) display_cnasc(0x8b,2," R\x10 ");  // 显示运行状态
	  else  display_cnasc(0x8b,2," S! ");
	  if(t0_isr)
	  {										   // 更新时间
	    nba_dis_time();
		if(resu[2]==0&&resu[3]==0)			   // 判断比赛情况 
		{
		  resu[6]++;
		  if(resu[6]<resu[1])  display_cnasc(0x85,3,"休息  ");
		  else  display_cnasc(0x85,3,"完结  ");
		}
		if(resu[4]==0||(resu[2]==0&&resu[3]==0))  // 时间到达警报
	    {
	       buzzer=open;
	       delay_pw();
		   if(resu[2]==0&&resu[3]==0)  // 24秒 总时间警报
		   {
		     delay_pw();
		   }
	       buzzer=close;
		   if(resu[4]==0) resu[4]=24;  // 重新赋值
	    }
	    t0_isr=0;					   // 清零等下次中断产生
	  }
	}
  }

			  
			        /*===== 以上等待按键 =====*/



  /*------------------------- 按键按下后 --------------------------*/

  
  delay(8000); 	             // 消抖振
  if(!lock_op)bl_delay=15;   // 背光时间赋值 
  if(bl1) lcd_bl=close;	     // 不在背光灯关闭时亮起
  else lcd_bl=open;
  if(alm_run|thl_als) {buzstop=1;buzzer=close;}
  if(keb&&dis_sig) 
  {
    if(resu[11]==2) return 255;  // 要求输入密码	
  	else resu[11]=0;			 // 时间不到时重新计时
  }
  do
  {    	
	for(dis[0]=0;dis[0]<=3;dis[0]++)
    {
      keyboard=ksp[dis[0]];
	  if(keyboard!=ksp[dis[0]])
      {	
        key=keyboard;
        if(key!=ksp[dis[0]]) return(key);
      }
    }
  }while(1);
} 
 

/*读键盘数据*/
uchar  gotkey()
{
  uchar  save,n;
  keyboard=0xf0;
  while(keyboard!=0xf0);    // 等待键盘松开
  delay(5000);	            // 消抖阵
  if(adju_si) 	            // 连写输入
  {
	adju_si=0;
	for(n=0;n<60;n++)
  	{
	  delay(2000);
	  if(keyboard!=0xf0)
	  { 
	    adju_si=1;          // 在更改时,在此时间内可连成多位数
 	    break;
	  }
    }
  }			
  save=keypad_scan();	    // 扫描键盘
  if(save==255)	return 255;	// 要求输入键盘锁密码或延时时间到达
  for (n=0;n<16;n++)
  {  
	if(save==key_code[n]) 
	   return(n);
  }
  return(20);
}



/*=====================================================================================
 函数名称:导航
 功能描述:主菜单 工具导航  保存提示
 全局变量:无
 参数说明:
 返回说明:无
 设 计 人:LIJH
 版    本:1.0
 说    明:
 ======================================================================================*/


/*按键按下显示 参数格式:k 按钮的显示地址*/
void key_dis(uchar k)
{
  display_cnasc(k,1,"\x04 ");
  delay(10000);
  if(k==0x92||k==0x96) display_cnasc(k,1,"\x1e ");
  else display_cnasc(k,1,"\x1f ");
}



/*确定按键按下显示*/
void enter_dis(void)
{
  display_cnasc(0x8f,1," \x09");
  delay(15000);
}



/*主菜单导航*/
uchar dis_menu(void)
{
  uchar d,save,key;
  if(meu)
  {  
    display_cnasc(0x81,2,"菜单");
	dis_title();
	display_cnasc(0x88,8,selected[0]);
	con_disp(0xff,0xff,0x8a,0x80,5,16);
  } 
  else	  // 显示图片菜单
  {
    dis_title_pic();
	for(d=0;d<6;d++)  
      anti_nor_pic(0,d);
	anti_nor_pic(1,0);
  }      
  save=d=0;
  do
  {
	if(meu)	  // 操作指示更新
	{	  
	  display_cnasc(0x93,3,menu_cn_2[index_m[save].left_num]);
	  display_cnasc(0x8b,3,menu_cn_2[save]);
	  display_cnasc(0x9b,3,menu_cn_2[index_m[save].right_num]); 
    }
	else
	{
	  anti_nor_pic(0,d);     
	  anti_nor_pic(1,save);
	}
	d=save;			      // 保存上一索引
	while(1)
	{
	  key=gotkey();
	  if(key==11||(key==3&&meu))
	  { 
	    if(meu) enter_dis();
		break;
	  }
	  else if(meu)
	  { 
	    if(key==2)
		{
		  save=index_m[d].right_num;
		  key_dis(0x9a);
		  break;
		}
	    if(key==5)
		{
		  save=index_m[d].left_num;
		  key_dis(0x92);
		  break;
		}
		if((key==1&&meu))
	    {
	      d=5;
		  break;
	    } 
	  }
	  else 
	  {
	    if(key==3){save=index_m[d].right_num; break;} // 根据导航键寻找索引
	    if(key==1){save=index_m[d].left_num; break;}
		if(key==2||key==5){save=index_m[d].shaft_num; break;}  
      }
	}
	if(key==11||((key==1|key==3)&&meu)) break;
  }while(1);
  return d;
}



/*工具导航*/
uchar tool_func(void)
{
  uchar save,d,key;
  display_cnasc(0x81,2,"工具");
  dis_title();
  display_cnasc(0x88,8,selected[0]);
  con_disp(0xff,0xff,0x8a,0x80,5,16); 
  d=0;
  save=0;
  do
  {	  
	display_cnasc(0x93,3,tool_menu[index_t[save].lnum]);
	display_cnasc(0x8b,3,tool_menu[save]);
	display_cnasc(0x9b,3,tool_menu[index_t[save].rnum]); 
	d=save;
	while(1)
	{
	  key=gotkey();
	  if(key==1){ d=4;break;}				// 根据按键寻找索引
	  if(key==11||key==3){enter_dis();break;}
	  if(key==2){save=index_t[d].rnum; key_dis(0x9a);break;}
	  if(key==5){save=index_t[d].lnum; key_dis(0x92);break;}
    }
	if(key==11||key==3||key==1) break;
  }while(1);
  return d;
}




/*更改后提示保存*/
void save_y_or_n(void)
{
  uchar key;
  clear_dis();
  oth_run=0;	  
  display_cnasc(0x92,5,"是否保存? ");
  display_cnasc(0x89,6,"Y(OK)\\N(./S)");
  while(1)
  {
	key=gotkey();
	if(key==11) 
	{
	  display_cnasc(0x9a,5,"保存成功! ");
	  delay(50000);
	  oth_run=1;	 // 要求保存时oth_run标记为1
	  return;
	}
	if(key==10) return;
  }
} 


/*=====================================================================================
 函数名称:调整功能
 功能描述:时间日期调整
 全局变量:today  now
 参数说明:见函数
 返回说明:无
 设 计 人:LIJH
 版    本:1.0
 说    明:
 ======================================================================================*/

⌨️ 快捷键说明

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