久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1296|回復: 0
打印 上一主題 下一主題
收起左側

單片機密碼鎖程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:366430 發表于 2019-2-4 07:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*

  2. 此文件中將來自OLED_Fuction.c中的顯示函數按程序狀態封裝,調用時更新特定顯示

  3. */

  4. #include"OLED_Fuction.c"
  5. #include"RFID_Fuction.c"
  6. #include"BMP180_Fuction.c"

  7. extern unsigned char display_hour[];
  8. extern unsigned char display_minute[];
  9. extern unsigned char display_month[];
  10. extern unsigned char display_day[];
  11. extern unsigned char display_year[];
  12. extern unsigned char display_second[];
  13. extern unsigned char display_week;

  14. extern unsigned char Space_State[4];

  15. extern long BMP180_Temperature;
  16. extern long BMP180_Pressure;

  17. extern unsigned char choose;
  18. extern unsigned char first_num;
  19. extern bit User_Locker;
  20. extern bit Admin_Info;
  21. extern bit En_Fire_Sensor;
  22. extern bit En_RFID;

  23. void OLED_Admin_RFID_Manage(void);

  24. void delay2(unsigned int cnt)//調用該函數進行一段時間的延時
  25. {
  26.         while(cnt--);
  27. }
  28. /*####################################################用戶狀態函數##############################################*/

  29. void OLED_Display_Standby()//待機狀態,顯示定時器0獲取的時間或通知已鎖信息
  30. {
  31.         unsigned char i;
  32.         OLED_Show_CHinese(0,CCTitle1,1);//顯示標題:當前已鎖
  33.         for(i=0;i<16;i++)
  34.         {
  35.                 OLED_Show_sChar(i*8,2,sChar3,1);//顯示橫線
  36.         }
  37.         OLED_Show_Number(8,4,display_year,4,1);
  38.         OLED_Show_cChar(40,4,cChar1,1);//年
  39.         OLED_Show_Number(56,4,display_month,2,1);
  40.         OLED_Show_cChar(72,4,cChar2,1);//月
  41.         OLED_Show_Number(88,4,display_day,2,1);
  42.         OLED_Show_cChar(104,4,cChar3,1);//日

  43.         OLED_Show_Number(32,6,display_hour,2,1);
  44.         OLED_Show_sChar(48,6,sChar2,1);//:
  45.         OLED_Show_Number(56,6,display_minute,2,1);
  46.         OLED_Show_sChar(72,6,sChar2,1);//:
  47.         OLED_Show_Number(80,6,display_second,2,1);
  48. }

  49. void OLED_Display_Put_In_Password()//用戶模式下輸入密碼的靜態顯示
  50. {
  51.         unsigned char i;
  52.         OLED_Show_CHinese(0,CCTitle1,1);//顯示標題:當前已鎖
  53.         for(i=0;i<16;i++)
  54.         {
  55.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  56.         }
  57.         OLED_Show_CHinese(4,CCInfo1,1);//顯示說明文字:請輸入密碼:
  58. }

  59. void OLED_Display_Right_Password()//用戶模式下輸入密碼正確的靜態提示信息
  60. {
  61.         unsigned char i;
  62.         OLED_Show_CHinese(0,CCTitle3,1);//顯示標題:密碼正確
  63.         for(i=0;i<16;i++)
  64.         {
  65.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  66.         }
  67.         OLED_Show_CHinese(6,CCInfo6,1);//顯示說明文字:繼電器已啟用
  68. }

  69. void OLED_User_Mode()//用戶模式菜單動態顯示,因為容量小于等于3個,一屏可以放得下,所以不加滾屏功能,僅在兩個選項中跳動
  70. {
  71.         OLED_Show_CHinese(0,CCTitle4,0);//顯示標題:用戶模式
  72.         switch(choose)
  73.         {
  74.                 case 1:OLED_Show_CHinese(2,CCList_user_1,0);OLED_Show_CHinese(4,CCList_user_2,1);break;
  75.                 case 2:OLED_Show_CHinese(2,CCList_user_1,1);OLED_Show_CHinese(4,CCList_user_2,0);break;
  76.         }

  77.         if(KEY3==0)//上調按鍵
  78.         {
  79.                 delay2(5000);
  80.                 if(KEY3==0)
  81.                 {
  82.                         choose--;
  83.                         if(choose==0)choose=1;//選項最少不能小于1
  84.                 }
  85.                 while(!KEY3);
  86.         }

  87.         if(KEY4==0)//下調按鍵
  88.         {
  89.                 delay2(5000);
  90.                 if(KEY4==0)
  91.                 {
  92.                         choose++;
  93.                         if(choose==3)choose=2;//選項最大不能大于2
  94.                 }
  95.                 while(!KEY4);
  96.         }
  97. }

  98. /*######################################################管理員狀態函數############################################*/

  99. void OLED_Display_Administrator_Onload()//管理員登入靜態顯示
  100. {
  101.         unsigned char i;
  102.         OLED_Show_CHinese(0,CCTitle5,1);//顯示標題:管理模式
  103.         for(i=0;i<16;i++)
  104.         {
  105.                 OLED_Show_sChar(i*8,2,sChar5,1);//顯示橫線
  106.         }
  107.         OLED_Show_CHinese(4,CCInfo3,1);//顯示說明文字:請輸入口令:
  108. }

  109. void OLED_Display_Menu(unsigned char menu_num,unsigned char choose)
  110. {//定制的菜單顯示接口函數,用于將菜單變量名和調用它的變量值連接起來,需要知道顯示的起始菜單號和當前選中的菜單
  111.         switch(menu_num)
  112.         {
  113.                 case 1:
  114.                         OLED_Show_CHinese(2,CCList_admin_1,!(choose==1));
  115.                         OLED_Show_CHinese(4,CCList_admin_2,!(choose==2));
  116.                         OLED_Show_CHinese(6,CCList_admin_3,!(choose==3));
  117.                         break;
  118.                 case 2:
  119.                         OLED_Show_CHinese(2,CCList_admin_2,!(choose==2));
  120.                         OLED_Show_CHinese(4,CCList_admin_3,!(choose==3));
  121.                         OLED_Show_CHinese(6,CCList_admin_4,!(choose==4));
  122.                         break;
  123.                 case 3:
  124.                         OLED_Show_CHinese(2,CCList_admin_3,!(choose==3));
  125.                         OLED_Show_CHinese(4,CCList_admin_4,!(choose==4));
  126.                         OLED_Show_CHinese(6,CCList_admin_5,!(choose==5));
  127.                         break;
  128.                 case 4:
  129.                         OLED_Show_CHinese(2,CCList_admin_4,!(choose==4));
  130.                         OLED_Show_CHinese(4,CCList_admin_5,!(choose==5));
  131.                         OLED_Show_CHinese(6,CCList_admin_6,!(choose==6));
  132.                         break;
  133.                 case 5:
  134.                         OLED_Show_CHinese(2,CCList_admin_5,!(choose==5));
  135.                         OLED_Show_CHinese(4,CCList_admin_6,!(choose==6));
  136.                         OLED_Show_CHinese(6,CCList_admin_7,!(choose==7));
  137.                         break;
  138.                 case 6:
  139.                         OLED_Show_CHinese(2,CCList_admin_6,!(choose==6));
  140.                         OLED_Show_CHinese(4,CCList_admin_7,!(choose==7));
  141.                         OLED_Show_CHinese(6,CCList_admin_8,!(choose==8));
  142.                         break;
  143.                 case 7:
  144.                         OLED_Show_CHinese(2,CCList_admin_7,!(choose==7));
  145.                         OLED_Show_CHinese(4,CCList_admin_8,!(choose==8));
  146.                         OLED_Show_CHinese(6,CCList_admin_9,!(choose==9));
  147.                         break;
  148.         }
  149. }

  150. void OLED_Admin_Mode()//管理模式菜單動態顯示
  151. {
  152.         //static unsigned char first_num=1;//第一項菜單標號
  153.         OLED_Show_CHinese(0,CCTitle5,0);//顯示標題:管理模式

  154.         OLED_Display_Menu(first_num,choose);//根據first_num和choose的動態刷新顯示函數

  155.         if(KEY3==0)//上調按鍵
  156.         {
  157.                 delay2(5000);
  158.                 if(KEY3==0)
  159.                 {
  160.                         choose--;
  161.                         if(choose==0)choose=1;//選項最少不能小于1
  162.                         if(choose<first_num)first_num--;
  163.                 }
  164.                 while(!KEY3);
  165.         }

  166.         if(KEY4==0)//下調按鍵
  167.         {
  168.                 delay2(5000);
  169.                 if(KEY4==0)
  170.                 {
  171.                         choose++;
  172.                         if(choose==10)choose=9;//選項最大不能大于9
  173.                         if(choose>first_num+2)first_num++;
  174.                 }
  175.                 while(!KEY4);
  176.         }
  177. }

  178. void OLED_Admin_onoff_Mode()//常開常關選項,因為容量小于等于3個,一屏可以放得下,所以不加滾屏功能,僅在兩個選項中跳動
  179. {
  180.         unsigned char choose_possition;//用于存放進入此級菜單時上一級choose的值
  181.         choose_possition=choose;
  182.         OLED_Clear();
  183.         OLED_Show_CHinese(0,CCTitle9,0);//顯示標題:開關選項
  184.         while(!KEY1);//等待按鍵松開
  185.         choose=1;

  186.         while(1)
  187.         {
  188.                 switch(choose)
  189.                 {
  190.                         case 1:OLED_Show_CHinese(2,CCList_onoff_1,0);OLED_Show_CHinese(4,CCList_onoff_2,1);break;
  191.                         case 2:OLED_Show_CHinese(2,CCList_onoff_1,1);OLED_Show_CHinese(4,CCList_onoff_2,0);break;
  192.                 }

  193.                 if(KEY1==0)//確定按鍵
  194.                 {
  195.                         delay2(5000);
  196.                         if(KEY1==0)
  197.                         {
  198.                                 switch(choose)
  199.                                 {
  200.                                         case 1:
  201.                                                 JDQ=0;//開啟繼電器,由于繼電器所在接口的位定義不再此文件中,故直接使用單片機頭文件中的IO口定義
  202.                                                 User_Locker=1;//用戶鎖定
  203.                                                 Admin_Info=1;//管理員開鎖通知開,該提示信息在用戶代碼處修改
  204.                                                 break;
  205.                                         case 2:
  206.                                                 JDQ=1;//開啟繼電器,由于繼電器所在接口的位定義不再此文件中,故直接使用單片機頭文件中的IO口定義
  207.                                                 User_Locker=0;//用戶解鎖
  208.                                                 Admin_Info=0;//管理員開鎖通知關,該提示信息在用戶代碼處修改
  209.                                                 break;
  210.                                 }
  211.                         }
  212.                         while(!KEY1);
  213.                         OLED_Clear();
  214.                         goto OUT2;
  215.                 }

  216.                 if(KEY2==0)//取消按鍵
  217.                 {
  218.                         delay2(5000);
  219.                         if(KEY2==0)
  220.                         {
  221.                                 choose=1;//重置菜單選擇位
  222.                         }
  223.                         while(!KEY2);
  224.                         OLED_Clear();
  225.                         goto OUT2;
  226.                 }

  227.                 if(KEY3==0)//上調按鍵
  228.                 {
  229.                         delay2(5000);
  230.                         if(KEY3==0)
  231.                         {
  232.                                 choose--;
  233.                                 if(choose==0)choose=1;//選項最少不能小于1
  234.                         }
  235.                         while(!KEY3);
  236.                 }

  237.                 if(KEY4==0)//下調按鍵
  238.                 {
  239.                         delay2(5000);
  240.                         if(KEY4==0)
  241.                         {
  242.                                 choose++;
  243.                                 if(choose==3)choose=2;//選項最大不能大于2
  244.                         }
  245.                         while(!KEY4);
  246.                 }
  247.         }
  248. OUT2:choose=choose_possition;//將之前存儲的值還給choose以保證上級菜單不出現錯亂
  249. }

  250. void OLED_Admin_firesensor_Mode()//火焰探測器開關選項,因為容量小于等于3個,一屏可以放得下,所以不加滾屏功能,僅在兩個選項中跳動
  251. {
  252.         unsigned char choose_possition;//用于存放進入此級菜單時上一級choose的值
  253.         choose_possition=choose;
  254.         OLED_Clear();
  255.         OLED_Show_CHinese(0,CCTitle11,0);//顯示標題:火焰探測
  256.         while(!KEY1);//等待按鍵松開
  257.         choose=1;

  258.         while(1)
  259.         {
  260.                 switch(choose)
  261.                 {
  262.                         case 1:OLED_Show_CHinese(2,CCList_firesensor_1,0);OLED_Show_CHinese(4,CCList_firesensor_2,1);break;
  263.                         case 2:OLED_Show_CHinese(2,CCList_firesensor_1,1);OLED_Show_CHinese(4,CCList_firesensor_2,0);break;
  264.                 }

  265.                 if(KEY1==0)//確定按鍵
  266.                 {
  267.                         delay2(5000);
  268.                         if(KEY1==0)
  269.                         {
  270.                                 switch(choose)
  271.                                 {
  272.                                         case 1:
  273.                                                 En_Fire_Sensor=0;//關閉火焰探測器使能位
  274.                                                 break;
  275.                                         case 2:
  276.                                                 En_Fire_Sensor=1;//使能火焰探測器
  277.                                                 break;
  278.                                 }
  279.                         }
  280.                         while(!KEY1);
  281.                         OLED_Clear();
  282.                         goto FSMENUQUIT;
  283.                 }

  284.                 if(KEY2==0)//取消按鍵
  285.                 {
  286.                         delay2(5000);
  287.                         if(KEY2==0)
  288.                         {
  289.                                 choose=1;//重置菜單選擇位
  290.                         }
  291.                         while(!KEY2);
  292.                         OLED_Clear();
  293.                         goto FSMENUQUIT;
  294.                 }

  295.                 if(KEY3==0)//上調按鍵
  296.                 {
  297.                         delay2(5000);
  298.                         if(KEY3==0)
  299.                         {
  300.                                 choose--;
  301.                                 if(choose==0)choose=1;//選項最少不能小于1
  302.                         }
  303.                         while(!KEY3);
  304.                 }

  305.                 if(KEY4==0)//下調按鍵
  306.                 {
  307.                         delay2(5000);
  308.                         if(KEY4==0)
  309.                         {
  310.                                 choose++;
  311.                                 if(choose==3)choose=2;//選項最大不能大于2
  312.                         }
  313.                         while(!KEY4);
  314.                 }
  315.         }
  316. FSMENUQUIT:choose=choose_possition;//將之前存儲的值還給choose以保證上級菜單不出現錯亂
  317. }

  318. void OLED_Admin_RFID_Mode()//RFID選項,因為容量小于等于3個,一屏可以放得下,所以不加滾屏功能,僅在3個選項中跳動
  319. {
  320.         unsigned char choose_possition;//用于存放進入此級菜單時上一級choose的值
  321.         choose_possition=choose;
  322.         OLED_Clear();
  323.         OLED_Show_CHinese(0,CCTitle14,0);//顯示標題:RFID
  324.         while(!KEY1);//等待按鍵松開
  325.         choose=1;

  326.         while(1)
  327.         {
  328.                 switch(choose)
  329.                 {
  330.                         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;
  331.                         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;
  332.                         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;
  333.                 }

  334.                 if(KEY1==0)//確定按鍵
  335.                 {
  336.                         delay2(5000);
  337.                         if(KEY1==0)
  338.                         {
  339.                                 switch(choose)
  340.                                 {
  341.                                         case 1:
  342.                                                 En_RFID=0;//關閉射頻卡模塊使能位
  343.                                                 break;
  344.                                         case 2:
  345.                                                 En_RFID=1;//使能射頻卡模塊
  346.                                                 break;
  347.                                         case 3:
  348.                                                 OLED_Admin_RFID_Manage();
  349.                                                 break;
  350.                                 }
  351.                         }
  352.                         while(!KEY1);
  353.                         if(choose!=3)
  354.                         {
  355.                                 goto RFIDQUIT;
  356.                         }
  357.                         else
  358.                         {
  359.                                 OLED_Clear();
  360.                                 OLED_Show_CHinese(0,CCTitle14,0);//顯示標題:RFID
  361.                         }
  362.                 }

  363.                 if(KEY2==0)//取消按鍵
  364.                 {
  365.                         delay2(5000);
  366.                         if(KEY2==0)
  367.                         {
  368.                                 choose=1;//重置菜單選擇位
  369.                         }
  370.                         while(!KEY2);
  371.                         OLED_Clear();
  372.                         goto RFIDQUIT;
  373.                 }

  374.                 if(KEY3==0)//上調按鍵
  375.                 {
  376.                         delay2(5000);
  377.                         if(KEY3==0)
  378.                         {
  379.                                 choose--;
  380.                                 if(choose==0)choose=1;//選項最少不能小于1
  381.                         }
  382.                         while(!KEY3);
  383.                 }

  384.                 if(KEY4==0)//下調按鍵
  385.                 {
  386.                         delay2(5000);
  387.                         if(KEY4==0)
  388.                         {
  389.                                 choose++;
  390.                                 if(choose==4)choose=3;//選項最大不能大于3
  391.                         }
  392.                         while(!KEY4);
  393.                 }
  394.         }
  395. RFIDQUIT:choose=choose_possition;//將之前存儲的值還給choose以保證上級菜單不出現錯亂
  396. }

  397. void OLED_Admin_RFID_Manage()//射頻管理選項,因為容量小于等于3個,一屏可以放得下,所以不加滾屏功能,僅在3個選項中跳動
  398. {
  399.         unsigned char choose_manage;//新建一個臨時選項變量,與上兩層目錄無關
  400.         OLED_Clear();
  401.         OLED_Show_CHinese(0,CCTitle15,0);//顯示標題:管理RFID
  402.         while(!KEY1);//等待按鍵松開
  403.         choose_manage=1;

  404.         while(1)
  405.         {
  406.                 switch(choose_manage)
  407.                 {
  408.                         case 1:
  409.                                 OLED_Show_CHinese(2,CCList_admin_RFID_1,0);
  410.                                 OLED_Show_CHinese(4,CCList_admin_RFID_2,1);
  411.                                 OLED_Show_CHinese(6,CCList_admin_RFID_3,1);break;
  412.                         case 2:
  413.                                 OLED_Show_CHinese(2,CCList_admin_RFID_1,1);
  414.                                 OLED_Show_CHinese(4,CCList_admin_RFID_2,0);
  415.                                 OLED_Show_CHinese(6,CCList_admin_RFID_3,1);break;
  416.                         case 3:
  417.                                 OLED_Show_CHinese(2,CCList_admin_RFID_1,1);
  418.                                 OLED_Show_CHinese(4,CCList_admin_RFID_2,1);
  419.                                 OLED_Show_CHinese(6,CCList_admin_RFID_3,0);break;
  420.                 }

  421.                 if(KEY1==0)//確定按鍵
  422.                 {
  423.                         delay2(5000);
  424.                         if(KEY1==0)
  425.                         {
  426.                                 switch(choose_manage)
  427.                                 {
  428.                                         case 1:
  429.                                                 /*添加卡函數*/
  430.                                                 Card_Add();
  431.                                                 break;
  432.                                         case 2:
  433.                                                 /*刪除卡函數*/
  434.                                                 Card_Delete();
  435.                                                 break;
  436.                                         case 3:
  437.                                                 /*對比卡函數*/
  438.                                                 Card_Compare();
  439.                                                 break;
  440.                                 }
  441.                         }
  442.                         while(!KEY1);
  443.                         OLED_Clear();
  444.                         OLED_Show_CHinese(0,CCTitle14,0);//顯示標題:RFID
  445.                 }

  446.                 if(KEY2==0)//取消按鍵
  447.                 {
  448.                         delay2(5000);
  449.                         if(KEY2==0)
  450.                         {
  451.                                 choose_manage=1;//重置菜單選擇位
  452.                         }
  453.                         while(!KEY2);
  454.                         OLED_Clear();
  455.                         goto RFIDMQUIT;
  456.                 }

  457.                 if(KEY3==0)//上調按鍵
  458.                 {
  459.                         delay2(5000);
  460.                         if(KEY3==0)
  461.                         {
  462.                                 choose_manage--;
  463.                                 if(choose_manage==0)choose_manage=1;//選項最少不能小于1
  464.                         }
  465.                         while(!KEY3);
  466.                 }

  467.                 if(KEY4==0)//下調按鍵
  468.                 {
  469.                         delay2(5000);
  470.                         if(KEY4==0)
  471.                         {
  472.                                 choose_manage++;
  473.                                 if(choose_manage==4)choose_manage=3;//選項最大不能大于3
  474.                         }
  475.                         while(!KEY4);
  476.                 }
  477.         }
  478. RFIDMQUIT:        _nop_();
  479. }

  480. void OLED_Display_System_Information()//顯示BMP180傳回的溫度氣壓信息
  481. {
  482.         unsigned char i;
  483.         OLED_Clear();
  484.         OLED_Show_CHinese(0,CCTitle10,1);//顯示標題:狀態信息
  485.         for(i=0;i<16;i++)
  486.         {
  487.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  488.         }

  489.         /*在此添加存儲容量檢測*/
  490.         Storage_Check();
  491.         OLED_Show_cChar(0,4,cChar10,1);//卡
  492.         OLED_Show_cChar(16,4,cChar11,1);//存
  493.         OLED_Show_cChar(32,4,cChar12,1);//儲
  494.         OLED_Show_cChar(48,4,cChar8,1);//:
  495.         OLED_Show_sChar(96,4,sChar13,1);///
  496.         OLED_Show_One_Number(80,4,Space_State[0],1);
  497.         OLED_Show_One_Number(88,4,Space_State[1],1);
  498.         OLED_Show_One_Number(104,4,Space_State[2],1);
  499.         OLED_Show_One_Number(112,4,Space_State[3],1);

  500.         while(!KEY1);//等待按鍵松開

  501.         while(1)
  502.         {
  503.                 /*在此添加溫度氣壓掃描顯示函數*/
  504.                 BMP180_Calculate();
  505.                 OLED_Show_sChar(0,6,sChar9,1);//T
  506.                 OLED_Show_sChar(8,6,sChar8,1);//P
  507.                 OLED_Show_sChar(16,6,sChar2,1);//:
  508.                 OLED_Show_sChar(40,6,sChar11,1);//.
  509.                 OLED_Show_sChar(56,6,sChar12,1);//°
  510.                 OLED_Show_sChar(64,6,sChar10,1);//C
  511.                 OLED_Show_sChar(96,6,sChar11,1);//.
  512.                 OLED_Show_sChar(112,6,sChar6,1);//K
  513.                 OLED_Show_sChar(120,6,sChar7,1);//p

  514.                 OLED_Show_One_Number(24,6,BMP180_Temperature/100,1);
  515.                 OLED_Show_One_Number(32,6,BMP180_Temperature%100/10,1);
  516.                 OLED_Show_One_Number(48,6,BMP180_Temperature%10,1);

  517.                 if((BMP180_Pressure/100000)!=0)
  518.                 {
  519.                         OLED_Show_One_Number(72,6,BMP180_Pressure/100000,1);
  520.                 }
  521.                 OLED_Show_One_Number(80,6,BMP180_Pressure%100000/10000,1);
  522.                 OLED_Show_One_Number(88,6,BMP180_Pressure%10000/1000,1);
  523.                 OLED_Show_One_Number(104,6,BMP180_Pressure%1000/100,1);

  524.                 if(KEY1==0)//確定按鍵
  525.                 {
  526.                         delay2(5000);
  527.                         if(KEY1==0)
  528.                         {
  529.                                 _nop_();
  530.                         }
  531.                         while(!KEY1);//由于按鍵只起到返回的作用,此處也可以將第二次if判斷去掉,僅使用while判斷,但為了整體規范性,就不在意那幾個時鐘了
  532.                         OLED_Clear();
  533.                         goto OUT3;
  534.                 }

  535.                 if(KEY2==0)//取消按鍵
  536.                 {
  537.                         delay2(5000);
  538.                         if(KEY2==0)
  539.                         {
  540.                                 _nop_();
  541.                         }
  542.                         while(!KEY2);//由于按鍵只起到返回的作用,此處也可以將第二次if判斷去掉,僅使用while判斷,但為了整體規范性,就不在意那幾個時鐘了
  543.                         OLED_Clear();
  544.                         goto OUT3;
  545.                 }
  546.         }
  547. OUT3:_nop_();
  548. }

  549. void Time_Set()//時間修改函數
  550. {
  551.         bit en_data=1;//數據合法標志位,表示數據檢查時的合法:1/不合法:0判斷結果
  552.         unsigned char i,choose=1,year_temp;
  553.         unsigned char set_clock[6];
  554.         unsigned char set_date[8];

  555.         set_date[0]=display_year[0];
  556.         set_date[1]=display_year[1];
  557.         set_date[2]=display_year[2];
  558.         set_date[3]=display_year[3];
  559.         set_date[4]=display_month[0];
  560.         set_date[5]=display_month[1];
  561.         set_date[6]=display_day[0];
  562.         set_date[7]=display_day[1];

  563.         set_clock[0]=display_hour[0];
  564.         set_clock[1]=display_hour[1];
  565.         set_clock[2]=display_minute[0];
  566.         set_clock[3]=display_minute[1];
  567.         set_clock[4]=display_second[0];
  568.         set_clock[5]=display_second[1];//復制運行數組,取待顯示每一位


  569.         /*第一部分,日期設置*/
  570.         OLED_Clear();
  571.         OLED_Show_CHinese(0,CCTitle13,1);//顯示標題:時間修改
  572.         for(i=0;i<16;i++)
  573.         {
  574.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  575.         }
  576.         OLED_Show_CHinese(4,CCInfo7,1);//顯示說明文字:請輸入年月日:
  577.         while(!KEY1);//確認進入該函數時的按鍵已經松開
  578.         while(1)
  579.         {
  580.                 OLED_DateSet_Display(set_date,choose);//刷新顯示時間設置數組,該數組保存設置的時間(按位)

  581.                 if(KeyScan()<10)//如果在此時有鍵盤按鍵按下則更改當前位的值
  582.                 {
  583.                         delay2(5000);
  584.                         if(KeyScan()<10)
  585.                         {
  586.                                 set_date[choose-1]=KeyScan();
  587.                         }
  588.                         while(KeyScan()!=16);//等待按鍵松開
  589.                         choose++;
  590.                         if(choose==9)choose=8;//選項最大不能大于8
  591.                 }

  592.                 if(KEY1==0)//確定按鍵
  593.                 {
  594.                         delay2(5000);
  595.                         if(KEY1==0)
  596.                         {
  597.                                 _nop_();
  598.                         }
  599.                         while(!KEY1);
  600.                         goto TSB;//跳出當前循環,進入下一循環時間設置
  601.                 }

  602.                 if(KEY2==0)//取消按鍵,直接退出時間設置函數
  603.                 {
  604.                         delay2(5000);
  605.                         if(KEY2==0)
  606.                         {
  607.                                 _nop_();
  608.                         }
  609.                         while(!KEY2);
  610.                         OLED_Clear();
  611.                         goto TIMESETOUT;
  612.                 }

  613.                 if(KEY3==0)//上調按鍵
  614.                 {
  615.                         delay2(5000);
  616.                         if(KEY3==0)
  617.                         {
  618.                                 choose--;
  619.                                 if(choose==0)choose=1;//選項最少不能小于1
  620.                         }
  621.                         while(!KEY3);
  622.                 }

  623.                 if(KEY4==0)//下調按鍵
  624.                 {
  625.                         delay2(5000);
  626.                         if(KEY4==0)
  627.                         {
  628.                                 choose++;
  629.                                 if(choose==9)choose=8;//選項最大不能大于8
  630.                         }
  631.                         while(!KEY4);
  632.                 }
  633.         }

  634.         /*第二部分,時間設置*/
  635. TSB:        choose=1;//重置顯示位標志
  636.         OLED_Clear();
  637.         OLED_Show_CHinese(0,CCTitle13,1);//顯示標題:時間修改
  638.         for(i=0;i<16;i++)
  639.         {
  640.                 OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  641.         }
  642.         OLED_Show_CHinese(4,CCInfo8,1);//顯示說明文字:請輸入時鐘:
  643.         while(1)
  644.         {
  645.                 OLED_TimeSet_Display(set_clock,choose);//刷新顯示時間設置數組,該數組保存設置的時間(按位)

  646.                 if(KeyScan()<10)//如果在此時有鍵盤按鍵按下則更改當前位的值
  647.                 {
  648.                         delay2(5000);
  649.                         if(KeyScan()<10)
  650.                         {
  651.                                 set_clock[choose-1]=KeyScan();
  652.                         }
  653.                         while(KeyScan()!=16);//等待按鍵松開
  654.                         choose++;
  655.                         if(choose==7)choose=6;//選項最大不能大于6
  656.                 }

  657.                 if(KEY1==0)//確定按鍵
  658.                 {
  659.                         delay2(5000);
  660.                         if(KEY1==0)
  661.                         {
  662.                                 _nop_();
  663.                         }
  664.                         while(!KEY1);
  665.                         goto TSC;//跳出當前循環,進入第三部分
  666.                 }

  667.                 if(KEY2==0)//取消按鍵,直接退出時間設置函數
  668.                 {
  669.                         delay2(5000);
  670.                         if(KEY2==0)
  671.                         {
  672.                                 _nop_();
  673.                         }
  674.                         while(!KEY2);
  675.                         OLED_Clear();
  676.                         goto TIMESETOUT;
  677.                 }

  678.                 if(KEY3==0)//上調按鍵
  679.                 {
  680.                         delay2(5000);
  681.                         if(KEY3==0)
  682.                         {
  683.                                 choose--;
  684.                                 if(choose==0)choose=1;//選項最少不能小于1
  685.                         }
  686.                         while(!KEY3);
  687.                 }

  688.                 if(KEY4==0)//下調按鍵
  689.                 {
  690.                         delay2(5000);
  691.                         if(KEY4==0)
  692.                         {
  693.                                 choose++;
  694.                                 if(choose==7)choose=6;//選項最大不能大于6
  695.                         }
  696.                         while(!KEY4);
  697.                 }
  698.         }

  699.         /*第三部分,拼接判斷和寫入*/
  700. TSC:if((set_clock[0]*10+set_clock[1])>24||set_clock[0]>2)//對小時的判斷
  701.         {
  702.                 en_data=0;
  703.         }
  704.         else
  705.         {
  706.                 if(set_clock[0]==2&&set_clock[1]>4)
  707.                 {
  708.                         en_data=0;
  709.                 }
  710.         }
  711.         if((set_clock[2]*10+set_clock[3])>60||set_clock[2]>5)//對分鐘的判斷
  712.         {
  713.                 en_data=0;
  714.         }
  715.         if((set_clock[4]*10+set_clock[5])>60||set_clock[4]>5)//對秒的判斷
  716.         {
  717.                 en_data=0;
  718.         }

  719.         if((set_date[4]*10+set_date[5])>12||set_date[4]>1)//對月份的判斷
  720.         {
  721.                 en_data=0;
  722.         }
  723.         else
  724.         {
  725.                 if(set_date[4]==1&&set_date[5]>2)
  726.                 {
  727.                         en_data=0;
  728.                 }
  729.                 if(set_date[4]==0&&set_date[5]==0)
  730.                 {
  731.                         en_data=0;
  732.                 }
  733.         }
  734.         if((set_date[6]*10+set_date[7])>31||set_date[6]>3)//對日子的判斷。注意,由于閏年的存在,若出現閏年輸入2.29這樣的情況會在輸入完年份后判斷退出
  735.         {
  736.                 en_data=0;
  737.         }

  738.         if(set_date[0]!=2||set_date[1]!=0)
  739.         {
  740.                 en_data=0;
  741.         }

  742.         year_temp=set_date[0]*1000+set_date[1]*100+set_date[2]*10+set_date[3];
  743.         if(!Leap(year_temp))//如果不是閏年
  744.         {
  745.                 if(set_date[4]==0&&set_date[5]==2&&set_date[6]==2&&set_date[7]==9)//對2.29作出判斷
  746.                 {
  747.                         en_data=0;
  748.                 }
  749.         }

  750.         if(en_data)
  751.         {
  752.                 /*拼接寫入數組*/
  753.                 time_transmission(set_date,set_clock);

  754.                 /*寫入新時間*/
  755.                 TimeReset();

  756.                 /*提示成功信息*/
  757.                 OLED_Clear();
  758.                 OLED_Show_CHinese(0,CCTitle13,1);//顯示標題:時間修改
  759.                 for(i=0;i<16;i++)
  760.                 {
  761.                         OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  762.                 }
  763.                 OLED_Show_CHinese(4,CCInfo15,1);//顯示說明文字:修改成功
  764.                 /*按鍵循環*/
  765.                 while(1)
  766.                 {
  767.                         if(KEY1==0)//確定按鍵
  768.                         {
  769.                                 delay2(5000);
  770.                                 if(KEY1==0)
  771.                                 {
  772.                                         _nop_();
  773.                                 }
  774.                                 while(!KEY1);
  775.                                 OLED_Clear();
  776.                                 goto TIMESETOUT;
  777.                         }

  778.                         if(KEY2==0)//取消按鍵
  779.                         {
  780.                                 delay2(5000);
  781.                                 if(KEY2==0)
  782.                                 {
  783.                                         _nop_();
  784.                                 }
  785.                                 while(!KEY2);
  786.                                 OLED_Clear();
  787.                                 goto TIMESETOUT;
  788.                         }
  789.                 }
  790.         }
  791.         else
  792.         {
  793.                 /*提示失敗信息*/
  794.                 OLED_Clear();
  795.                 OLED_Show_CHinese(0,CCTitle13,1);//顯示標題:時間修改
  796.                 for(i=0;i<16;i++)
  797.                 {
  798.                         OLED_Show_sChar(i*8,2,sChar4,1);//顯示橫線
  799.                 }
  800.                 OLED_Show_CHinese(4,CCInfo16,1);//顯示說明文字:輸入不合規則
  801.                 /*按鍵循環*/
  802.                 while(1)
  803.                 {
  804.                         if(KEY1==0)//確定按鍵
  805.                         {
  806.                                 delay2(5000);
  807.                                 if(KEY1==0)
  808.                                 {
  809.                                         _nop_();
  810.                                 }
  811.                                 while(!KEY1);
  812.                                 OLED_Clear();
  813.                                 goto TIMESETOUT;
  814.                         }

  815.                         if(KEY2==0)//取消按鍵
  816.                         {
  817.                                 delay2(5000);
  818.                                 if(KEY2==0)
  819.                                 {
  820.                                         _nop_();
  821.                                 }
  822.                                 while(!KEY2);
  823.                                 OLED_Clear();
  824.                                 goto TIMESETOUT;
  825.                         }
  826.                 }
  827.         }
  828. TIMESETOUT:        _nop_();
  829. }

復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 看av在线 | 亚洲精品68久久久一区 | 日韩一区二区三区视频 | 亚洲精品区| 欧美国产一区二区三区 | 午夜精品视频 | 欧美日韩中文字幕 | 亚洲成人精品国产 | 精品欧美一区免费观看α√ | 国产高清自拍视频在线观看 | 成人国产精品免费观看 | 国产特一级黄色片 | 欧美一区二区三区久久精品 | 99精品视频免费在线观看 | 精品一区二区三区av | 国产视频1区| 搞黄视频免费看 | 亚洲成人精品 | 日韩精品一区二区三区在线播放 | 在线播放精品视频 | 久久久久久久久国产 | 亚洲三级视频 | 国产精品久久久久久久免费大片 | 网络毛片 | 一区二区三区视频免费观看 | 自拍视频精品 | 波多野结衣二区 | 欧美一区二区三区国产精品 | 国产高清在线观看 | 久久精品毛片 | 91精品国产91久久久久久吃药 | 91手机精品视频 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 天天天天操| 日本三级电影免费观看 | 伊人亚洲 | 中文字幕日韩在线 | 成人深夜福利网站 | 欧美激情国产日韩精品一区18 | 日韩欧美国产精品一区二区三区 | 免费一区二区三区在线视频 |