找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1100|回复: 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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表