📄 digitalclock.c
字号:
}
/*显示模式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 + -