单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 516|回复: 0
收起左侧

avr单片机+RFID的门禁系统规划与源码设计资料

[复制链接]
langzicheng 发表于 2018-12-28 21:34 | 显示全部楼层 |阅读模式
这个是关于物联网设计的一个资料,里面包括射频卡程序,和设计的初稿。对于想动手做的通知有点帮助

0.png

设计文档:
0.png

单片机源程序如下:
  1. /******************************************************************************************************************
  2. 程序名:      射频卡门禁系统
  3. 功能概述:
  4.                          1、  点阵LCD(128*64)显示。在正常、设置情况下LCD显示系统各个时期的菜单以供选择。
  5.                          2、  射频卡开锁,开锁时用射频卡放在读卡器上(距离<15CM)即可开锁,如果用非法卡连续刷写次数超过3
  6.                               次则报警(报警功能没有添加),这时系统将关闭刷卡器30分钟,在30分钟后再允许刷卡。
  7.                          3          本系统分为:
  8.                                       1)、1个主机。
  9.                                       2)、2个读卡头(一个在门外供刷卡用、一个在主机旁用于管理操作)
  10.                          4、  本锁开锁时供电,平时断电(12V)。
  11.                          5、  8个按键(AD转换采样取值)(设置、+、-、↑、↓、确认、返回、说明)
  12.                          6、  每次按下键、刷卡时有峰鸣器指示
  13.                          7、  LCD背光在有按键按下时、或刷卡时自动点亮,延时30秒关闭
  14.                          8、  门外有人体红外传感器探头,发现2米内有人,自动进入预警状态,如果是在晚上超过7点钟,则点亮门前的灯泡照明,
  15.                               如果此时有人破坏(比如取下灯泡、剪断灯炮的线、打烂灯泡)也要报警。否则、连续在门前超过1分钟,就开始报警。
  16.                               (此功能没有添加)
  17.                          9、  开门时发出“欢迎光临”,并提示关门(此功能没有添加)
  18.                          10、 本机带有门铃,并能记录前10天门铃按下的次数。(此功能没有添加)
  19.                          11、 LCD显示日期、星期、时间、室内温度、锁的状态、功能设置(菜单显示)等
  20.                          12、 可以查询过去10天内的开门记录并由LCD显示出来(此功能没有添加)
  21.                          13、 可以于电脑通过RS-232接口连接进行通信,监看门的状态、开门记录等,方便打印(此功能没有添加)
  22.                          14、 要求锁误判率小于1PPM
  23.                          15、 系统配有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};                                                        //日期、时间、星期数组
  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. //**********************************************结构数组声明*******************************************************
  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;                                                                //温度更新变量,开机赋一个比较大的数,目的是开机就显示温度
  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. //************************************************函 数 声 明 区***************************************************
  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);                                                //添加新卡的处理函数
  169. void query_card(void);                                                        //查询卡函数
  170. void save_card(void);                                                        //保存卡时处理函数
  171. void no_save_card(void);                                                //取消保存卡时处理函数
  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 引脚上任意的逻辑电平变化都将引发中断
  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();                                                //菜单数组初始化
  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("  系统正在启动  ");
  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大的数字,目的是退出子菜单,进入主屏
  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);                                                                        //发送使能,
  506.         UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                                //无奇偶校验,设置帧格式: 8 个数据位, 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;                                                                 //设置地址和数据寄存器
  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;                                                                                //自数据寄存器返回数据
  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};                                                                //日期、时间、星期数组备份
  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大的数字,目的是退出子菜单,进入主屏
  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];                                                //还原设置前的日期、时间数据
  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大的数字,目的是退出子菜单,进入主屏
  651.                                             break;
  652.                                                         }
  653.                                                 }
  654.                                                 else
  655.                                                 {
  656.                                                         return_temp=0;
  657.                                                         auto_return=88;                                                                //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
  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. //******************************************************主目录初始化函数*******************************************
  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. //**************************************************报警开关设置目录初始化函数*************************************
  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. //*************************************************人体红外开关设置目录初始化函数**********************************
  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. //*************************************************路灯开关设置目录初始化函数**************************************
  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大的数字,目的是退出子菜单,进入主屏
  1208.                 }
  1209.                 GICR|=(1<<INT1);                                                                                                //打开外部中断1
  1210.                 auto_return=0;                                                                                                        //菜单自动返回变量清0
  1211.                 WDR();                                                                                                                        //喂狗
  1212.         }
  1213. }
  1214. //***************************************************卡数量查询****************************************************
  1215. void query_card(void)
  1216. {
  1217.         ulong tem_1=0;
  1218.         uchar hh;
  1219.         card_pro();                                                                                                                        //把EEPROM数据读出来
  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大的数字,目的是退出子菜单,进入主屏
  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处开始写数据
  1328.         }
  1329.         else if((card_data[1][3]==0xff)&&(card_data[1][4]==0xff))
  1330.         {
  1331.                 eeprom_addr=6;                                                                                //从EEPROM的地址6处开始写数据
  1332.         }
  1333.         else if((card_data[2][3]==0xff)&&(card_data[2][4]==0xff))
  1334.         {
  1335.                 eeprom_addr=11;                                                                                //从EEPROM的地址11处开始写数据
  1336.         }        
  1337.         else if((card_data[3][3]==0xff)&&(card_data[3][4]==0xff))
  1338.         {
  1339.                 eeprom_addr=16;                                                                                //从EEPROM的地址16处开始写数据
  1340.         }        
  1341.         else if((card_data[4][3]==0xff)&&(card_data[4][4]==0xff))
  1342.         {
  1343.                 eeprom_addr=21;                                                                                //从EEPROM的地址21处开始写数据
  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大的数字,目的是退出子菜单,进入主屏
  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数据读出来,更新RAM中的card_data数组
  1370.         delay_ms(4000);
  1371.         GICR|=(1<<INT1);                                                        //打开外部中断1
  1372.         auto_return=88;                                                                //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
  1373. }
  1374. //*********************************************不保存卡函数********************************************************
  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大的数字,目的是退出子菜单,进入主屏
  1380. }
  1381. //*********************************************清除全部卡函数******************************************************
  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数据读出来
  1396.         delay_ms(4000);
  1397.         auto_return=88;                                                                //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
  1398. }
  1399. //********************************************取消删除卡时处理的函数***********************************************
  1400. void no_clear_card(void)                                                //不处理任何数据
  1401. {
  1402.         auto_return=88;                                                                //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
  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大的数字,目的是退出菜单,进入主屏
  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大的数字,目的是退出菜单,进入主屏
  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大的数字,目的是退出菜单,进入主屏
  1439.         delay_ms(500);
  1440.         //添加相应的功能(此程序没有此功能)
  1441. }
  1442. //******************************************空函数,不处理任何数据*************************************************
  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. //*********************************************系统起动引导主画面**************************************************
  1529. void root_directory(void)
  1530. {
  1531.         write_com(0x80);                                        //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
  1532.         han_zi_display("    门禁系统    ");
  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个字节数据
  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的门禁系统规划与设计 说明书.rar (375.05 KB, 下载次数: 11)
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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