?? 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 + -