標(biāo)題:
單片機(jī)密碼鎖程序
[打印本頁]
作者:
SAKURA6
時間:
2019-2-4 07:15
標(biāo)題:
單片機(jī)密碼鎖程序
/*
此文件中將來自O(shè)LED_Fuction.c中的顯示函數(shù)按程序狀態(tài)封裝,調(diào)用時更新特定顯示
*/
#include"OLED_Fuction.c"
#include"RFID_Fuction.c"
#include"BMP180_Fuction.c"
extern unsigned char display_hour[];
extern unsigned char display_minute[];
extern unsigned char display_month[];
extern unsigned char display_day[];
extern unsigned char display_year[];
extern unsigned char display_second[];
extern unsigned char display_week;
extern unsigned char Space_State[4];
extern long BMP180_Temperature;
extern long BMP180_Pressure;
extern unsigned char choose;
extern unsigned char first_num;
extern bit User_Locker;
extern bit Admin_Info;
extern bit En_Fire_Sensor;
extern bit En_RFID;
void OLED_Admin_RFID_Manage(void);
void delay2(unsigned int cnt)//調(diào)用該函數(shù)進(jìn)行一段時間的延時
{
while(cnt--);
}
/*####################################################用戶狀態(tài)函數(shù)##############################################*/
void OLED_Display_Standby()//待機(jī)狀態(tài),顯示定時器0獲取的時間或通知已鎖信息
{
unsigned char i;
OLED_Show_CHinese(0,CCTitle1,1);//顯示標(biāo)題:當(dāng)前已鎖
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar3,1);//顯示橫線
}
OLED_Show_Number(8,4,display_year,4,1);
OLED_Show_cChar(40,4,cChar1,1);//年
OLED_Show_Number(56,4,display_month,2,1);
OLED_Show_cChar(72,4,cChar2,1);//月
OLED_Show_Number(88,4,display_day,2,1);
OLED_Show_cChar(104,4,cChar3,1);//日
OLED_Show_Number(32,6,display_hour,2,1);
OLED_Show_sChar(48,6,sChar2,1);//:
OLED_Show_Number(56,6,display_minute,2,1);
OLED_Show_sChar(72,6,sChar2,1);//:
OLED_Show_Number(80,6,display_second,2,1);
}
void OLED_Display_Put_In_Password()//用戶模式下輸入密碼的靜態(tài)顯示
{
unsigned char i;
OLED_Show_CHinese(0,CCTitle1,1);//顯示標(biāo)題:當(dāng)前已鎖
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
}
OLED_Show_CHinese(4,CCInfo1,1);//顯示說明文字:請輸入密碼:
}
void OLED_Display_Right_Password()//用戶模式下輸入密碼正確的靜態(tài)提示信息
{
unsigned char i;
OLED_Show_CHinese(0,CCTitle3,1);//顯示標(biāo)題:密碼正確
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
}
OLED_Show_CHinese(6,CCInfo6,1);//顯示說明文字:繼電器已啟用
}
void OLED_User_Mode()//用戶模式菜單動態(tài)顯示,因?yàn)槿萘啃∮诘扔?個,一屏可以放得下,所以不加滾屏功能,僅在兩個選項(xiàng)中跳動
{
OLED_Show_CHinese(0,CCTitle4,0);//顯示標(biāo)題:用戶模式
switch(choose)
{
case 1:OLED_Show_CHinese(2,CCList_user_1,0);OLED_Show_CHinese(4,CCList_user_2,1);break;
case 2:OLED_Show_CHinese(2,CCList_user_1,1);OLED_Show_CHinese(4,CCList_user_2,0);break;
}
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose--;
if(choose==0)choose=1;//選項(xiàng)最少不能小于1
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose++;
if(choose==3)choose=2;//選項(xiàng)最大不能大于2
}
while(!KEY4);
}
}
/*######################################################管理員狀態(tài)函數(shù)############################################*/
void OLED_Display_Administrator_Onload()//管理員登入靜態(tài)顯示
{
unsigned char i;
OLED_Show_CHinese(0,CCTitle5,1);//顯示標(biāo)題:管理模式
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar5,1);//顯示橫線
}
OLED_Show_CHinese(4,CCInfo3,1);//顯示說明文字:請輸入口令:
}
void OLED_Display_Menu(unsigned char menu_num,unsigned char choose)
{//定制的菜單顯示接口函數(shù),用于將菜單變量名和調(diào)用它的變量值連接起來,需要知道顯示的起始菜單號和當(dāng)前選中的菜單
switch(menu_num)
{
case 1:
OLED_Show_CHinese(2,CCList_admin_1,!(choose==1));
OLED_Show_CHinese(4,CCList_admin_2,!(choose==2));
OLED_Show_CHinese(6,CCList_admin_3,!(choose==3));
break;
case 2:
OLED_Show_CHinese(2,CCList_admin_2,!(choose==2));
OLED_Show_CHinese(4,CCList_admin_3,!(choose==3));
OLED_Show_CHinese(6,CCList_admin_4,!(choose==4));
break;
case 3:
OLED_Show_CHinese(2,CCList_admin_3,!(choose==3));
OLED_Show_CHinese(4,CCList_admin_4,!(choose==4));
OLED_Show_CHinese(6,CCList_admin_5,!(choose==5));
break;
case 4:
OLED_Show_CHinese(2,CCList_admin_4,!(choose==4));
OLED_Show_CHinese(4,CCList_admin_5,!(choose==5));
OLED_Show_CHinese(6,CCList_admin_6,!(choose==6));
break;
case 5:
OLED_Show_CHinese(2,CCList_admin_5,!(choose==5));
OLED_Show_CHinese(4,CCList_admin_6,!(choose==6));
OLED_Show_CHinese(6,CCList_admin_7,!(choose==7));
break;
case 6:
OLED_Show_CHinese(2,CCList_admin_6,!(choose==6));
OLED_Show_CHinese(4,CCList_admin_7,!(choose==7));
OLED_Show_CHinese(6,CCList_admin_8,!(choose==8));
break;
case 7:
OLED_Show_CHinese(2,CCList_admin_7,!(choose==7));
OLED_Show_CHinese(4,CCList_admin_8,!(choose==8));
OLED_Show_CHinese(6,CCList_admin_9,!(choose==9));
break;
}
}
void OLED_Admin_Mode()//管理模式菜單動態(tài)顯示
{
//static unsigned char first_num=1;//第一項(xiàng)菜單標(biāo)號
OLED_Show_CHinese(0,CCTitle5,0);//顯示標(biāo)題:管理模式
OLED_Display_Menu(first_num,choose);//根據(jù)first_num和choose的動態(tài)刷新顯示函數(shù)
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose--;
if(choose==0)choose=1;//選項(xiàng)最少不能小于1
if(choose<first_num)first_num--;
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose++;
if(choose==10)choose=9;//選項(xiàng)最大不能大于9
if(choose>first_num+2)first_num++;
}
while(!KEY4);
}
}
void OLED_Admin_onoff_Mode()//常開常關(guān)選項(xiàng),因?yàn)槿萘啃∮诘扔?個,一屏可以放得下,所以不加滾屏功能,僅在兩個選項(xiàng)中跳動
{
unsigned char choose_possition;//用于存放進(jìn)入此級菜單時上一級choose的值
choose_possition=choose;
OLED_Clear();
OLED_Show_CHinese(0,CCTitle9,0);//顯示標(biāo)題:開關(guān)選項(xiàng)
while(!KEY1);//等待按鍵松開
choose=1;
while(1)
{
switch(choose)
{
case 1:OLED_Show_CHinese(2,CCList_onoff_1,0);OLED_Show_CHinese(4,CCList_onoff_2,1);break;
case 2:OLED_Show_CHinese(2,CCList_onoff_1,1);OLED_Show_CHinese(4,CCList_onoff_2,0);break;
}
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
switch(choose)
{
case 1:
JDQ=0;//開啟繼電器,由于繼電器所在接口的位定義不再此文件中,故直接使用單片機(jī)頭文件中的IO口定義
User_Locker=1;//用戶鎖定
Admin_Info=1;//管理員開鎖通知開,該提示信息在用戶代碼處修改
break;
case 2:
JDQ=1;//開啟繼電器,由于繼電器所在接口的位定義不再此文件中,故直接使用單片機(jī)頭文件中的IO口定義
User_Locker=0;//用戶解鎖
Admin_Info=0;//管理員開鎖通知關(guān),該提示信息在用戶代碼處修改
break;
}
}
while(!KEY1);
OLED_Clear();
goto OUT2;
}
if(KEY2==0)//取消按鍵
{
delay2(5000);
if(KEY2==0)
{
choose=1;//重置菜單選擇位
}
while(!KEY2);
OLED_Clear();
goto OUT2;
}
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose--;
if(choose==0)choose=1;//選項(xiàng)最少不能小于1
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose++;
if(choose==3)choose=2;//選項(xiàng)最大不能大于2
}
while(!KEY4);
}
}
OUT2:choose=choose_possition;//將之前存儲的值還給choose以保證上級菜單不出現(xiàn)錯亂
}
void OLED_Admin_firesensor_Mode()//火焰探測器開關(guān)選項(xiàng),因?yàn)槿萘啃∮诘扔?個,一屏可以放得下,所以不加滾屏功能,僅在兩個選項(xiàng)中跳動
{
unsigned char choose_possition;//用于存放進(jìn)入此級菜單時上一級choose的值
choose_possition=choose;
OLED_Clear();
OLED_Show_CHinese(0,CCTitle11,0);//顯示標(biāo)題:火焰探測
while(!KEY1);//等待按鍵松開
choose=1;
while(1)
{
switch(choose)
{
case 1:OLED_Show_CHinese(2,CCList_firesensor_1,0);OLED_Show_CHinese(4,CCList_firesensor_2,1);break;
case 2:OLED_Show_CHinese(2,CCList_firesensor_1,1);OLED_Show_CHinese(4,CCList_firesensor_2,0);break;
}
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
switch(choose)
{
case 1:
En_Fire_Sensor=0;//關(guān)閉火焰探測器使能位
break;
case 2:
En_Fire_Sensor=1;//使能火焰探測器
break;
}
}
while(!KEY1);
OLED_Clear();
goto FSMENUQUIT;
}
if(KEY2==0)//取消按鍵
{
delay2(5000);
if(KEY2==0)
{
choose=1;//重置菜單選擇位
}
while(!KEY2);
OLED_Clear();
goto FSMENUQUIT;
}
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose--;
if(choose==0)choose=1;//選項(xiàng)最少不能小于1
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose++;
if(choose==3)choose=2;//選項(xiàng)最大不能大于2
}
while(!KEY4);
}
}
FSMENUQUIT:choose=choose_possition;//將之前存儲的值還給choose以保證上級菜單不出現(xiàn)錯亂
}
void OLED_Admin_RFID_Mode()//RFID選項(xiàng),因?yàn)槿萘啃∮诘扔?個,一屏可以放得下,所以不加滾屏功能,僅在3個選項(xiàng)中跳動
{
unsigned char choose_possition;//用于存放進(jìn)入此級菜單時上一級choose的值
choose_possition=choose;
OLED_Clear();
OLED_Show_CHinese(0,CCTitle14,0);//顯示標(biāo)題:RFID
while(!KEY1);//等待按鍵松開
choose=1;
while(1)
{
switch(choose)
{
case 1:OLED_Show_CHinese(2,CCList_RFID_1,0);OLED_Show_CHinese(4,CCList_RFID_2,1);OLED_Show_CHinese(6,CCList_RFID_3,1);break;
case 2:OLED_Show_CHinese(2,CCList_RFID_1,1);OLED_Show_CHinese(4,CCList_RFID_2,0);OLED_Show_CHinese(6,CCList_RFID_3,1);break;
case 3:OLED_Show_CHinese(2,CCList_RFID_1,1);OLED_Show_CHinese(4,CCList_RFID_2,1);OLED_Show_CHinese(6,CCList_RFID_3,0);break;
}
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
switch(choose)
{
case 1:
En_RFID=0;//關(guān)閉射頻卡模塊使能位
break;
case 2:
En_RFID=1;//使能射頻卡模塊
break;
case 3:
OLED_Admin_RFID_Manage();
break;
}
}
while(!KEY1);
if(choose!=3)
{
goto RFIDQUIT;
}
else
{
OLED_Clear();
OLED_Show_CHinese(0,CCTitle14,0);//顯示標(biāo)題:RFID
}
}
if(KEY2==0)//取消按鍵
{
delay2(5000);
if(KEY2==0)
{
choose=1;//重置菜單選擇位
}
while(!KEY2);
OLED_Clear();
goto RFIDQUIT;
}
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose--;
if(choose==0)choose=1;//選項(xiàng)最少不能小于1
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose++;
if(choose==4)choose=3;//選項(xiàng)最大不能大于3
}
while(!KEY4);
}
}
RFIDQUIT:choose=choose_possition;//將之前存儲的值還給choose以保證上級菜單不出現(xiàn)錯亂
}
void OLED_Admin_RFID_Manage()//射頻管理選項(xiàng),因?yàn)槿萘啃∮诘扔?個,一屏可以放得下,所以不加滾屏功能,僅在3個選項(xiàng)中跳動
{
unsigned char choose_manage;//新建一個臨時選項(xiàng)變量,與上兩層目錄無關(guān)
OLED_Clear();
OLED_Show_CHinese(0,CCTitle15,0);//顯示標(biāo)題:管理RFID
while(!KEY1);//等待按鍵松開
choose_manage=1;
while(1)
{
switch(choose_manage)
{
case 1:
OLED_Show_CHinese(2,CCList_admin_RFID_1,0);
OLED_Show_CHinese(4,CCList_admin_RFID_2,1);
OLED_Show_CHinese(6,CCList_admin_RFID_3,1);break;
case 2:
OLED_Show_CHinese(2,CCList_admin_RFID_1,1);
OLED_Show_CHinese(4,CCList_admin_RFID_2,0);
OLED_Show_CHinese(6,CCList_admin_RFID_3,1);break;
case 3:
OLED_Show_CHinese(2,CCList_admin_RFID_1,1);
OLED_Show_CHinese(4,CCList_admin_RFID_2,1);
OLED_Show_CHinese(6,CCList_admin_RFID_3,0);break;
}
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
switch(choose_manage)
{
case 1:
/*添加卡函數(shù)*/
Card_Add();
break;
case 2:
/*刪除卡函數(shù)*/
Card_Delete();
break;
case 3:
/*對比卡函數(shù)*/
Card_Compare();
break;
}
}
while(!KEY1);
OLED_Clear();
OLED_Show_CHinese(0,CCTitle14,0);//顯示標(biāo)題:RFID
}
if(KEY2==0)//取消按鍵
{
delay2(5000);
if(KEY2==0)
{
choose_manage=1;//重置菜單選擇位
}
while(!KEY2);
OLED_Clear();
goto RFIDMQUIT;
}
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose_manage--;
if(choose_manage==0)choose_manage=1;//選項(xiàng)最少不能小于1
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose_manage++;
if(choose_manage==4)choose_manage=3;//選項(xiàng)最大不能大于3
}
while(!KEY4);
}
}
RFIDMQUIT: _nop_();
}
void OLED_Display_System_Information()//顯示BMP180傳回的溫度氣壓信息
{
unsigned char i;
OLED_Clear();
OLED_Show_CHinese(0,CCTitle10,1);//顯示標(biāo)題:狀態(tài)信息
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
}
/*在此添加存儲容量檢測*/
Storage_Check();
OLED_Show_cChar(0,4,cChar10,1);//卡
OLED_Show_cChar(16,4,cChar11,1);//存
OLED_Show_cChar(32,4,cChar12,1);//儲
OLED_Show_cChar(48,4,cChar8,1);//:
OLED_Show_sChar(96,4,sChar13,1);///
OLED_Show_One_Number(80,4,Space_State[0],1);
OLED_Show_One_Number(88,4,Space_State[1],1);
OLED_Show_One_Number(104,4,Space_State[2],1);
OLED_Show_One_Number(112,4,Space_State[3],1);
while(!KEY1);//等待按鍵松開
while(1)
{
/*在此添加溫度氣壓掃描顯示函數(shù)*/
BMP180_Calculate();
OLED_Show_sChar(0,6,sChar9,1);//T
OLED_Show_sChar(8,6,sChar8,1);//P
OLED_Show_sChar(16,6,sChar2,1);//:
OLED_Show_sChar(40,6,sChar11,1);//.
OLED_Show_sChar(56,6,sChar12,1);//°
OLED_Show_sChar(64,6,sChar10,1);//C
OLED_Show_sChar(96,6,sChar11,1);//.
OLED_Show_sChar(112,6,sChar6,1);//K
OLED_Show_sChar(120,6,sChar7,1);//p
OLED_Show_One_Number(24,6,BMP180_Temperature/100,1);
OLED_Show_One_Number(32,6,BMP180_Temperature%100/10,1);
OLED_Show_One_Number(48,6,BMP180_Temperature%10,1);
if((BMP180_Pressure/100000)!=0)
{
OLED_Show_One_Number(72,6,BMP180_Pressure/100000,1);
}
OLED_Show_One_Number(80,6,BMP180_Pressure%100000/10000,1);
OLED_Show_One_Number(88,6,BMP180_Pressure%10000/1000,1);
OLED_Show_One_Number(104,6,BMP180_Pressure%1000/100,1);
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
_nop_();
}
while(!KEY1);//由于按鍵只起到返回的作用,此處也可以將第二次if判斷去掉,僅使用while判斷,但為了整體規(guī)范性,就不在意那幾個時鐘了
OLED_Clear();
goto OUT3;
}
if(KEY2==0)//取消按鍵
{
delay2(5000);
if(KEY2==0)
{
_nop_();
}
while(!KEY2);//由于按鍵只起到返回的作用,此處也可以將第二次if判斷去掉,僅使用while判斷,但為了整體規(guī)范性,就不在意那幾個時鐘了
OLED_Clear();
goto OUT3;
}
}
OUT3:_nop_();
}
void Time_Set()//時間修改函數(shù)
{
bit en_data=1;//數(shù)據(jù)合法標(biāo)志位,表示數(shù)據(jù)檢查時的合法:1/不合法:0判斷結(jié)果
unsigned char i,choose=1,year_temp;
unsigned char set_clock[6];
unsigned char set_date[8];
set_date[0]=display_year[0];
set_date[1]=display_year[1];
set_date[2]=display_year[2];
set_date[3]=display_year[3];
set_date[4]=display_month[0];
set_date[5]=display_month[1];
set_date[6]=display_day[0];
set_date[7]=display_day[1];
set_clock[0]=display_hour[0];
set_clock[1]=display_hour[1];
set_clock[2]=display_minute[0];
set_clock[3]=display_minute[1];
set_clock[4]=display_second[0];
set_clock[5]=display_second[1];//復(fù)制運(yùn)行數(shù)組,取待顯示每一位
/*第一部分,日期設(shè)置*/
OLED_Clear();
OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時間修改
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
}
OLED_Show_CHinese(4,CCInfo7,1);//顯示說明文字:請輸入年月日:
while(!KEY1);//確認(rèn)進(jìn)入該函數(shù)時的按鍵已經(jīng)松開
while(1)
{
OLED_DateSet_Display(set_date,choose);//刷新顯示時間設(shè)置數(shù)組,該數(shù)組保存設(shè)置的時間(按位)
if(KeyScan()<10)//如果在此時有鍵盤按鍵按下則更改當(dāng)前位的值
{
delay2(5000);
if(KeyScan()<10)
{
set_date[choose-1]=KeyScan();
}
while(KeyScan()!=16);//等待按鍵松開
choose++;
if(choose==9)choose=8;//選項(xiàng)最大不能大于8
}
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
_nop_();
}
while(!KEY1);
goto TSB;//跳出當(dāng)前循環(huán),進(jìn)入下一循環(huán)時間設(shè)置
}
if(KEY2==0)//取消按鍵,直接退出時間設(shè)置函數(shù)
{
delay2(5000);
if(KEY2==0)
{
_nop_();
}
while(!KEY2);
OLED_Clear();
goto TIMESETOUT;
}
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose--;
if(choose==0)choose=1;//選項(xiàng)最少不能小于1
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose++;
if(choose==9)choose=8;//選項(xiàng)最大不能大于8
}
while(!KEY4);
}
}
/*第二部分,時間設(shè)置*/
TSB: choose=1;//重置顯示位標(biāo)志
OLED_Clear();
OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時間修改
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
}
OLED_Show_CHinese(4,CCInfo8,1);//顯示說明文字:請輸入時鐘:
while(1)
{
OLED_TimeSet_Display(set_clock,choose);//刷新顯示時間設(shè)置數(shù)組,該數(shù)組保存設(shè)置的時間(按位)
if(KeyScan()<10)//如果在此時有鍵盤按鍵按下則更改當(dāng)前位的值
{
delay2(5000);
if(KeyScan()<10)
{
set_clock[choose-1]=KeyScan();
}
while(KeyScan()!=16);//等待按鍵松開
choose++;
if(choose==7)choose=6;//選項(xiàng)最大不能大于6
}
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
_nop_();
}
while(!KEY1);
goto TSC;//跳出當(dāng)前循環(huán),進(jìn)入第三部分
}
if(KEY2==0)//取消按鍵,直接退出時間設(shè)置函數(shù)
{
delay2(5000);
if(KEY2==0)
{
_nop_();
}
while(!KEY2);
OLED_Clear();
goto TIMESETOUT;
}
if(KEY3==0)//上調(diào)按鍵
{
delay2(5000);
if(KEY3==0)
{
choose--;
if(choose==0)choose=1;//選項(xiàng)最少不能小于1
}
while(!KEY3);
}
if(KEY4==0)//下調(diào)按鍵
{
delay2(5000);
if(KEY4==0)
{
choose++;
if(choose==7)choose=6;//選項(xiàng)最大不能大于6
}
while(!KEY4);
}
}
/*第三部分,拼接判斷和寫入*/
TSC:if((set_clock[0]*10+set_clock[1])>24||set_clock[0]>2)//對小時的判斷
{
en_data=0;
}
else
{
if(set_clock[0]==2&&set_clock[1]>4)
{
en_data=0;
}
}
if((set_clock[2]*10+set_clock[3])>60||set_clock[2]>5)//對分鐘的判斷
{
en_data=0;
}
if((set_clock[4]*10+set_clock[5])>60||set_clock[4]>5)//對秒的判斷
{
en_data=0;
}
if((set_date[4]*10+set_date[5])>12||set_date[4]>1)//對月份的判斷
{
en_data=0;
}
else
{
if(set_date[4]==1&&set_date[5]>2)
{
en_data=0;
}
if(set_date[4]==0&&set_date[5]==0)
{
en_data=0;
}
}
if((set_date[6]*10+set_date[7])>31||set_date[6]>3)//對日子的判斷。注意,由于閏年的存在,若出現(xiàn)閏年輸入2.29這樣的情況會在輸入完年份后判斷退出
{
en_data=0;
}
if(set_date[0]!=2||set_date[1]!=0)
{
en_data=0;
}
year_temp=set_date[0]*1000+set_date[1]*100+set_date[2]*10+set_date[3];
if(!Leap(year_temp))//如果不是閏年
{
if(set_date[4]==0&&set_date[5]==2&&set_date[6]==2&&set_date[7]==9)//對2.29作出判斷
{
en_data=0;
}
}
if(en_data)
{
/*拼接寫入數(shù)組*/
time_transmission(set_date,set_clock);
/*寫入新時間*/
TimeReset();
/*提示成功信息*/
OLED_Clear();
OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時間修改
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
}
OLED_Show_CHinese(4,CCInfo15,1);//顯示說明文字:修改成功
/*按鍵循環(huán)*/
while(1)
{
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
_nop_();
}
while(!KEY1);
OLED_Clear();
goto TIMESETOUT;
}
if(KEY2==0)//取消按鍵
{
delay2(5000);
if(KEY2==0)
{
_nop_();
}
while(!KEY2);
OLED_Clear();
goto TIMESETOUT;
}
}
}
else
{
/*提示失敗信息*/
OLED_Clear();
OLED_Show_CHinese(0,CCTitle13,1);//顯示標(biāo)題:時間修改
for(i=0;i<16;i++)
{
OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
}
OLED_Show_CHinese(4,CCInfo16,1);//顯示說明文字:輸入不合規(guī)則
/*按鍵循環(huán)*/
while(1)
{
if(KEY1==0)//確定按鍵
{
delay2(5000);
if(KEY1==0)
{
_nop_();
}
while(!KEY1);
OLED_Clear();
goto TIMESETOUT;
}
if(KEY2==0)//取消按鍵
{
delay2(5000);
if(KEY2==0)
{
_nop_();
}
while(!KEY2);
OLED_Clear();
goto TIMESETOUT;
}
}
}
TIMESETOUT: _nop_();
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1