找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4227|回復: 0
打印 上一主題 下一主題
收起左側

avr單片機+RFID的門禁系統(tǒng)規(guī)劃與源碼設計資料

[復制鏈接]
跳轉到指定樓層
樓主
ID:457649 發(fā)表于 2018-12-28 21:34 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這個是關于物聯(lián)網設計的一個資料,里面包括射頻卡程序,和設計的初稿。對于想動手做的通知有點幫助



設計文檔:


單片機源程序如下:
  1. /******************************************************************************************************************
  2. 程序名:      射頻卡門禁系統(tǒng)
  3. 功能概述:
  4.                          1、  點陣LCD(128*64)顯示。在正常、設置情況下LCD顯示系統(tǒng)各個時期的菜單以供選擇。
  5.                          2、  射頻卡開鎖,開鎖時用射頻卡放在讀卡器上(距離<15CM)即可開鎖,如果用非法卡連續(xù)刷寫次數(shù)超過3
  6.                               次則報警(報警功能沒有添加),這時系統(tǒng)將關閉刷卡器30分鐘,在30分鐘后再允許刷卡。
  7.                          3          本系統(tǒng)分為:
  8.                                       1)、1個主機。
  9.                                       2)、2個讀卡頭(一個在門外供刷卡用、一個在主機旁用于管理操作)
  10.                          4、  本鎖開鎖時供電,平時斷電(12V)。
  11.                          5、  8個按鍵(AD轉換采樣取值)(設置、+、-、↑、↓、確認、返回、說明)
  12.                          6、  每次按下鍵、刷卡時有峰鳴器指示
  13.                          7、  LCD背光在有按鍵按下時、或刷卡時自動點亮,延時30秒關閉
  14.                          8、  門外有人體紅外傳感器探頭,發(fā)現(xiàn)2米內有人,自動進入預警狀態(tài),如果是在晚上超過7點鐘,則點亮門前的燈泡照明,
  15.                               如果此時有人破壞(比如取下燈泡、剪斷燈炮的線、打爛燈泡)也要報警。否則、連續(xù)在門前超過1分鐘,就開始報警。
  16.                               (此功能沒有添加)
  17.                          9、  開門時發(fā)出“歡迎光臨”,并提示關門(此功能沒有添加)
  18.                          10、 本機帶有門鈴,并能記錄前10天門鈴按下的次數(shù)。(此功能沒有添加)
  19.                          11、 LCD顯示日期、星期、時間、室內溫度、鎖的狀態(tài)、功能設置(菜單顯示)等
  20.                          12、 可以查詢過去10天內的開門記錄并由LCD顯示出來(此功能沒有添加)
  21.                          13、 可以于電腦通過RS-232接口連接進行通信,監(jiān)看門的狀態(tài)、開門記錄等,方便打印(此功能沒有添加)
  22.                          14、 要求鎖誤判率小于1PPM
  23.                          15、 系統(tǒng)配有UPS(12V) 平時用UPS電能,只有當主機檢測到電壓低于11.5V時,自動接入火電進行充電。
  24.                               電瓶充滿時(大約5小時)自動斷電。
  25.                          16、 電壓:12V   
  26.                          17、 電流:待機時<50MA  

  27. 射頻卡類型: 4001、EM4100和含E2PROM的RF卡。如E5550。
  28. MCU類型:     ATmega16
  29. 晶振頻率:    7.3728MHZ
  30. 版本:             V0.1
  31. ******************************************************************************************************************/
  32. #include<iom16v.h>
  33. #include<macros.h>
  34. #include<stdio.h>
  35. #include"LCD_12864.H"                                                                                //LCD頭文件
  36. #include"read_card.H"                                                                                //讀卡頭文件
  37. #define key_inc  (PINC&(1<<PC0))                                                        //按鍵+,選擇日期、時間時用
  38. #define key_dec  (PINC&(1<<PC1))                                                        //按鍵-,選擇日期、時間時用
  39. #define BAUDRATE        9600                                                                //波特率
  40. #define F_CPU                        7372800                                                          //晶振頻率
  41. #define LCD_LAMP                60                                                                  //LCD默認30S后關閉
  42. #define BATTERY_TIME        5                                                                        //每十分鐘檢測一次電池電量

  43. #define ADC_PINA0                 0x00                                                                //ADC0                按鍵AD    單端通道,不放大
  44. #define ADC_PINA1                 0x01                                                                //ADC1                溫度采樣
  45. #define ADC_PINA2                 0x02                                                                //ADC2                電平電量檢測

  46. #define LCD_BACK_ON           PORTC&=~(1<<PC5)
  47. #define LCD_BACK_OFF           PORTC|=(1<<PC5)
  48. #define buzzer_on                  PORTD&=~(1<<PD7)
  49. #define buzzer_off          PORTD|=(1<<PD7)

  50. #define charge_on                  PORTC&=~(1<<PC6)
  51. #define charge_off          PORTC|=(1<<PC6)


  52. #define LOCK_ON                  PORTC&=~(1<<PC3)
  53. #define LOCK_OFF                  PORTC|=(1<<PC3)


  54. #define CHARGE_STATUS          (PINC&(1<<PC2))

  55. #define null                 0
  56. #define vref            5000                                                                                //AD轉換參考電壓
  57. #define OVER_FLOW          10                                                                                //進入菜單設置時,如果在10S內沒有按下任何鍵,則自動退出

  58. #pragma data:code
  59. //const uchar manage_card[5]={0x0b,0,0x2d,0x23,0x5f};                        //住房卡-----當作管理卡        
  60. const uchar manage_card[5]={0x33,0,0x7c,0x09,0xb1};                        //000 8128945-----當作管理卡        
  61. //*************************************************溫度測定查表****************************************************        
  62. //******************************************溫度范圍是:-30度----+99度*********************************************
  63. const uint temp_1[130]={
  64.                                                         4304,4270,4235,4198,4161,4122,4083,4042,4001,3958,
  65.                                                         3914,3870,3824,3778,3731,3683,3635,3585,3535,3484,
  66.                                                         3433,3381,3329,3276,3223,3169,3116,3062,3008,2953,
  67.                                                         2899,2844,2789,2733,2678,2622,2568,2514,2459,2405,
  68.                                                         2353,2299,2248,2196,2145,2095,2045,1996,1948,1901,
  69.                                                         1854,1808,1763,1719,1676,1599,1590,1549,1508,1468,
  70.                                                         1429,1391,1354,1318,1282,1247,1214,1181,1149,1117,
  71.                                                         1087,1057,1028,1000,973 ,946 ,920 ,895 ,870 ,846 ,
  72.                                                         823 ,800 ,777 ,755 ,755 ,713 ,692 ,673 ,654 ,632 ,
  73.                                                         617 ,600 ,583 ,567 ,551 ,536 ,521 ,506 ,491 ,478 ,
  74.                                                         465 ,452 ,440 ,428 ,417 ,405 ,394 ,384 ,373 ,364 ,
  75.                                                         354 ,345 ,335 ,326 ,318 ,310 ,302 ,294 ,286 ,279 ,
  76.                                                         271 ,265 ,258 ,252 ,245 ,239 ,233 ,227 ,222 ,216 ,
  77.                                                  };               
  78. //*****************************************************************************************************************
  79. #pragma data:data
  80. uchar card_data[5][5]={
  81.                                                 {0,0,0,0,0},                                                //卡1
  82.                                                 {0,0,0,0,0},                                                //卡2
  83.                                                 {0,0,0,0,0},                                                //卡3
  84.                                                 {0,0,0,0,0},                                                //卡4
  85.                                                 {0,0,0,0,0},                                                //卡5
  86.                                           };                        
  87. uchar tem[7]={7, 5, 1, 8, 0, 0, 6};                                                        //日期、時間、星期數(shù)組
  88. //                          年/月/日 /H /M /S /W

  89. //********************************************目錄結構體定義*******************************************************
  90. struct menu_item      
  91. {
  92.     short menu_count;
  93.     char *display_string;
  94.     void (*subs)();
  95.     struct menu_item *children_menus;
  96.     struct menu_item *parent_menus;
  97. };
  98. //**********************************************結構數(shù)組聲明*******************************************************
  99. struct menu_item main_menu[4];
  100. struct menu_item alarm_menu[2];
  101. struct menu_item infrared_menu[2];
  102. struct menu_item lamp_menu[2];
  103. struct menu_item (*menu_point) = main_menu;

  104. struct menu_item card_main_menu[4];
  105. struct menu_item card_inc_menu[2];
  106. struct menu_item card_dec_menu[2];
  107. struct menu_item (*menu_card) = card_main_menu;

  108. uchar user_choose = 0;
  109. uchar max_items=0;
  110. uint temp_value=0;                                                        //溫度檢測AD值
  111. //********************************************變量定義*************************************************************
  112. uchar second_temp=0;                                                //秒變量
  113. uchar scan_en=0;                                                        //主屏掃描標志位
  114. uchar key=0;                                                                //按鍵變量
  115. uchar kk=0;                                                                        //按鍵按下標志位
  116. uchar auto_return=0;                                                //菜單自動返回變量
  117. uchar return_en=0;                                                        //菜單自動返回標志位
  118. uchar left_right=0;                                                        //左右鍵變量
  119. uchar choose_temp=0;                                                //子菜單標題變量
  120. uchar return_temp=0;                                                //返回臨時變量
  121. uchar set_time_temp=0;                                                //設置時間時菜單變量,如果=1表示屏顯在設置時間菜單
  122. uchar twinkling_addr=0x91;                                        //設置時間時閃動顯示位置變量
  123. uchar inc_card_en=0;                                                //添加新卡允許變量
  124. uchar manage_card_inc_en=0;                                        //管理卡
  125. uchar cold=0;                                                                //溫度正負極標志位
  126. uchar temp0=0;                                                                //溫度值變量
  127. uchar xx=88;                                                                //溫度更新變量,開機賦一個比較大的數(shù),目的是開機就顯示溫度
  128. uchar close_read=0;
  129. lcd_back_en=0;                                                                //LCD背光計時變量允許
  130. lcd_back_time=0;                                                        //LCD背光計時變量
  131. //*****************************************************************************************************************
  132. void delay_ms (unsigned int m);                                //延時
  133. void read_adc(void);                                                //按鍵ADC處理
  134. void date_time_display(void);                                //時間日期顯示
  135. void root_directory(void);                                        //引導主畫面
  136. void set_menu(void);                                                //設置菜單
  137. void clear_screen(void);                                        //清屏
  138. void clear_gdram(void);                                                //清全部GDRAM
  139. void select_menu(uchar data1);                                //選擇菜單時,標志
  140. void time_set_display(void);                                //時間、日期設置顯示
  141. uint adc_sampling(uchar adc_input);                        //ADC采樣
  142. uchar get_degree(void);                                                //溫度查表
  143. uchar temperature_check(void);                                //室溫檢測
  144. uchar charge_tem=0;                                                        //每十分鐘,檢測一次電池電量,此變量主要是計時
  145. uint battery_temp=0;                                                //電平電壓變量
  146. //************************************************函 數(shù) 聲 明 區(qū)***************************************************
  147. void main_menu_initial(void);                                 //主菜單初始化
  148. void alarm_menu_initial(void);                          //報警菜單初始化
  149. void infrared_menu_initial(void);
  150. void lamp_menu_initial(void);
  151. void menu_initial(void);

  152. void card_main_menu_initial(void);
  153. void card_inc_menu_initial(void);
  154. void card_dec_menu_initial(void);

  155. void show_menu(void);
  156. void date_time_set(void);
  157. void alarm_set(void);
  158. void infrared_set(void);
  159. void lamp_set(void);
  160. void nullsubs(void);
  161. void twinkling_addr_pro(void);
  162. void lcd_week_pro(void);
  163. void key_inc_dec(void);
  164. void lcd_menu_set(void);
  165. void card_pro(void);
  166. void buzzer_pro(uchar p);
  167. //*****************************************************************************************************************
  168. void inc_new_card(void);                                                //添加新卡的處理函數(shù)
  169. void query_card(void);                                                        //查詢卡函數(shù)
  170. void save_card(void);                                                        //保存卡時處理函數(shù)
  171. void no_save_card(void);                                                //取消保存卡時處理函數(shù)
  172. void clear_card(void);                                                        //刪除全部卡
  173. void no_clear_card(void);                                                //取消刪除卡
  174. void card_menu_show(void);                                                //管理卡菜單顯示
  175. void card_menu_pro(void);                                                //管理卡菜單處理
  176. void char_twinkling(uchar data_1);                                //字符消隱                                       
  177. //*****************************************************************************************************************
  178. void eeprom_write(uint eeprom_address, uchar eeprom_data);                        //寫----EEPROM 操作
  179. uchar eeprom_read(uint eeprom_address);                                                                //讀----EEPROM 操作
  180. //*************************************************主程序**********************************************************
  181. void main(void)
  182. {
  183.         PORTA=0XF8;                                                        //PA0---按鍵AD;PA1---室內溫度AD;PA2---電平電量檢測
  184.         PORTB=0XFF;
  185.         PORTC=0XFF;
  186.         PORTD=0XFF;
  187.         DDRA =0XF8;                                                        //AD轉換時要設為輸入、且端口要清0
  188.         DDRB =0XFF;
  189.         DDRC =0b11111000;
  190.         DDRD =0b11110010;                                        //INT0、INT1、RXD設成輸入;TXD設成輸出
  191.         TIMSK=(1<<OCIE1A);                                        //輸出比較A 匹配中斷使能
  192.         TCCR1A=0;                                       
  193.         TCCR1B=0X0D;                                                //CTC模式,1024分頻
  194.         OCR1A=7200;                                                        //定時1S
  195.         GICR=(1<<INT1)|(1<<INT0);                        //打開外部中斷0、1
  196.         MCUCR=(1<<ISC00);                                        //INT0 引腳上任意的邏輯電平變化都將引發(fā)中斷
  197.         ADCSRA=(1<<ADEN)|0x06;                                //使能ADC,時鐘64分頻 125KHz@8MHz system clock
  198.         WDTCR=0x0f;                                                        //(1<<WDE)|(1<<WDP2)|(1<<WDP1);        //打開看門狗,溢出時間為2.1S
  199.         write_com(0x01);                                        //清除顯示,并且設定地址指針為00H
  200.         menu_initial();                                                //菜單數(shù)組初始化
  201.         send_initial();                                                //串口初始化
  202.         WDR();                                                                //喂狗
  203.         card_pro();                                                        //讀EEPROM,到RAM中
  204.         lcd_reset();                                                //LCD初始化
  205.         write_com(0x90);
  206.         buzzer_on;
  207.         LCD_BACK_ON;                                                                                                        //打開LCD背光
  208.         han_zi_display("  系統(tǒng)正在啟動  ");
  209.         write_com(0x88);
  210.         han_zi_display("    請稍后......");
  211.         delay_ms(500);
  212.         clear_gdram();                                                //清除GDRAM--繪圖RAM
  213.         clear_screen();                                                //清屏
  214.         buzzer_off;                                                                                                        //峰鳴器指示
  215.         lcd_back_en=0xaa;                                                                                                //打開計時變量
  216.         lcd_back_time=0;                                                                                                //計時變量清0
  217.         SEI();                                                                //使能全局中斷
  218.         while(1)
  219.         {
  220.                 WDR();                                                        //喂狗
  221.                 if(scan_en==0)                                        //只有在scan_en=0的時候掃描主屏,平時只更新時間
  222.                 {
  223.                         scan_en=~scan_en;
  224.                         clear_screen();
  225.                         temp0=temperature_check();        //溫度檢測
  226.                         root_directory();
  227.                 }
  228.                 if(second_temp!=tem[5])                        //每秒鐘掃描一次
  229.                 {
  230.                         second_temp=tem[5];
  231.                         date_time_display();
  232.                 }
  233.                 if(close_read==1)
  234.                 {
  235.                         if(xx>=5)
  236.                         {
  237.                                 xx=0;
  238.                                 close_read=0;
  239.                                 second_temp=0;
  240.                                 GICR=((1<<INT1)|(1<<INT0));                                                        //開外部中斷0、1
  241.                         }
  242.                 }
  243.                 if(kk)                                                                                                                //=1表示有按鍵按下
  244.                 {
  245.                         kk=0;
  246.                         read_adc();                                                                                                //AD轉換,取得鍵值
  247.                         buzzer_pro(1);                                                                                        //峰鳴器指示
  248.                         LCD_BACK_ON;                                                                                        //打開LCD背光
  249.                         lcd_back_en=0xaa;                                                                                                //打開計時變量
  250.                         lcd_back_time=0;                                                                                //計時變量清0
  251.                         if(key==1)
  252.                         {
  253.                                 GICR&=~(1<<INT0);                                                                        //關閉讀卡外部中斷0
  254.                                 lcd_menu_set();                                                                                //LCD菜單設置
  255.                                 GICR=((1<<INT1)|(1<<INT0));                                                        //開外部中斷0、1
  256.                         }
  257.                         else if(key==8)
  258.                         {
  259.                                 GICR&=~((1<<INT1)|(1<<INT0));                                                //關閉部中斷0、1
  260.                                 key=0;
  261.                                 clear_screen();                                                                                //清屏
  262.                                 write_com(0x80);                                
  263.                                 han_zi_display("      警  告  ");
  264.                                 write_com(0x88);                                
  265.                                 han_zi_display("版權歸于軍峰所有");
  266.                                 write_com(0x98);                                
  267.                                 han_zi_display("    拷貝必究!!!");
  268.                                 delay_ms(6000);
  269.                                 scan_en=0;                                                                                        //主菜單調用允許標志位
  270.                                 clear_screen();                //**************
  271.                                 GICR=((1<<INT1)|(1<<INT0));                                                        //開外部中斷0、1
  272.                         }
  273.                         else
  274.                         {
  275.                                 key=0;
  276.                                 GICR=((1<<INT1)|(1<<INT0));                                                        //開外部中斷0、1
  277.                         }
  278.                 }
  279.                 WDR();                                                                                                        //喂狗
  280.                 if(inc_card_en==0xaa)                                                                        //=0xaa表示調用管理菜單允許
  281.                 {
  282.                         inc_card_en=0;
  283.                         rev_dat[0]=rev_dat[1]=rev_dat[2]=rev_dat[3]=rev_dat[4]=0xff;
  284.                         lcd_dis_num=0;
  285.                         card_menu_pro();
  286.                         GICR=((1<<INT1)|(1<<INT0));                                                        //開外部中斷0、1
  287.                 }
  288.                 if(charge_tem>=BATTERY_TIME)        
  289.                 {
  290.                         charge_tem=0;
  291.                         battery_temp=0;
  292.                         WDR();                                                                                                //喂狗
  293.                         battery_temp=adc_sampling(ADC_PINA2);                                //AD采樣電平電量
  294.                         if(battery_temp<=3750)                                                                //3750=12V,當電平電壓小于12V時,開始充電
  295.                         {
  296.                                 charge_on;
  297.                                 if(CHARGE_STATUS!=0)
  298.                                 {
  299.                                         buzzer_pro(10);                                                                                        //峰鳴器指示
  300.                                 }
  301.                         }
  302.                         else if((CHARGE_STATUS==1)||(battery_temp>=4375))        //如果大于4375=14V,表示要關閉充電器
  303.                         {
  304.                                 charge_off;
  305.                         }
  306.                 }                                                        
  307.         }
  308. }
  309. //************************************************管理卡主菜單操作*************************************************
  310. void card_menu_pro(void)
  311. {
  312.         clear_screen();
  313.         menu_card= card_main_menu;
  314.         user_choose=0;
  315.         card_menu_show();
  316.         return_en=1;                                                                                                //打開菜單自動返回變量
  317.         GICR|=(1<<INT1);                                                                                        //打開外部中斷1***********************        
  318.         while(auto_return<OVER_FLOW)
  319.         {
  320.                 WDR();                                                                                                        //喂狗
  321.                 if(kk)
  322.                 {
  323.                         kk=0;
  324.                         auto_return=0;                                                                                //清除菜單自動返回累計時間變量
  325.                         read_adc();
  326.                         buzzer_pro(1);                                                                                //峰鳴器指示
  327.                         LCD_BACK_ON;                                                                                //打開LCD背光
  328.                         lcd_back_en=0xaa;                                                                        //打開計時變量
  329.                         lcd_back_time=0;                                                                        //計時變量清0
  330.                         WDR();
  331.                         switch(key)
  332.                         {
  333.                                 case 0:                                                                                        //沒有按下按鍵
  334.                                                 break;
  335.                                 case 1:                                                                                        //設置
  336.                                                 key=0;
  337.                                                 break;
  338.                                 case 2:                                                                                        //向上
  339.                                                 key=0;
  340.                             if (user_choose == 0)
  341.                             {
  342.                                 user_choose = max_items;
  343.                             }
  344.                             user_choose --;
  345.                                                 break;
  346.                                 case 3:                                                                                        //向下
  347.                                                 key=0;
  348.                             user_choose ++;
  349.                             if (user_choose == max_items)
  350.                             {
  351.                                 user_choose = 0;
  352.                             }
  353.                                                 break;
  354.                                 case 4:                                                                                        //向左
  355.                                                 key=0;
  356.                                                 break;
  357.                                 case 5:                                                                                        //向右
  358.                                                 key=0;
  359.                                                 break;
  360.                                 case 6:                                                                                        //確認
  361.                                                 key=0;
  362.                             if (menu_card[user_choose].subs != nullsubs)
  363.                             {
  364.                                     
  365.                                                         (*menu_card[user_choose].subs)();
  366.                             }
  367.                             WDR();                                                                                                                //喂狗        
  368.                             if(menu_card[user_choose].children_menus != null)
  369.                             {
  370.                                     choose_temp=user_choose;
  371.                                 menu_card = menu_card[user_choose].children_menus;                 //把結構指針還指向子菜單
  372.                                 user_choose = 0;
  373.                             }
  374.                                                 break;
  375.                                 case 7:                                                                                                        //返回
  376.                                                 key=0;
  377.                             menu_card= card_main_menu;
  378.                                                 auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  379.                                                 break;
  380.                                 case 8:                                                                                                        //說明
  381.                                                 key=0;
  382.                                                 break;
  383.                                 default:
  384.                                                 key=0;
  385.                                                 break;
  386.             }
  387.             card_menu_show();
  388.             GICR|=(1<<INT1);                        //打開外部中斷1***********************        
  389.             key=0;
  390.             kk=0;
  391.         }
  392.         }
  393.         scan_en=0;                                                                //主菜單調用允許標志位
  394.         return_en=0;                                                        //菜單自動計時返回允許標志位
  395.         auto_return=0;                                                        //菜單自動計時返回變量
  396.         key=0;                                                                        //按鍵值清0
  397.         return_temp=0;                                                        //返回臨時變量清0
  398.     user_choose = 0;
  399.     choose_temp=0;
  400.     inc_card_en=0;
  401.     menu_card = card_main_menu;                                //把結構指針還指向主菜單
  402.     clear_screen();                                                        //清除DDRAM--顯示資料寄存器
  403.     GICR=((1<<INT1)|(1<<INT0));                                //開外部中斷0、1
  404. }
  405. //*********************************************字符消隱************************************************************
  406. void char_twinkling(uchar data_1)
  407. {
  408.         write_com(data_1);
  409.         write_com(data_1);
  410.         write_data(0x20);                                                        //設置時間時,字符閃動
  411.         write_data(0x20);
  412. }
  413. //**********************************************管理操作時的菜單***************************************************
  414. void card_menu_show(void)
  415. {
  416.     uchar n = 0;
  417.     WDR();                                                                                                        //喂狗
  418.     max_items = menu_card[0].menu_count;
  419.         if (max_items >= 3)
  420.         {
  421.         for (n = 0;n<3;n++)
  422.         {
  423.                 switch(n)
  424.                 {
  425.                         case 0:
  426.                                         write_com(0x80);
  427.                                         break;
  428.                         case 1:
  429.                                         write_com(0x90);
  430.                                         break;
  431.                         case 2:
  432.                                         write_com(0x88);
  433.                                         break;
  434.                         default:
  435.                                         break;
  436.                 }
  437.                         han_zi_display(menu_card[n].display_string);
  438.             if (n == user_choose)
  439.             {
  440.                         switch(n)
  441.                         {
  442.                                 case 0:
  443.                                                 select_menu(0x80);
  444.                                                 break;
  445.                                 case 1:
  446.                                                 select_menu(0x90);
  447.                                                 break;        
  448.                                 case 2:
  449.                                                 select_menu(0x88);
  450.                                                 break;        
  451.                                 default:
  452.                                                 break;
  453.                         }
  454.             }
  455.         }
  456.         }
  457.         else                                                                                                                         //子菜單選擇
  458.     {
  459.             clear_screen();
  460.         for (n = 0;n<max_items;n++)
  461.         {
  462.                 write_com(0x80);
  463.                 switch(choose_temp)
  464.                 {
  465.                         case 0:
  466.                                         han_zi_display("  1.添加新卡?");
  467.                                         break;
  468.                         case 1:
  469.                                         han_zi_display("  2.刪除全部卡?");
  470.                                         break;        
  471.                         case 2:
  472.                                         han_zi_display("  3.查詢卡記錄?");
  473.                                         break;
  474.                         default:
  475.                                         break;
  476.                 }
  477.             if(n==0)
  478.             {
  479.                                 write_com(0x88);
  480.                         }
  481.             else if(n==1)
  482.             {
  483.                                 write_com(0x98);
  484.                         }
  485.                         han_zi_display(menu_card[n].display_string);
  486.             if (n == user_choose)
  487.             {
  488.                     if(n==0)
  489.                     {
  490.                             select_menu(0x89);
  491.                     }
  492.                     else if(n==1)
  493.                     {
  494.                             select_menu(0x99);
  495.                     }               
  496.             }
  497.         }
  498.     }
  499. }
  500. //**********************************************UART初始化*********************************************************
  501. void send_initial(void)
  502. {
  503.     UBRRL= (F_CPU/BAUDRATE/16-1)%256;
  504.     UBRRH= (F_CPU/BAUDRATE/16-1)/256;
  505.         UCSRB=(1<<TXEN);                                                                        //發(fā)送使能,
  506.         UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                                //無奇偶校驗,設置幀格式: 8 個數(shù)據位, 1 個停止位
  507. }
  508. //*********************************************EEPROM 操作*********************************************************
  509. //*********************************************寫----EEPROM 操作***************************************************
  510. void eeprom_write(uint eeprom_address, uchar eeprom_data)
  511. {
  512.         CLI();
  513.         while(EECR & (1<<EEWE));                                                        //等待上一次寫操作結束
  514.         EEAR = eeprom_address;                                                                 //設置地址和數(shù)據寄存器
  515.         EEDR = eeprom_data;
  516.         EECR |= (1<<EEMWE);                                                                        //置位EEMWE
  517.         EECR |= (1<<EEWE);                                                                        //置位EEWE 以啟動寫操作
  518.         SEI();
  519. }
  520. //********************************************讀----EEPROM 操作****************************************************
  521. uchar eeprom_read(uint eeprom_address)
  522. {
  523.         CLI();
  524.         while(EECR & (1<<EEWE));                                                        //等待上一次寫操作結束
  525.         EEAR = eeprom_address;                                                                         //設置地址寄存器
  526.         EECR |= (1<<EERE);                                                                        //設置EERE 以啟動讀操作
  527.         SEI();
  528.         return EEDR;                                                                                //自數(shù)據寄存器返回數(shù)據
  529. }
  530. //***********************************************LCD菜單設置*******************************************************
  531. //說明:如果進入菜單在30秒內沒有動作,將自動反回主畫面
  532. //*****************************************************************************************************************
  533. void lcd_menu_set(void)
  534. {
  535.         uchar tem_2[7]={0,0,0,0,0,0,0};                                                                //日期、時間、星期數(shù)組備份
  536. //                               年/月/日/H/M/S/W
  537.         key=0;
  538.         menu_point = main_menu;                                                                         //把結構指針還指向主菜單
  539.         user_choose=0;
  540.         clear_screen();
  541.         WDR();
  542.          show_menu();                                                                                                 //顯示菜單
  543.          return_en=1;                                                                                                //打開菜單自動返回變量
  544.          GICR|=(1<<INT1);                                                                                        //打開外部中斷1
  545.         while(auto_return<OVER_FLOW)
  546.         {
  547.                 WDR();                                                                                                        //喂狗
  548.                 if(kk)
  549.                 {
  550.                         kk=0;
  551.                         auto_return=0;                                                                                //清除菜單自動返回累計時間變量
  552.                         read_adc();
  553.                         buzzer_pro(1);                                                                                //峰鳴器指示
  554.                         LCD_BACK_ON;                                                                                //打開LCD背光
  555.                         lcd_back_en=0xaa;                                                                        //打開計時變量
  556.                         lcd_back_time=0;                                                                        //計時變量清0
  557.                         WDR();                                                                                                //喂狗
  558.                         switch(key)
  559.                         {
  560.                                 case 0:                                                                                        //沒有按下按鍵
  561.                                                 break;
  562.                                 case 1:                                                                                        //設置
  563.                                                 break;
  564.                                 case 2:                                                                                        //向上
  565.                                                 key=0;
  566.                             if (user_choose == 0)
  567.                             {
  568.                                 user_choose = max_items;
  569.                             }
  570.                             user_choose --;
  571.                             return_temp=0;                                                        //返回臨時變量清0
  572.                                                 break;
  573.                                 case 3:                                                                                        //向下
  574.                                                 key=0;
  575.                             user_choose ++;
  576.                             if (user_choose == max_items)
  577.                             {
  578.                                 user_choose = 0;
  579.                             }
  580.                             return_temp=0;                                                        //返回臨時變量清0
  581.                                                 break;
  582.                                 case 4:                                                                                        //向左
  583.                                                 key=0;
  584.                                                 if(left_right==0)
  585.                                                 {
  586.                                                         left_right=6;
  587.                                                 }
  588.                                                 left_right--;
  589.                                                 twinkling_addr_pro();                                        //調用閃動地址選擇
  590.                                                 break;
  591.                                 case 5:                                                                                        //向右
  592.                                                 key=0;
  593.                                                 left_right++;
  594.                                                 if(left_right>=6)
  595.                                                 {
  596.                                                         left_right=0;
  597.                                                 }
  598.                                                 twinkling_addr_pro();                                        //調用閃動地址選擇
  599.                                                 break;
  600.                                 case 6:                                                                                        //確認
  601.                                                 key=0;
  602.                             if(set_time_temp==1)
  603.                                                 {
  604.                                                         auto_return=88;                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  605.                                                         set_time_temp=0;
  606.                                                         clear_screen();
  607.                                                         write_com(0x90);                                
  608.                                                         han_zi_display("  時間設置完成");
  609.                                                         delay_ms(2000);
  610.                                                         break;
  611.                                                 }
  612.                             if (menu_point[user_choose].subs != nullsubs)
  613.                             {
  614.                                     left_right=0;
  615.                                 tem_2[0]=tem[0];                                        //把日期、時間變量做個備份
  616.                                                         tem_2[1]=tem[1];
  617.                                                         tem_2[2]=tem[2];
  618.                                                         tem_2[3]=tem[3];
  619.                                                         tem_2[4]=tem[4];
  620.                                                         tem_2[5]=tem[5];
  621.                                                         tem_2[6]=tem[6];
  622.                                                         (*menu_point[user_choose].subs)();
  623.                             }
  624.                             else if(menu_point[user_choose].children_menus != null)         
  625.                             {
  626.                                     choose_temp=user_choose;
  627.                                 menu_point = menu_point[user_choose].children_menus;                 //把結構指針還指向子菜單
  628.                                 user_choose = 0;
  629.                             }
  630.                                                 break;
  631.                                 case 7:                                                                                                        //返回
  632.                                                 key=0;
  633.                                                 return_temp++;
  634.                                                 if(return_temp==1)
  635.                                                 {
  636.                                     menu_point = main_menu;
  637.                                     user_choose = 0;
  638.                                     left_right=0;
  639.                                     if(set_time_temp==1)
  640.                                     {
  641.                                                                 clear_screen();
  642.                                                                 set_time_temp=0;
  643.                                             tem[0]=tem_2[0];                                                //還原設置前的日期、時間數(shù)據
  644.                                             tem[1]=tem_2[1];
  645.                                             tem[2]=tem_2[2];
  646.                                             tem[3]=tem_2[3];
  647.                                             tem[4]=tem_2[4];
  648.                                             tem[5]=tem_2[5];
  649.                                             tem[6]=tem_2[6];
  650.                                             auto_return=88;                                                        //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  651.                                             break;
  652.                                                         }
  653.                                                 }
  654.                                                 else
  655.                                                 {
  656.                                                         return_temp=0;
  657.                                                         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  658.                                                 }
  659.                                                 break;
  660.                                 case 8:                                                                                                        //說明
  661.                                                 key=0;
  662.                                                 break;
  663.                                 default:
  664.                                                 key=0;
  665.                                                 break;
  666.             }
  667.                    if(set_time_temp==0)
  668.                    {
  669.                     show_menu();
  670.             }
  671.             else                                                                                                                //!=0表示菜單處在修改日期一欄
  672.             {
  673.                     date_time_set();
  674.             }   
  675.             key=0;
  676.             kk=0;
  677.             GICR|=(1<<INT1);                                                                                        //打開外部中斷1
  678.         }
  679.         if(set_time_temp==1)
  680.         {
  681.                 GICR&=~(1<<INT1);                                                                                                //關閉按鍵中斷
  682.                        key_inc_dec();                                                                                                        //按鍵+、-處理
  683.                        GICR|=(1<<INT1);                                                                                                //打開按鍵中斷
  684.                         time_set_display();
  685.                         delay_ms(100);
  686.                         char_twinkling(twinkling_addr);
  687.                         delay_ms(100);
  688.                }
  689.    
  690.         }
  691.         clear_screen();                                                        //清除DDRAM--顯示資料寄存器
  692.         scan_en=0;                                                                //主菜單調用允許標志位
  693.         return_en=0;                                                        //菜單自動計時返回允許標志位
  694.         auto_return=0;                                                        //菜單自動計時返回變量
  695.         key=0;                                                                        //按鍵值清0
  696.         return_temp=0;                                                        //返回臨時變量清0
  697.     user_choose = 0;
  698.     menu_point = main_menu;                                 //把結構指針還指向主菜單
  699.     set_time_temp=0;                                                //日期、時間設置菜單變量
  700.         twinkling_addr=0x91;
  701.         left_right=0;
  702. }
  703. //***************************************************按鍵+、-處理**************************************************
  704. void key_inc_dec(void)
  705. {
  706.     if(key_inc==0)
  707.     {
  708.             delay_ms(5);
  709.             if(key_inc==0)
  710.             {
  711.                         buzzer_pro(1);                                                                                                        //峰鳴器指示
  712.                         LCD_BACK_ON;                                                                                                        //打開LCD背光
  713.                         lcd_back_time=0;                                                                                                //計時變量清0
  714.                         lcd_back_en=0xaa;                                                                                                //打開計時變量
  715.                         auto_return=0;                                                                                                        //清除菜單自動返回累計時間變量
  716.                     switch(twinkling_addr)
  717.                     {
  718.                             case 0x88:                                                                                                        //小時選項
  719.                                                     do
  720.                                                     {
  721.                                                             tem[3]++;
  722.                                                             if(tem[3]>=24)
  723.                                                             {
  724.                                                                     tem[3]=0;
  725.                                                             }
  726.                                                                 time_set_display();                                                        //更新顯示
  727.                                                                 delay_ms(200);
  728.                                                             auto_return=0;
  729.                                                     }
  730.                                                     while(key_inc==0);
  731.                                                     break;
  732.                             case 0x8a:                                                                                                        //分鐘選項
  733.                                                     do
  734.                                                     {
  735.                                                             tem[4]++;
  736.                                                             if(tem[4]>=60)
  737.                                                             {
  738.                                                                     tem[4]=0;
  739.                                                             }
  740.                                                                 time_set_display();                                                        //更新顯示
  741.                                                                 delay_ms(120);
  742.                                                             auto_return=0;
  743.                                                     }
  744.                                                     while(key_inc==0);
  745.                                                     break;
  746.                             case 0x8f:                                                                                                        //星期選項
  747.                                                     do
  748.                                                     {
  749.                                                             tem[6]++;
  750.                                                             if(tem[6]>=7)
  751.                                                             {
  752.                                                                     tem[6]=0;
  753.                                                             }
  754.                                                             time_set_display();                                                        //更新顯示
  755.                                                                 delay_ms(200);
  756.                                                             auto_return=0;
  757.                                                     }
  758.                                                     while(key_inc==0);
  759.                                                     break;
  760.                             case 0x91:                                                                                                        //年選項
  761.                                                     do
  762.                                                     {
  763.                                                             tem[0]++;
  764.                                                             if(tem[0]>=29)
  765.                                                             {
  766.                                                                     tem[0]=7;
  767.                                                             }
  768.                                                                 time_set_display();                                                        //更新顯示
  769.                                                                 delay_ms(200);
  770.                                                             auto_return=0;
  771.                                                     }
  772.                                                     while(key_inc==0);
  773.                                                     break;
  774.                             case 0x93:                                                                                                        //月選項
  775.                                                     do
  776.                                                     {
  777.                                                             tem[1]++;
  778.                                                             if(tem[1]>=13)
  779.                                                             {
  780.                                                                     tem[1]=1;
  781.                                                             }
  782.                                                                 time_set_display();                                                        //更新顯示
  783.                                                                 delay_ms(200);
  784.                                                             auto_return=0;
  785.                                                     }
  786.                                                     while(key_inc==0);
  787.                                                     break;                                                                    
  788.                             case 0x95:                                                                                                        //日選項
  789.                                                     do
  790.                                                     {
  791.                                                             tem[2]++;
  792.                                                             if(tem[2]>=32)
  793.                                                             {
  794.                                                                     tem[2]=1;
  795.                                                             }
  796.                                                                 time_set_display();                                                        //更新顯示
  797.                                                                 delay_ms(150);
  798.                                                             auto_return=0;
  799.                                                     }
  800.                                                     while(key_inc==0);
  801.                                                     break;
  802.                             default:
  803.                                                     break;               
  804.                     }
  805.             }
  806.     }
  807.     if(key_dec==0)
  808.     {
  809.             delay_ms(5);
  810.             if(key_dec==0)
  811.             {
  812.                         buzzer_pro(1);                                                                                                        //峰鳴器指示
  813.                         LCD_BACK_ON;                                                                                                        //打開LCD背光
  814.                         lcd_back_time=0;                                                                                                //計時變量清0
  815.                         lcd_back_en=0xaa;                                                                                                //打開計時變量
  816.                         auto_return=0;                                                                                                        //清除菜單自動返回累計時間變量
  817.                     switch(twinkling_addr)
  818.                     {
  819.                             case 0x88:                                                                                                        //小時選項
  820.                                                     do
  821.                                                     {
  822.                                                             if(tem[3]==0)
  823.                                                             {
  824.                                                                     tem[3]=24;
  825.                                                             }
  826.                                                             tem[3]--;
  827.                                                                 time_set_display();                                                        //更新顯示
  828.                                                                 delay_ms(200);
  829.                                                             auto_return=0;
  830.                                                     }
  831.                                                     while(key_dec==0);
  832.                                                     break;
  833.                             case 0x8a:                                                                                                        //分鐘選項
  834.                                                     do
  835.                                                     {
  836.                                                             if(tem[4]==0)
  837.                                                             {
  838.                                                                     tem[4]=60;
  839.                                                             }
  840.                                                             tem[4]--;
  841.                                                                 time_set_display();                                                        //更新顯示
  842.                                                                 delay_ms(120);
  843.                                                             auto_return=0;
  844.                                                     }
  845.                                                     while(key_dec==0);
  846.                                                     break;
  847.                             case 0x8f:                                                                                                        //星期選項
  848.                                                     do
  849.                                                     {
  850.                                                             if(tem[6]==0)
  851.                                                             {
  852.                                                                     tem[6]=7;
  853.                                                             }
  854.                                                             tem[6]--;
  855.                                                                 time_set_display();                                                        //更新顯示
  856.                                                                 delay_ms(200);
  857.                                                             auto_return=0;
  858.                                                     }
  859.                                                     while(key_dec==0);
  860.                                                     break;
  861.                             case 0x91:                                                                                                        //年選項
  862.                                                     do
  863.                                                     {
  864.                                                             if(tem[0]==7)
  865.                                                             {
  866.                                                                     tem[0]=29;
  867.                                                             }
  868.                                                             tem[0]--;
  869.                                                                 time_set_display();                                                        //更新顯示
  870.                                                                 delay_ms(200);
  871.                                                             auto_return=0;
  872.                                                     }
  873.                                                     while(key_dec==0);
  874.                                                     break;
  875.                             case 0x93:                                                                                                        //月選項
  876.                                                     do
  877.                                                     {
  878.                                                             if(tem[1]==1)
  879.                                                             {
  880.                                                                     tem[1]=13;
  881.                                                             }
  882.                                                             tem[1]--;
  883.                                                                 time_set_display();                                                        //更新顯示
  884.                                                                 delay_ms(200);
  885.                                                             auto_return=0;
  886.                                                     }
  887.                                                     while(key_dec==0);
  888.                                                     break;                                                                    
  889.                             case 0x95:                                                                                                        //日選項
  890.                                                     do
  891.                                                     {
  892.                                                             if(tem[2]==1)
  893.                                                             {
  894.                                                                     tem[2]=32;
  895.                                                             }
  896.                                                             tem[2]--;
  897.                                                                 time_set_display();                                                        //更新顯示
  898.                                                                 delay_ms(150);
  899.                                                             auto_return=0;
  900.                                                     }
  901.                                                     while(key_dec==0);
  902.                                                     break;
  903.                             default:
  904.                                                     break;               
  905.                     }
  906.             }
  907.     }
  908. }
  909. //**************************************************字符閃動地址選擇***********************************************
  910. void twinkling_addr_pro(void)
  911. {
  912.         switch(left_right)
  913.         {
  914.                 case 0:
  915.                                 twinkling_addr=0x91;
  916.                                 break;
  917.                 case 1:
  918.                                 twinkling_addr=0x93;
  919.                                 break;
  920.                 case 2:
  921.                                 twinkling_addr=0x95;
  922.                                 break;
  923.                 case 3:
  924.                                 twinkling_addr=0x88;
  925.                                 break;               
  926.                 case 4:
  927.                                 twinkling_addr=0x8a;
  928.                                 break;
  929.                 case 5:
  930.                                 twinkling_addr=0x8f;
  931.                                 break;
  932.                 default:
  933.                                 break;
  934.         }        
  935.         clear_screen();        
  936.         return_temp=0;                                                                                        //返回臨時變量清0
  937. }
  938. //*************************************************顯示菜單********************************************************
  939. void show_menu(void)
  940. {
  941.     uchar n = 0;
  942.     max_items = menu_point[0].menu_count;
  943.     WDR();                                                                                                        //喂狗
  944.         if (max_items >= 4)
  945.         {
  946.         for (n = 0;n<4;n++)
  947.         {
  948.                 switch(n)
  949.                 {
  950.                         case 0:
  951.                                         write_com(0x80);
  952.                                         break;
  953.                         case 1:
  954.                                         write_com(0x90);
  955.                                         break;
  956.                         case 2:
  957.                                         write_com(0x88);
  958.                                         break;
  959.                         case 3:
  960.                                         write_com(0x98);
  961.                                         break;
  962.                         default:
  963.                                         break;
  964.                 }
  965.                         han_zi_display(menu_point[n].display_string);
  966.             if (n == user_choose)
  967.             {
  968.                         switch(n)
  969.                         {
  970.                                 case 0:
  971.                                                 select_menu(0x80);
  972.                                                 break;
  973.                                 case 1:
  974.                                                 select_menu(0x90);
  975.                                                 break;        
  976.                                 case 2:
  977.                                                 select_menu(0x88);
  978.                                                 break;
  979.                                 case 3:
  980.                                                 select_menu(0x98);
  981.                                                 break;
  982.                                 default:
  983.                                                 break;
  984.                         }
  985.             }
  986.         }
  987.         }
  988.         else                                                                                                                         //子菜單選擇
  989.     {
  990.             WDR();                                                                                                                //喂狗
  991.             clear_screen();
  992.         for (n = 0;n<max_items;n++)
  993.         {
  994.                 write_com(0x80);
  995.                 switch(choose_temp)
  996.                 {
  997.                         case 0:
  998.                                         han_zi_display("  1.時間日期設置");
  999.                                         break;
  1000.                         case 1:
  1001.                                         han_zi_display("  2.報警開關設置");
  1002.                                         break;        
  1003.                         case 2:
  1004.                                         han_zi_display("  3.人體紅外設置");
  1005.                                         break;
  1006.                         case 3:
  1007.                                         han_zi_display("  4.路燈開關設置");
  1008.                                         break;
  1009.                         default:
  1010.                                         break;
  1011.                 }
  1012.             if(n==0)
  1013.             {
  1014.                                 write_com(0x88);
  1015.                         }
  1016.             else if(n==1)
  1017.             {
  1018.                                 write_com(0x98);
  1019.                         }
  1020.                         han_zi_display(menu_point[n].display_string);
  1021.             if (n== user_choose)
  1022.             {
  1023.                     if(n==0)
  1024.                     {
  1025.                             select_menu(0x89);
  1026.                     }
  1027.                     else if(n==1)
  1028.                     {
  1029.                             select_menu(0x99);
  1030.                     }               
  1031.             }
  1032.         }
  1033.     }
  1034. }
  1035. //******************************************************初始化菜單目錄*********************************************
  1036. void menu_initial(void)
  1037. {
  1038.     main_menu_initial();
  1039.     alarm_menu_initial();
  1040.     infrared_menu_initial();
  1041.     lamp_menu_initial();
  1042.     card_main_menu_initial();
  1043.     card_inc_menu_initial();
  1044.     card_dec_menu_initial();
  1045. }
  1046. //******************************************************主目錄初始化函數(shù)*******************************************
  1047. void main_menu_initial(void)
  1048. {
  1049.      main_menu[0].menu_count = 4;
  1050.      main_menu[0].display_string = "  1.時間日期設置";
  1051.      main_menu[0].subs = date_time_set;
  1052.      main_menu[0].children_menus =null;  
  1053.      main_menu[0].parent_menus = null;  
  1054.      
  1055.      main_menu[1].menu_count = 4;
  1056.      main_menu[1].display_string = "  2.報警開關設置";
  1057.      main_menu[1].subs = nullsubs;
  1058.      main_menu[1].children_menus = alarm_menu;
  1059.      main_menu[1].parent_menus = null;  
  1060.      
  1061.      main_menu[2].menu_count = 4;
  1062.      main_menu[2].display_string = "  3.人體紅外設置";
  1063.      main_menu[2].subs = nullsubs;
  1064.      main_menu[2].children_menus = infrared_menu;
  1065.      main_menu[2].parent_menus = null;  

  1066.      main_menu[3].menu_count = 4;
  1067.      main_menu[3].display_string = "  4.路燈開關設置";
  1068.      main_menu[3].subs = nullsubs;
  1069.      main_menu[3].children_menus = lamp_menu;
  1070.      main_menu[3].parent_menus = null;
  1071. }
  1072. //**************************************************報警開關設置目錄初始化函數(shù)*************************************
  1073. void alarm_menu_initial(void)
  1074. {
  1075.     alarm_menu[0].menu_count = 2;
  1076.     alarm_menu[0].display_string = "    1.  打開    ";
  1077.     alarm_menu[0].subs = alarm_set;
  1078.     alarm_menu[0].children_menus = null;  //&null
  1079.     alarm_menu[0].parent_menus = main_menu;
  1080.      
  1081.     alarm_menu[1].menu_count = 2;
  1082.     alarm_menu[1].display_string = "    2.  關閉    ";
  1083.     alarm_menu[1].subs = alarm_set;
  1084.     alarm_menu[1].children_menus = null;  //&null
  1085.     alarm_menu[1].parent_menus = main_menu;
  1086. }
  1087. //*************************************************人體紅外開關設置目錄初始化函數(shù)**********************************
  1088. void infrared_menu_initial(void)
  1089. {
  1090.     infrared_menu[0].menu_count = 2;
  1091.     infrared_menu[0].display_string = "    1.  打開    ";
  1092.     infrared_menu[0].subs = infrared_set;
  1093.     infrared_menu[0].children_menus = null;  //&null
  1094.     infrared_menu[0].parent_menus = main_menu;
  1095.      
  1096.     infrared_menu[1].menu_count = 2;
  1097.     infrared_menu[1].display_string = "    2.  關閉    ";
  1098.     infrared_menu[1].subs = infrared_set;
  1099.     infrared_menu[1].children_menus = null;  //&null
  1100.     infrared_menu[1].parent_menus = main_menu;
  1101. }
  1102. //*************************************************路燈開關設置目錄初始化函數(shù)**************************************
  1103. void lamp_menu_initial(void)
  1104. {
  1105.     lamp_menu[0].menu_count = 2;
  1106.     lamp_menu[0].display_string = "    1.  打開    ";
  1107.     lamp_menu[0].subs = lamp_set;
  1108.     lamp_menu[0].children_menus = null;  
  1109.     lamp_menu[0].parent_menus = main_menu;
  1110.      
  1111.     lamp_menu[1].menu_count = 2;
  1112.     lamp_menu[1].display_string = "    2.  關閉    ";
  1113.     lamp_menu[1].subs = lamp_set;
  1114.     lamp_menu[1].children_menus = null;
  1115.     lamp_menu[1].parent_menus = main_menu;
  1116. }
  1117. //**********************************************管理卡操作主菜單***************************************************
  1118. void card_main_menu_initial(void)
  1119. {
  1120.      card_main_menu[0].menu_count = 3;
  1121.      card_main_menu[0].display_string = "  1.添加新卡?";
  1122.      card_main_menu[0].subs =inc_new_card;
  1123.      card_main_menu[0].children_menus =card_inc_menu;  
  1124.      card_main_menu[0].parent_menus = null;  
  1125.      
  1126.      card_main_menu[1].menu_count = 3;
  1127.      card_main_menu[1].display_string = "  2.刪除全部卡?";
  1128.      card_main_menu[1].subs = nullsubs;
  1129.      card_main_menu[1].children_menus = card_dec_menu;
  1130.      card_main_menu[1].parent_menus = null;  
  1131.      
  1132.      card_main_menu[2].menu_count = 3;
  1133.      card_main_menu[2].display_string = "  3.查詢卡記錄?";
  1134.      card_main_menu[2].subs = query_card;
  1135.      card_main_menu[2].children_menus = null;
  1136.      card_main_menu[2].parent_menus = null;  
  1137. }
  1138. //************************************************添加新卡子菜單***************************************************
  1139. void card_inc_menu_initial(void)
  1140. {
  1141.     card_inc_menu[0].menu_count = 2;
  1142.     card_inc_menu[0].display_string = "    1.  確認    ";
  1143.     card_inc_menu[0].subs = save_card;
  1144.     card_inc_menu[0].children_menus = null;
  1145.     card_inc_menu[0].parent_menus = main_menu;
  1146.      
  1147.     card_inc_menu[1].menu_count = 2;
  1148.     card_inc_menu[1].display_string = "    2.  取消    ";
  1149.     card_inc_menu[1].subs = no_save_card;
  1150.     card_inc_menu[1].children_menus = null;
  1151.     card_inc_menu[1].parent_menus = main_menu;
  1152. }
  1153. //************************************************刪除全部卡子菜單*************************************************
  1154. void card_dec_menu_initial(void)
  1155. {
  1156.     card_dec_menu[0].menu_count = 2;
  1157.     card_dec_menu[0].display_string = "    1.  確認    ";
  1158.     card_dec_menu[0].subs = clear_card;
  1159.     card_dec_menu[0].children_menus = null;
  1160.     card_dec_menu[0].parent_menus = main_menu;
  1161.      
  1162.     card_dec_menu[1].menu_count = 2;
  1163.     card_dec_menu[1].display_string = "    2.  取消    ";
  1164.     card_dec_menu[1].subs =no_clear_card;
  1165.     card_dec_menu[1].children_menus = null;
  1166.     card_dec_menu[1].parent_menus = main_menu;
  1167. }
  1168. //**************************************************增加新卡*******************************************************
  1169. void inc_new_card(void)
  1170. {
  1171.         uchar eeprom_addr=0;
  1172.         uchar uu=0;
  1173.         if(user_choose==0)
  1174.         {
  1175.                 manage_card_inc_en=0xaa;                                                                                //準備接收新卡號碼
  1176.                 clear_screen();
  1177.                 auto_return=0;                                                                                                        //菜單自動返回變量清0                                                                                                
  1178.                 write_com(0x80);
  1179.                 han_zi_display("    請刷卡!");
  1180.                 GICR|=(1<<INT0);                                                                                                //開外部中斷0
  1181.                 while((manage_card_inc_en==0xaa)&&(auto_return<OVER_FLOW))
  1182.                 {
  1183.                         WDR();                                                                                                                //喂狗        
  1184.                 }
  1185.                 if(manage_card_inc_en==0)
  1186.                 {
  1187.                         GICR&=~((1<<INT1)|(1<<INT0));                                                                //關閉外部中斷0、1
  1188.                         write_com(0x90);
  1189.                         han_zi_display("卡號:");        
  1190.                         write_com(0x93);
  1191.                         write_data(lcd_dis_num/10000000+0x30);
  1192.                         write_data(lcd_dis_num%10000000/1000000+0x30);
  1193.                         write_data(lcd_dis_num%10000000%1000000/100000+0x30);
  1194.                         write_data(lcd_dis_num%10000000%1000000%100000/10000+0x30);
  1195.                         write_data(lcd_dis_num%10000000%1000000%100000%10000/1000+0x30);
  1196.                         write_data(lcd_dis_num%10000000%1000000%100000%10000%1000/100+0x30);
  1197.                         write_data(lcd_dis_num%10000000%1000000%100000%10000%1000%100/10+0x30);
  1198.                         write_data(lcd_dis_num%10000000%1000000%100000%10000%1000%100%10+0x30);        
  1199.                         write_com(0x88);
  1200.                         han_zi_display("    請核對!");        
  1201.                         delay_ms(3000);
  1202.                 }
  1203.                 else
  1204.                 {
  1205.                         manage_card_inc_en=0;                                                                                //在請刷卡界面,如果沒有刷卡,自動返回后要清0此變量
  1206.                         lcd_dis_num=0;
  1207.                         auto_return=88;                                                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  1208.                 }
  1209.                 GICR|=(1<<INT1);                                                                                                //打開外部中斷1
  1210.                 auto_return=0;                                                                                                        //菜單自動返回變量清0
  1211.                 WDR();                                                                                                                        //喂狗
  1212.         }
  1213. }
  1214. //***************************************************卡數(shù)量查詢****************************************************
  1215. void query_card(void)
  1216. {
  1217.         ulong tem_1=0;
  1218.         uchar hh;
  1219.         card_pro();                                                                                                                        //把EEPROM數(shù)據讀出來
  1220.         GICR&=~((1<<INT1)|(1<<INT0));                                                                                //關閉外部中斷0、1
  1221.         clear_screen();
  1222.         WDR();                                                                                                                                //喂狗
  1223.         write_com(0x80);
  1224.         han_zi_display("卡記錄: 共五張卡");
  1225.         for(hh=0;hh<3;hh++)
  1226.         {
  1227.                 if(card_data[hh][4]==0xff)
  1228.                 {
  1229.                         tem_1=0;
  1230.                 }
  1231.                 else
  1232.                 {
  1233.                         tem_1=card_data[hh][1];
  1234.                         tem_1<<=8;
  1235.                         tem_1+=card_data[hh][2];
  1236.                         tem_1<<=8;
  1237.                         tem_1+=card_data[hh][3];
  1238.                         tem_1<<=8;
  1239.                         tem_1+=card_data[hh][4];
  1240.                 }
  1241.                 switch(hh)
  1242.                 {
  1243.                         case 0:
  1244.                                         write_com(0x90);
  1245.                                         han_zi_display("1.");        
  1246.                                         break;
  1247.                         case 1:
  1248.                                         write_com(0x88);
  1249.                                         han_zi_display("2.");        
  1250.                                         break;
  1251.                         case 2:
  1252.                                         write_com(0x98);
  1253.                                         han_zi_display("3.");        
  1254.                                         break;
  1255.                         default:
  1256.                                         break;               
  1257.                 }
  1258.                 WDR();                                                                                                                        //喂狗
  1259.                 write_data(tem_1/10000000+0x30);                                                                //顯示卡號
  1260.                 write_data(tem_1%10000000/1000000+0x30);
  1261.                 write_data(tem_1%10000000%1000000/100000+0x30);
  1262.                 write_data(tem_1%10000000%1000000%100000/10000+0x30);
  1263.                 write_data(tem_1%10000000%1000000%100000%10000/1000+0x30);
  1264.                 write_data(tem_1%10000000%1000000%100000%10000%1000/100+0x30);
  1265.                 write_data(tem_1%10000000%1000000%100000%10000%1000%100/10+0x30);
  1266.                 write_data(tem_1%10000000%1000000%100000%10000%1000%100%10+0x30);        
  1267.         }
  1268.         delay_ms(5000);
  1269.         clear_screen();
  1270.         write_com(0x80);
  1271.         han_zi_display("卡記錄: 共五張卡");
  1272.         for(hh=3;hh<5;hh++)
  1273.         {
  1274.                 if(card_data[hh][4]==0xff)
  1275.                 {
  1276.                         tem_1=0;
  1277.                 }
  1278.                 else
  1279.                 {
  1280.                         tem_1=card_data[hh][1];
  1281.                         tem_1<<=8;
  1282.                         tem_1+=card_data[hh][2];
  1283.                         tem_1<<=8;
  1284.                         tem_1+=card_data[hh][3];
  1285.                         tem_1<<=8;
  1286.                         tem_1+=card_data[hh][4];
  1287.                 }
  1288.                 switch(hh)
  1289.                 {
  1290.                         case 3:
  1291.                                         write_com(0x90);
  1292.                                         han_zi_display("4.");        
  1293.                                         break;
  1294.                         case 4:
  1295.                                         write_com(0x88);
  1296.                                         han_zi_display("5.");        
  1297.                                         break;
  1298.                         default:
  1299.                                         break;               
  1300.                 }
  1301.                 WDR();                                                                                                                                //喂狗
  1302.                 write_data(tem_1/10000000+0x30);
  1303.                 write_data(tem_1%10000000/1000000+0x30);
  1304.                 write_data(tem_1%10000000%1000000/100000+0x30);
  1305.                 write_data(tem_1%10000000%1000000%100000/10000+0x30);
  1306.                 write_data(tem_1%10000000%1000000%100000%10000/1000+0x30);
  1307.                 write_data(tem_1%10000000%1000000%100000%10000%1000/100+0x30);
  1308.                 write_data(tem_1%10000000%1000000%100000%10000%1000%100/10+0x30);
  1309.                 write_data(tem_1%10000000%1000000%100000%10000%1000%100%10+0x30);        
  1310.         }
  1311.         write_com(0x98);
  1312.         han_zi_display("稍后自動返回!");
  1313.         delay_ms(5000);
  1314.         clear_screen();
  1315.         GICR|=(1<<INT1);                                                        //打開外部中斷1
  1316.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  1317. }
  1318. //*****************************************************保存新卡****************************************************
  1319. void save_card(void)                                                
  1320. {
  1321.         uchar eeprom_addr=0;
  1322.         uchar uu=0;
  1323.         uchar yy=0;
  1324.         WDR();                                                                                                        //喂狗        
  1325.         if((card_data[0][3]==0xff)&&(card_data[0][4]==0xff))
  1326.         {
  1327.                 eeprom_addr=1;                                                                                //從EEPROM的地址1處開始寫數(shù)據
  1328.         }
  1329.         else if((card_data[1][3]==0xff)&&(card_data[1][4]==0xff))
  1330.         {
  1331.                 eeprom_addr=6;                                                                                //從EEPROM的地址6處開始寫數(shù)據
  1332.         }
  1333.         else if((card_data[2][3]==0xff)&&(card_data[2][4]==0xff))
  1334.         {
  1335.                 eeprom_addr=11;                                                                                //從EEPROM的地址11處開始寫數(shù)據
  1336.         }        
  1337.         else if((card_data[3][3]==0xff)&&(card_data[3][4]==0xff))
  1338.         {
  1339.                 eeprom_addr=16;                                                                                //從EEPROM的地址16處開始寫數(shù)據
  1340.         }        
  1341.         else if((card_data[4][3]==0xff)&&(card_data[4][4]==0xff))
  1342.         {
  1343.                 eeprom_addr=21;                                                                                //從EEPROM的地址21處開始寫數(shù)據
  1344.         }        
  1345.         else
  1346.         {
  1347.                 clear_screen();
  1348.                 WDR();                                                                                                //喂狗        
  1349.                 write_com(0x80);
  1350.                 han_zi_display("    卡已存滿!");
  1351.                 write_com(0x90);
  1352.                 han_zi_display("請全部刪除, 再增");
  1353.                 write_com(0x88);
  1354.                 han_zi_display("    加新卡!");
  1355.                 auto_return=88;                                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  1356.                 GICR|=(1<<INT1);                                                                        //打開外部中斷1
  1357.                 delay_ms(6000);
  1358.                 return;
  1359.         }
  1360.         yy=eeprom_addr;
  1361.         for(uu=0;eeprom_addr<(yy+5);eeprom_addr++)
  1362.         {
  1363.                 eeprom_write(eeprom_addr,rev_dat[uu++]);
  1364.                 WDR();                                                                                                //喂狗        
  1365.         }
  1366.         clear_screen();
  1367.         write_com(0x90);
  1368.         han_zi_display("  已保存卡號!");
  1369.         card_pro();                                                                        //把EEPROM數(shù)據讀出來,更新RAM中的card_data數(shù)組
  1370.         delay_ms(4000);
  1371.         GICR|=(1<<INT1);                                                        //打開外部中斷1
  1372.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  1373. }
  1374. //*********************************************不保存卡函數(shù)********************************************************
  1375. void no_save_card(void)
  1376. {
  1377.         rev_dat[0]=rev_dat[1]=rev_dat[2]=rev_dat[3]=rev_dat[4]=0;
  1378.         lcd_dis_num=0;
  1379.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  1380. }
  1381. //*********************************************清除全部卡函數(shù)******************************************************
  1382. void clear_card(void)
  1383. {
  1384.         uchar ii;
  1385.         for(ii=1;ii<36;ii++)                                                //從EEPROM地址1處開始寫0XFF
  1386.         {
  1387.                 eeprom_write(ii,0xff);                                        //把前EEPROM 的前30位內容全部清成0xff
  1388.                 WDR();                                                                        //喂狗        
  1389.         }
  1390.         clear_screen();
  1391.         write_com(0x90);
  1392.         han_zi_display("已刪除全部卡號!");
  1393.         write_com(0x88);
  1394.         han_zi_display("請盡快添加新卡!");
  1395.         card_pro();                                                                        //把EEPROM數(shù)據讀出來
  1396.         delay_ms(4000);
  1397.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  1398. }
  1399. //********************************************取消刪除卡時處理的函數(shù)***********************************************
  1400. void no_clear_card(void)                                                //不處理任何數(shù)據
  1401. {
  1402.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出子菜單,進入主屏
  1403. }
  1404. //***********************************************日期時間設置******************************************************
  1405. void date_time_set(void)                                                
  1406. {
  1407.         clear_screen();
  1408.         tem[5]=0;                                                                        //秒變量清0
  1409.         set_time_temp=1;
  1410.         time_set_display();                                                
  1411. }
  1412. //******************************************報警開關設置***********************************************************
  1413. void alarm_set(void)
  1414. {
  1415.         clear_screen();
  1416.         write_com(0x90);                                       
  1417.         han_zi_display("    設置完成      ");
  1418.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出菜單,進入主屏
  1419.         delay_ms(500);
  1420.         //添加相應的功能(此程序沒有此功能)
  1421. }
  1422. //******************************************人體紅外傳感器設置*****************************************************
  1423. void infrared_set(void)
  1424. {
  1425.         clear_screen();
  1426.         write_com(0x90);                                       
  1427.         han_zi_display("    設置完成      ");
  1428.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出菜單,進入主屏
  1429.         delay_ms(500);
  1430.         //添加相應的功能(此程序沒有此功能)
  1431. }
  1432. //******************************************路燈開關設置***********************************************************
  1433. void lamp_set(void)
  1434. {
  1435.         clear_screen();
  1436.         write_com(0x90);                                       
  1437.         han_zi_display("    設置完成      ");
  1438.         auto_return=88;                                                                //隨便賦一個比OVER_FLOW大的數(shù)字,目的是退出菜單,進入主屏
  1439.         delay_ms(500);
  1440.         //添加相應的功能(此程序沒有此功能)
  1441. }
  1442. //******************************************空函數(shù),不處理任何數(shù)據*************************************************
  1443. void nullsubs(void)
  1444. {
  1445. }
  1446. //*****************************************************************************************************************
  1447. void time_set_display(void)
  1448. {
  1449.         write_com(0x80);                                                        //第一行(如果是地址是:80H,即LCD的第一行的第一個位置顯示)
  1450.         han_zi_display("  日期時間設置  ");
  1451.         write_com(0x91);
  1452.         write_data((tem[0]/10)+0x30);
  1453.         write_data((tem[0]%10)+0x30);
  1454.         han_zi_display("年");
  1455.         write_data((tem[1]/10)+0x30);
  1456.         write_data((tem[1]%10)+0x30);
  1457.         han_zi_display("月");
  1458.         write_data((tem[2]/10)+0x30);
  1459.         write_data((tem[2]%10)+0x30);
  1460.         han_zi_display("日");
  1461.         date_time_display();
  1462.         write_com(0x8d);
  1463.         lcd_week_pro();                                                                //星期處理
  1464.         write_com(0x98);
  1465.         han_zi_display("  OK設置; NG退出");
  1466. }
  1467. //***********************************************星期處理**********************************************************
  1468. void lcd_week_pro(void)
  1469. {
  1470.         switch(tem[6])
  1471.         {
  1472.                 case 0:
  1473.                                 han_zi_display("星期日");
  1474.                                 break;
  1475.                 case 1:
  1476.                                 han_zi_display("星期一");
  1477.                                 break;
  1478.                 case 2:
  1479.                                 han_zi_display("星期二");
  1480.                                 break;
  1481.                 case 3:
  1482.                                 han_zi_display("星期三");
  1483.                                 break;
  1484.                 case 4:
  1485.                                 han_zi_display("星期四");
  1486.                                 break;
  1487.                 case 5:
  1488.                                 han_zi_display("星期五");
  1489.                                 break;
  1490.                 case 6:
  1491.                                 han_zi_display("星期六");
  1492.                                 break;
  1493.                 default:
  1494.                                 break;
  1495.         }
  1496. }
  1497. //**********************************************菜單選中標志"●"****************************************************
  1498. void select_menu(uchar data1)
  1499. {
  1500.         write_com(data1);
  1501.         write_data(0xa1);                                                                        //哪個菜單項選中時顯示"●"
  1502.         write_data(0xf1);
  1503. }
  1504. //*************************************************清整個GDRAM空間*************************************************
  1505. void clear_gdram(void)
  1506. {
  1507.         uchar x,y;
  1508.         for(y=0;y<64;y++)                                                        //64
  1509.         {
  1510.                 for(x=0;x<16;x++)                                                //16
  1511.                 {  
  1512.                         write_com(0x34);
  1513.                         write_com(y+0x80);                                 //行地址
  1514.                         write_com(x+0x80);                                     //列地址
  1515.                         write_com(0x30);
  1516.                         write_data(0x00);
  1517.                         write_data(0x00);
  1518.                         WDR();                                                                //喂狗
  1519.                 }
  1520.         }
  1521. }
  1522. //********************************************清屏*****************************************************************
  1523. void clear_screen(void)
  1524. {
  1525.         write_com(0x01);
  1526.         delay_ms(10);
  1527. }
  1528. //*********************************************系統(tǒng)起動引導主畫面**************************************************
  1529. void root_directory(void)
  1530. {
  1531.         write_com(0x80);                                        //第一行(如果是地址是:80H,即LCD的第一行的第一個位置顯示)
  1532.         han_zi_display("    門禁系統(tǒng)    ");
  1533.         write_com(0x91);
  1534.         write_data((tem[0]/10)+0x30);
  1535.         write_data((tem[0]%10)+0x30);
  1536.         han_zi_display("年");
  1537.         write_data((tem[1]/10)+0x30);
  1538.         write_data((tem[1]%10)+0x30);
  1539.         han_zi_display("月");
  1540.         write_data((tem[2]/10)+0x30);
  1541.         write_data((tem[2]%10)+0x30);
  1542.         han_zi_display("日");
  1543.         write_com(0x8d);
  1544.         switch(tem[6])
  1545.         {
  1546.                 case 0:
  1547.                                 han_zi_display("星期日");
  1548.                                 break;
  1549.                 case 1:
  1550.                                 han_zi_display("星期一");
  1551.                                 break;
  1552.                 case 2:
  1553.                                 han_zi_display("星期二");
  1554.                                 break;
  1555.                 case 3:
  1556.                                 han_zi_display("星期三");
  1557.                                 break;
  1558.                 case 4:
  1559.                                 han_zi_display("星期四");
  1560.                                 break;
  1561.                 case 5:
  1562.                                 han_zi_display("星期五");
  1563.                                 break;
  1564.                 case 6:
  1565.                                 han_zi_display("星期六");
  1566.                                 break;
  1567.                 default:
  1568.                                 break;
  1569.         }
  1570.         write_com(0x98);
  1571.         han_zi_display("室內溫度:");
  1572.         if(cold==0xaa)
  1573.         {
  1574.                 write_data('-');
  1575.         }
  1576.         else
  1577.         {
  1578.                 write_data(0x20);
  1579.         }
  1580.         write_data(temp0/10+0x30);
  1581.         write_data(temp0%10+0x30);
  1582.         write_com(0x9e);
  1583.         han_zi_display("℃");
  1584. }
  1585. //**********************************************時間、日期顯示*****************************************************
  1586. void date_time_display(void)
  1587. {
  1588.         write_com(0x88);
  1589.         write_data((tem[3]/10)+0x30);                                        //HOUR
  1590.         write_data((tem[3]%10)+0x30);
  1591.         if(set_time_temp==0)                                                        //=0 表示沒有進入時間設置菜單
  1592.         {
  1593.                 write_data(':');                                                        //通常情況下,":"要顯示為半角,目的:好看
  1594.         }
  1595.         else
  1596.         {
  1597.                 han_zi_display("時");                                                //進入設置時間菜單時,顯示為漢字,目的:方便反白顯示
  1598.         }
  1599.         write_data((tem[4]/10)+0x30);                                        //MINUTE
  1600.         write_data((tem[4]%10)+0x30);
  1601.         if(set_time_temp==0)                                                        //=0 表示沒有進入時間設置菜單
  1602.         {
  1603.                 write_data(':');                                                        //通常情況下,":"要顯示為半角,目的:好看
  1604.                 write_data((tem[5]/10)+0x30);                                //SECOND
  1605.                 write_data((tem[5]%10)+0x30);
  1606.         }
  1607.         else
  1608.         {
  1609.                 han_zi_display("分");                                                //進入設置時間菜單時,顯示為漢字,目的:方便反白顯示
  1610.         }
  1611. }
  1612. //*********************************************讀EEPROM,到RAM中***************************************************
  1613. void card_pro(void)
  1614. {
  1615.         uchar i=0,u=0,r=1;                                                                        //EEPROM地址從0x01處保存
  1616.         for(i=0;i<5;i++)                                                                        //共有5張開門卡,1張管理卡
  1617.         {
  1618.                 for(u=0;u<5;u++)                                                                //每個卡有5個字節(jié)數(shù)據
  1619.                 {
  1620.                         card_data[i][u]=eeprom_read(r++);                        //把EEPROM中的5張開門卡復制到RAM中
  1621.                         WDR();                                                                                //喂狗
  1622.                 }
  1623.         }
  1624. }
  1625. //********************************************比較匹配A 中斷*******************************************************
  1626. #pragma interrupt_handler time1_comp:7                                        //工作在CTC模式  每1S中斷一次
  1627. void time1_comp(void)
  1628. {
  1629.         if(return_en)                                                                                //菜單不動作自動返回允許變量
  1630.         {        
  1631.                 auto_return++;                                                                        //當auto_return>=OVER_FLOW時自動退出菜單設置
  1632.         }
  1633.         xx++;
  1634.         if(lcd_back_en==0xaa)                                                                //LCD背光計時變量允許
  1635.         {
  1636.                 lcd_back_time++;
  1637.                 if(lcd_back_time>=LCD_LAMP)                                                        //30秒后關閉LCD背光
  1638.                 {
  1639.                         lcd_back_time=0;
  1640.                         lcd_back_en=0;
  1641.                         LCD_BACK_OFF;
  1642.                 }
  1643.         }
  1644.         if(set_time_temp==0)
  1645.         {
  1646.                 tem[5]++;
  1647.                 if(tem[5]>=60)                                                                        //60        秒進位
  1648.                 {
  1649.                         tem[5]=0;
  1650.                         tem[4]++;
  1651.                         charge_tem++;
  1652.                         scan_en=0;
  1653.                         if(tem[4]>=60)                                                                //60        分進位
  1654.                         {
  1655.                                 tem[4]=0;
  1656.                                 tem[3]++;
  1657.                                 if(tem[3]>=24)                                                        //24        小時進位
  1658.                                 {
  1659.                                         tem[3]=0;
  1660.                                         tem[6]++;
  1661.                                         tem[2]++;
  1662.                                         if(tem[6]>=7)                                                //7             星期進位
  1663.                                         {
  1664.                                                 tem[6]=0;
  1665.                                         }
  1666.                                         if((tem[1]==1)||(tem[1]==3)||(tem[1]==5)||(tem[1]==7)||(tem[1]==8)||(tem[1]==10)||(tem[1]==12))   //判斷大小月
  1667.                                         {
  1668.                                                 if(tem[2]>=32)                                        //如果為大月,則有31天
  1669.                                                 {
  1670.                                                         tem[2]=1;
  1671.                                                         tem[1]++;
  1672.                                                 }
  1673.                                         }
  1674.                                         else
  1675.                                         {        
  1676.                                                 if(tem[2]>=31)                                        //如果為小月,則代表只有30天
  1677.                                                 {        
  1678.                                                         tem[2]=1;
  1679.                                                         tem[1]++;
  1680.                                                 }
  1681.                                         }
  1682.                                         if(tem[1]>=13)                                                //月進位
  1683.                                         {
  1684.                                                 tem[1]=1;
  1685.                                                 tem[0]++;
  1686.                                                 if(tem[0]>=29)                                        //當年大于2029年時,清零即2007年
  1687.                                                 {
  1688. ……………………

  1689. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
基于RFID的門禁系統(tǒng)規(guī)劃與設計 說明書.rar (375.05 KB, 下載次數(shù): 34)


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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表