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

📄 key_contrl.h

📁 本产品是由c语言开发的万年历本产品是由c语言开发的万年历
💻 H
字号:
//==========================================================
//作    者: 雨枭风
//联系QQ:401386501
//您下载的资料属于电子前沿原创,转载请注明出处
//关于此程序您有任何问题可到http://www.e-fad.com.cn/留言
//==========================================================
#ifndef _key_contrl_
#define _key_contrl_
#include "commmon.h"
#include "ds1302.h"
#include "lcd1602.h"	
/**********************************函数声明*************************************/
//void Scan_Key(void);
void id_case1_key();
void Set_id(unsigned char ,unsigned char);
char daymax(char nian,char yue);	//根据年月计算该月天数的最大值

/*键盘检测函数,该函数不检测+,-键*/
void Scan_Key(void)				      	
{   /*先检测显示模式键*/
	if(!SET_DISP)delay_LCM(10);		   //防止干扰
	   if(!SET_DISP)
	      {	
		  while(!SET_DISP)display();
	      disp_mode=~disp_mode;	      //显示方式置换;
		   }
/*检测设置位选键*/
	if(!SET_MODE)delay_LCM(10);		   //防止干扰
	if(!SET_MODE)	 				
		{
			while(!SET_MODE)display();	//等待按键释放,如一直按下一直调用显示函数,防止显示中断
			re_disp=0;					//清除记数,重新开始10s定时
		if(!disp_mode)				
			 id++;if(id>9)id=0;		    //id加1,后面根据id值对应调整项目	调9项
		else   id_1++;if(id_1>4)id_1=0; //调3项     		
		}

    if(!disp_mode)
	  {	//调整年月日时分秒等
	   id_1=0;
	   if(id==0){bit_hour=0;bit_minute=0;bit_second=0; 
	             bit_day=0;bit_month=0;bit_year=0;
	             bit_week=0;bit_n_zh=0;bit_z_d=0;}	    //根据id值跳到相应处理函数
	   if(id==1){bit_hour=1;id_case1_key();}		//id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,下同
	   if(id==2){bit_hour=0;bit_minute=1;id_case1_key();}
	   if(id==3){bit_minute=0;bit_second=1;id_case1_key();}
	   if(id==4){bit_second=0;bit_week=1;id_case1_key();}
	   if(id==5){bit_week=0;bit_year=1;id_case1_key();}
	   if(id==6){bit_year=0;bit_month=1;id_case1_key();}
	   if(id==7){bit_month=0;bit_day=1;id_case1_key();}
	   if(id==8){bit_day=0;bit_n_zh=1;id_case1_key();}
	   if(id==9){bit_n_zh=0;bit_z_d=1;id_case1_key();}
 	  }
	else
	  {// 设置闹钟
	   id=0;
	   if(id_1==0){bit_clock_hour=0;bit_clock_minute=0;bit_clock_second=0;bit_clock_contrl=0;}	//根据id值跳到相应处理函数
	   if(id_1==1){bit_clock_hour=1;id_case1_key();}		//id为1,选择调整年位,闪烁标志位置1,然后跳到键盘处理函数,
	   if(id_1==2){bit_clock_hour=0;bit_clock_minute=1;id_case1_key();}		 //选择调整时位
	   if(id_1==3){bit_clock_minute=0;bit_clock_second=1;id_case1_key();}		 //选择调整分位
	   if(id_1==4){bit_clock_second=0;bit_clock_contrl=1;id_case1_key();}
	  }
}
/******键盘处理函数,只有按下SET_MODE键时才会进入*******/
void id_case1_key(void)					
{
	display();
	 /*检测减少键*/
	if(!DOWN)delay_LCM(10);		            //防止干扰		10ms						
  	if (!DOWN) //减少
      	{
       		while(!DOWN)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
			re_disp=0;						//清除记数,重新开始10s定时
			if(!disp_mode)					
	   		Set_id(id,0);					//时分秒-
			else Set_id(id_1,0); 			//年月日-
      	}
	 /*检测减少键*/
	if(!UP)delay_LCM(10);		               //防止干扰		
   	if (!UP)  //增加
      	{
       		while(!UP)display();
			re_disp=0;
			if(!disp_mode)
	   		Set_id(id,1); 				 //时分秒+
			else Set_id(id_1,1);   		 //年月日+
      	}
}

/***********根据选择调整相应项目并写入DS1302*********/
void Set_id(unsigned char sel,unsigned char sel_1)		//执行调整项目的函数
{			 //           
  	signed char max,mini,address,item;
	unsigned char month1[]={00,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年	 十进制表示
    unsigned char month2[]={00,31,28,31,30,31,30,31,31,30,31,30,31}; //平年
	int year_now,month_now;//存放当前的年,月
 if(!disp_mode)
    {  if(sel<8)					
	   {if(sel==1)  {address=hou; max=23;mini=0;}    //小时	//根据id值确定要调整的项,并确定调整上下限,下同
	    if(sel==2)  {address=min; max=59;mini=0;}    //分钟
  	    if(sel==3)  {address=sec; max=59;mini=0;}     //秒
	    if(sel==4)  {address=week; max=7;mini=1;}
	    if(sel==5)  {address=year; max=99;mini=0;}
	    if(sel==6)  {address=month; max=12;mini=0;}
	    if(sel==7)  {address=day; 
	    year_now=Read1302(year|read)/16*10+Read1302(year|read)%16; 
	    month_now=Read1302(month|read)/16*10+Read1302(month|read)%16;
	    max=daymax(year_now,month_now);mini=0;}
  	    item=Read1302(address|read)/16*10+Read1302(address|read)%16;	//从相应的地址读取当前数据并转换为十进制
  	    if (sel_1==0) item--;  else item++;					//确定是对项目加还是减,并对越限处理,sel_1为0则为减
 	    if(item>max) item=mini;   
  	    if(item<mini) item=max;
	    Write1302(0x8e,0x00);//允许写操作	
  	    Write1302(address,item/10*16+item%10);							//将调整结果转换成压缩BCD码重新写入1302
  	    Write1302(0x8e,0x80);//写保护,禁止写操作
	    }
	else
	    {if(sel==8)  {address=clock;}
	     if(sel==9)  {address=_zd; }
	     item=Read1302(address|read);
	     if(item==0x54)item=0x46;else item=0x54;	 
		                //T->F           F->T
	     Write1302(0x8e,0x00);Write1302(address,item);Write1302(0x8e,0x80);}
	}
 else 
    {if(sel<=3)
	 {if(sel==1)  {address=clock_hour; max=23;mini=0;}    //闹钟时	//根据id值确定要调整的项,并确定调整上下限,下同
	 if(sel==2)  {address=clock_min; max=59;mini=0;}    
  	 if(sel==3)  {address=clock_sec; max=59;mini=0;}   
  	 item=Read1302(address|read)/16*10+Read1302(address|read)%16;	//从相应的地址读取当前数据并转换为十进制
  	 if (sel_1==0) item--;  else item++;								//确定是对项目加还是减,并对越限处理
 	 if(item>max) item=mini;   
  	if(item<mini) item=max;
	Write1302(0x8e,0x00);//允许写操作
	Write1302(address,item/10*16+item%10);							//将调整结果转换成压缩BCD码重新写入1302
  	Write1302(0x8e,0x80);//写保护,禁止写操作
	} else 
	   {if(sel==4)  {address=clock_key;}
	    
	     item=Read1302(address|read);
	     if(item==0x4F)item=0x52;else item=0x4F;	 
		                //o->r           r->o
	     Write1302(0x8e,0x00);Write1302(address,item);Write1302(0x8e,0x80);}
}}	
/*根据年月计算该月天数的最大值*/
char daymax(char nian,char yue)	 			
{ char i_year=2000+nian,i_month=yue,temp;
  unsigned char month2[]={00,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
  unsigned char month1[]={00,31,28,31,30,31,30,31,31,30,31,30,31}; //平年

if((i_year %4==0 && i_year %100!=0) || (i_year %400==0))
   { switch(i_month)			 //闰年
	{
        case 1: temp=month2[1];break;
        case 2: temp=month2[2];break;
        case 3: temp=month2[3];break; 
        case 4: temp=month2[4];break; 
        case 5: temp=month2[5];break;
        case 6: temp=month2[6];break; 
        case 7: temp=month2[7];break; 
        case 8: temp=month2[8];break; 
        case 9: temp=month2[9]; break;
        case 10: temp=month2[10];break; 
        case 11: temp=month2[11]; break; 
        case 12: temp=month2[12]; break;
      } 
    }
 else 
   {switch(i_month)			//平年
	   {
        case 1: temp= month1[1];break;
        case 2: temp= month1[2];break;
        case 3: temp= month1[3];break; 
        case 4: temp= month1[4];break;
        case 5: temp= month1[5];break;
        case 6: temp= month1[6];break;
        case 7: temp= month1[7];break;
        case 8: temp= month1[8];break;
        case 9: temp= month1[9];break;
        case 10: temp=month1[10];break;
        case 11: temp=month1[11];break; 
        case 12: temp=month1[12];break;
      } 
  }
  return (temp);
}
#endif

⌨️ 快捷键说明

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