📄 key_contrl.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 + -