标题:
avr单片机+RFID的门禁系统规划与源码设计资料
[打印本页]
作者:
langzicheng
时间:
2018-12-28 21:34
标题:
avr单片机+RFID的门禁系统规划与源码设计资料
这个是关于物联网设计的一个资料,里面包括射频卡程序,和设计的初稿。对于想动手做的通知有点帮助
0.png
(42.75 KB, 下载次数: 63)
下载附件
2018-12-29 15:41 上传
设计文档:
0.png
(45.55 KB, 下载次数: 58)
下载附件
2018-12-29 15:42 上传
单片机源程序如下:
/******************************************************************************************************************
程序名: 射频卡门禁系统
功能概述:
1、 点阵LCD(128*64)显示。在正常、设置情况下LCD显示系统各个时期的菜单以供选择。
2、 射频卡开锁,开锁时用射频卡放在读卡器上(距离<15CM)即可开锁,如果用非法卡连续刷写次数超过3
次则报警(报警功能没有添加),这时系统将关闭刷卡器30分钟,在30分钟后再允许刷卡。
3 本系统分为:
1)、1个主机。
2)、2个读卡头(一个在门外供刷卡用、一个在主机旁用于管理操作)
4、 本锁开锁时供电,平时断电(12V)。
5、 8个按键(AD转换采样取值)(设置、+、-、↑、↓、确认、返回、说明)
6、 每次按下键、刷卡时有峰鸣器指示
7、 LCD背光在有按键按下时、或刷卡时自动点亮,延时30秒关闭
8、 门外有人体红外传感器探头,发现2米内有人,自动进入预警状态,如果是在晚上超过7点钟,则点亮门前的灯泡照明,
如果此时有人破坏(比如取下灯泡、剪断灯炮的线、打烂灯泡)也要报警。否则、连续在门前超过1分钟,就开始报警。
(此功能没有添加)
9、 开门时发出“欢迎光临”,并提示关门(此功能没有添加)
10、 本机带有门铃,并能记录前10天门铃按下的次数。(此功能没有添加)
11、 LCD显示日期、星期、时间、室内温度、锁的状态、功能设置(菜单显示)等
12、 可以查询过去10天内的开门记录并由LCD显示出来(此功能没有添加)
13、 可以于电脑通过RS-232接口连接进行通信,监看门的状态、开门记录等,方便打印(此功能没有添加)
14、 要求锁误判率小于1PPM
15、 系统配有UPS(12V) 平时用UPS电能,只有当主机检测到电压低于11.5V时,自动接入火电进行充电。
电瓶充满时(大约5小时)自动断电。
16、 电压:12V
17、 电流:待机时<50MA
射频卡类型: 4001、EM4100和含E2PROM的RF卡。如E5550。
MCU类型: ATmega16
晶振频率: 7.3728MHZ
版本: V0.1
******************************************************************************************************************/
#include<iom16v.h>
#include<macros.h>
#include<stdio.h>
#include"LCD_12864.H" //LCD头文件
#include"read_card.H" //读卡头文件
#define key_inc (PINC&(1<<PC0)) //按键+,选择日期、时间时用
#define key_dec (PINC&(1<<PC1)) //按键-,选择日期、时间时用
#define BAUDRATE 9600 //波特率
#define F_CPU 7372800 //晶振频率
#define LCD_LAMP 60 //LCD默认30S后关闭
#define BATTERY_TIME 5 //每十分钟检测一次电池电量
#define ADC_PINA0 0x00 //ADC0 按键AD 单端通道,不放大
#define ADC_PINA1 0x01 //ADC1 温度采样
#define ADC_PINA2 0x02 //ADC2 电平电量检测
#define LCD_BACK_ON PORTC&=~(1<<PC5)
#define LCD_BACK_OFF PORTC|=(1<<PC5)
#define buzzer_on PORTD&=~(1<<PD7)
#define buzzer_off PORTD|=(1<<PD7)
#define charge_on PORTC&=~(1<<PC6)
#define charge_off PORTC|=(1<<PC6)
#define LOCK_ON PORTC&=~(1<<PC3)
#define LOCK_OFF PORTC|=(1<<PC3)
#define CHARGE_STATUS (PINC&(1<<PC2))
#define null 0
#define vref 5000 //AD转换参考电压
#define OVER_FLOW 10 //进入菜单设置时,如果在10S内没有按下任何键,则自动退出
#pragma data:code
//const uchar manage_card[5]={0x0b,0,0x2d,0x23,0x5f}; //住房卡-----当作管理卡
const uchar manage_card[5]={0x33,0,0x7c,0x09,0xb1}; //000 8128945-----当作管理卡
//*************************************************温度测定查表****************************************************
//******************************************温度范围是:-30度----+99度*********************************************
const uint temp_1[130]={
4304,4270,4235,4198,4161,4122,4083,4042,4001,3958,
3914,3870,3824,3778,3731,3683,3635,3585,3535,3484,
3433,3381,3329,3276,3223,3169,3116,3062,3008,2953,
2899,2844,2789,2733,2678,2622,2568,2514,2459,2405,
2353,2299,2248,2196,2145,2095,2045,1996,1948,1901,
1854,1808,1763,1719,1676,1599,1590,1549,1508,1468,
1429,1391,1354,1318,1282,1247,1214,1181,1149,1117,
1087,1057,1028,1000,973 ,946 ,920 ,895 ,870 ,846 ,
823 ,800 ,777 ,755 ,755 ,713 ,692 ,673 ,654 ,632 ,
617 ,600 ,583 ,567 ,551 ,536 ,521 ,506 ,491 ,478 ,
465 ,452 ,440 ,428 ,417 ,405 ,394 ,384 ,373 ,364 ,
354 ,345 ,335 ,326 ,318 ,310 ,302 ,294 ,286 ,279 ,
271 ,265 ,258 ,252 ,245 ,239 ,233 ,227 ,222 ,216 ,
};
//*****************************************************************************************************************
#pragma data:data
uchar card_data[5][5]={
{0,0,0,0,0}, //卡1
{0,0,0,0,0}, //卡2
{0,0,0,0,0}, //卡3
{0,0,0,0,0}, //卡4
{0,0,0,0,0}, //卡5
};
uchar tem[7]={7, 5, 1, 8, 0, 0, 6}; //日期、时间、星期数组
// 年/月/日 /H /M /S /W
//********************************************目录结构体定义*******************************************************
struct menu_item
{
short menu_count;
char *display_string;
void (*subs)();
struct menu_item *children_menus;
struct menu_item *parent_menus;
};
//**********************************************结构数组声明*******************************************************
struct menu_item main_menu[4];
struct menu_item alarm_menu[2];
struct menu_item infrared_menu[2];
struct menu_item lamp_menu[2];
struct menu_item (*menu_point) = main_menu;
struct menu_item card_main_menu[4];
struct menu_item card_inc_menu[2];
struct menu_item card_dec_menu[2];
struct menu_item (*menu_card) = card_main_menu;
uchar user_choose = 0;
uchar max_items=0;
uint temp_value=0; //温度检测AD值
//********************************************变量定义*************************************************************
uchar second_temp=0; //秒变量
uchar scan_en=0; //主屏扫描标志位
uchar key=0; //按键变量
uchar kk=0; //按键按下标志位
uchar auto_return=0; //菜单自动返回变量
uchar return_en=0; //菜单自动返回标志位
uchar left_right=0; //左右键变量
uchar choose_temp=0; //子菜单标题变量
uchar return_temp=0; //返回临时变量
uchar set_time_temp=0; //设置时间时菜单变量,如果=1表示屏显在设置时间菜单
uchar twinkling_addr=0x91; //设置时间时闪动显示位置变量
uchar inc_card_en=0; //添加新卡允许变量
uchar manage_card_inc_en=0; //管理卡
uchar cold=0; //温度正负极标志位
uchar temp0=0; //温度值变量
uchar xx=88; //温度更新变量,开机赋一个比较大的数,目的是开机就显示温度
uchar close_read=0;
lcd_back_en=0; //LCD背光计时变量允许
lcd_back_time=0; //LCD背光计时变量
//*****************************************************************************************************************
void delay_ms (unsigned int m); //延时
void read_adc(void); //按键ADC处理
void date_time_display(void); //时间日期显示
void root_directory(void); //引导主画面
void set_menu(void); //设置菜单
void clear_screen(void); //清屏
void clear_gdram(void); //清全部GDRAM
void select_menu(uchar data1); //选择菜单时,标志
void time_set_display(void); //时间、日期设置显示
uint adc_sampling(uchar adc_input); //ADC采样
uchar get_degree(void); //温度查表
uchar temperature_check(void); //室温检测
uchar charge_tem=0; //每十分钟,检测一次电池电量,此变量主要是计时
uint battery_temp=0; //电平电压变量
//************************************************函 数 声 明 区***************************************************
void main_menu_initial(void); //主菜单初始化
void alarm_menu_initial(void); //报警菜单初始化
void infrared_menu_initial(void);
void lamp_menu_initial(void);
void menu_initial(void);
void card_main_menu_initial(void);
void card_inc_menu_initial(void);
void card_dec_menu_initial(void);
void show_menu(void);
void date_time_set(void);
void alarm_set(void);
void infrared_set(void);
void lamp_set(void);
void nullsubs(void);
void twinkling_addr_pro(void);
void lcd_week_pro(void);
void key_inc_dec(void);
void lcd_menu_set(void);
void card_pro(void);
void buzzer_pro(uchar p);
//*****************************************************************************************************************
void inc_new_card(void); //添加新卡的处理函数
void query_card(void); //查询卡函数
void save_card(void); //保存卡时处理函数
void no_save_card(void); //取消保存卡时处理函数
void clear_card(void); //删除全部卡
void no_clear_card(void); //取消删除卡
void card_menu_show(void); //管理卡菜单显示
void card_menu_pro(void); //管理卡菜单处理
void char_twinkling(uchar data_1); //字符消隐
//*****************************************************************************************************************
void eeprom_write(uint eeprom_address, uchar eeprom_data); //写----EEPROM 操作
uchar eeprom_read(uint eeprom_address); //读----EEPROM 操作
//*************************************************主程序**********************************************************
void main(void)
{
PORTA=0XF8; //PA0---按键AD;PA1---室内温度AD;PA2---电平电量检测
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
DDRA =0XF8; //AD转换时要设为输入、且端口要清0
DDRB =0XFF;
DDRC =0b11111000;
DDRD =0b11110010; //INT0、INT1、RXD设成输入;TXD设成输出
TIMSK=(1<<OCIE1A); //输出比较A 匹配中断使能
TCCR1A=0;
TCCR1B=0X0D; //CTC模式,1024分频
OCR1A=7200; //定时1S
GICR=(1<<INT1)|(1<<INT0); //打开外部中断0、1
MCUCR=(1<<ISC00); //INT0 引脚上任意的逻辑电平变化都将引发中断
ADCSRA=(1<<ADEN)|0x06; //使能ADC,时钟64分频 125KHz@8MHz system clock
WDTCR=0x0f; //(1<<WDE)|(1<<WDP2)|(1<<WDP1); //打开看门狗,溢出时间为2.1S
write_com(0x01); //清除显示,并且设定地址指针为00H
menu_initial(); //菜单数组初始化
send_initial(); //串口初始化
WDR(); //喂狗
card_pro(); //读EEPROM,到RAM中
lcd_reset(); //LCD初始化
write_com(0x90);
buzzer_on;
LCD_BACK_ON; //打开LCD背光
han_zi_display(" 系统正在启动 ");
write_com(0x88);
han_zi_display(" 请稍后......");
delay_ms(500);
clear_gdram(); //清除GDRAM--绘图RAM
clear_screen(); //清屏
buzzer_off; //峰鸣器指示
lcd_back_en=0xaa; //打开计时变量
lcd_back_time=0; //计时变量清0
SEI(); //使能全局中断
while(1)
{
WDR(); //喂狗
if(scan_en==0) //只有在scan_en=0的时候扫描主屏,平时只更新时间
{
scan_en=~scan_en;
clear_screen();
temp0=temperature_check(); //温度检测
root_directory();
}
if(second_temp!=tem[5]) //每秒钟扫描一次
{
second_temp=tem[5];
date_time_display();
}
if(close_read==1)
{
if(xx>=5)
{
xx=0;
close_read=0;
second_temp=0;
GICR=((1<<INT1)|(1<<INT0)); //开外部中断0、1
}
}
if(kk) //=1表示有按键按下
{
kk=0;
read_adc(); //AD转换,取得键值
buzzer_pro(1); //峰鸣器指示
LCD_BACK_ON; //打开LCD背光
lcd_back_en=0xaa; //打开计时变量
lcd_back_time=0; //计时变量清0
if(key==1)
{
GICR&=~(1<<INT0); //关闭读卡外部中断0
lcd_menu_set(); //LCD菜单设置
GICR=((1<<INT1)|(1<<INT0)); //开外部中断0、1
}
else if(key==8)
{
GICR&=~((1<<INT1)|(1<<INT0)); //关闭部中断0、1
key=0;
clear_screen(); //清屏
write_com(0x80);
han_zi_display(" 警 告 ");
write_com(0x88);
han_zi_display("版权归于军峰所有");
write_com(0x98);
han_zi_display(" 拷贝必究!!!");
delay_ms(6000);
scan_en=0; //主菜单调用允许标志位
clear_screen(); //**************
GICR=((1<<INT1)|(1<<INT0)); //开外部中断0、1
}
else
{
key=0;
GICR=((1<<INT1)|(1<<INT0)); //开外部中断0、1
}
}
WDR(); //喂狗
if(inc_card_en==0xaa) //=0xaa表示调用管理菜单允许
{
inc_card_en=0;
rev_dat[0]=rev_dat[1]=rev_dat[2]=rev_dat[3]=rev_dat[4]=0xff;
lcd_dis_num=0;
card_menu_pro();
GICR=((1<<INT1)|(1<<INT0)); //开外部中断0、1
}
if(charge_tem>=BATTERY_TIME)
{
charge_tem=0;
battery_temp=0;
WDR(); //喂狗
battery_temp=adc_sampling(ADC_PINA2); //AD采样电平电量
if(battery_temp<=3750) //3750=12V,当电平电压小于12V时,开始充电
{
charge_on;
if(CHARGE_STATUS!=0)
{
buzzer_pro(10); //峰鸣器指示
}
}
else if((CHARGE_STATUS==1)||(battery_temp>=4375)) //如果大于4375=14V,表示要关闭充电器
{
charge_off;
}
}
}
}
//************************************************管理卡主菜单操作*************************************************
void card_menu_pro(void)
{
clear_screen();
menu_card= card_main_menu;
user_choose=0;
card_menu_show();
return_en=1; //打开菜单自动返回变量
GICR|=(1<<INT1); //打开外部中断1***********************
while(auto_return<OVER_FLOW)
{
WDR(); //喂狗
if(kk)
{
kk=0;
auto_return=0; //清除菜单自动返回累计时间变量
read_adc();
buzzer_pro(1); //峰鸣器指示
LCD_BACK_ON; //打开LCD背光
lcd_back_en=0xaa; //打开计时变量
lcd_back_time=0; //计时变量清0
WDR();
switch(key)
{
case 0: //没有按下按键
break;
case 1: //设置
key=0;
break;
case 2: //向上
key=0;
if (user_choose == 0)
{
user_choose = max_items;
}
user_choose --;
break;
case 3: //向下
key=0;
user_choose ++;
if (user_choose == max_items)
{
user_choose = 0;
}
break;
case 4: //向左
key=0;
break;
case 5: //向右
key=0;
break;
case 6: //确认
key=0;
if (menu_card[user_choose].subs != nullsubs)
{
(*menu_card[user_choose].subs)();
}
WDR(); //喂狗
if(menu_card[user_choose].children_menus != null)
{
choose_temp=user_choose;
menu_card = menu_card[user_choose].children_menus; //把结构指针还指向子菜单
user_choose = 0;
}
break;
case 7: //返回
key=0;
menu_card= card_main_menu;
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
break;
case 8: //说明
key=0;
break;
default:
key=0;
break;
}
card_menu_show();
GICR|=(1<<INT1); //打开外部中断1***********************
key=0;
kk=0;
}
}
scan_en=0; //主菜单调用允许标志位
return_en=0; //菜单自动计时返回允许标志位
auto_return=0; //菜单自动计时返回变量
key=0; //按键值清0
return_temp=0; //返回临时变量清0
user_choose = 0;
choose_temp=0;
inc_card_en=0;
menu_card = card_main_menu; //把结构指针还指向主菜单
clear_screen(); //清除DDRAM--显示资料寄存器
GICR=((1<<INT1)|(1<<INT0)); //开外部中断0、1
}
//*********************************************字符消隐************************************************************
void char_twinkling(uchar data_1)
{
write_com(data_1);
write_com(data_1);
write_data(0x20); //设置时间时,字符闪动
write_data(0x20);
}
//**********************************************管理操作时的菜单***************************************************
void card_menu_show(void)
{
uchar n = 0;
WDR(); //喂狗
max_items = menu_card[0].menu_count;
if (max_items >= 3)
{
for (n = 0;n<3;n++)
{
switch(n)
{
case 0:
write_com(0x80);
break;
case 1:
write_com(0x90);
break;
case 2:
write_com(0x88);
break;
default:
break;
}
han_zi_display(menu_card[n].display_string);
if (n == user_choose)
{
switch(n)
{
case 0:
select_menu(0x80);
break;
case 1:
select_menu(0x90);
break;
case 2:
select_menu(0x88);
break;
default:
break;
}
}
}
}
else //子菜单选择
{
clear_screen();
for (n = 0;n<max_items;n++)
{
write_com(0x80);
switch(choose_temp)
{
case 0:
han_zi_display(" 1.添加新卡?");
break;
case 1:
han_zi_display(" 2.删除全部卡?");
break;
case 2:
han_zi_display(" 3.查询卡记录?");
break;
default:
break;
}
if(n==0)
{
write_com(0x88);
}
else if(n==1)
{
write_com(0x98);
}
han_zi_display(menu_card[n].display_string);
if (n == user_choose)
{
if(n==0)
{
select_menu(0x89);
}
else if(n==1)
{
select_menu(0x99);
}
}
}
}
}
//**********************************************UART初始化*********************************************************
void send_initial(void)
{
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
UCSRB=(1<<TXEN); //发送使能,
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //无奇偶校验,设置帧格式: 8 个数据位, 1 个停止位
}
//*********************************************EEPROM 操作*********************************************************
//*********************************************写----EEPROM 操作***************************************************
void eeprom_write(uint eeprom_address, uchar eeprom_data)
{
CLI();
while(EECR & (1<<EEWE)); //等待上一次写操作结束
EEAR = eeprom_address; //设置地址和数据寄存器
EEDR = eeprom_data;
EECR |= (1<<EEMWE); //置位EEMWE
EECR |= (1<<EEWE); //置位EEWE 以启动写操作
SEI();
}
//********************************************读----EEPROM 操作****************************************************
uchar eeprom_read(uint eeprom_address)
{
CLI();
while(EECR & (1<<EEWE)); //等待上一次写操作结束
EEAR = eeprom_address; //设置地址寄存器
EECR |= (1<<EERE); //设置EERE 以启动读操作
SEI();
return EEDR; //自数据寄存器返回数据
}
//***********************************************LCD菜单设置*******************************************************
//说明:如果进入菜单在30秒内没有动作,将自动反回主画面
//*****************************************************************************************************************
void lcd_menu_set(void)
{
uchar tem_2[7]={0,0,0,0,0,0,0}; //日期、时间、星期数组备份
// 年/月/日/H/M/S/W
key=0;
menu_point = main_menu; //把结构指针还指向主菜单
user_choose=0;
clear_screen();
WDR();
show_menu(); //显示菜单
return_en=1; //打开菜单自动返回变量
GICR|=(1<<INT1); //打开外部中断1
while(auto_return<OVER_FLOW)
{
WDR(); //喂狗
if(kk)
{
kk=0;
auto_return=0; //清除菜单自动返回累计时间变量
read_adc();
buzzer_pro(1); //峰鸣器指示
LCD_BACK_ON; //打开LCD背光
lcd_back_en=0xaa; //打开计时变量
lcd_back_time=0; //计时变量清0
WDR(); //喂狗
switch(key)
{
case 0: //没有按下按键
break;
case 1: //设置
break;
case 2: //向上
key=0;
if (user_choose == 0)
{
user_choose = max_items;
}
user_choose --;
return_temp=0; //返回临时变量清0
break;
case 3: //向下
key=0;
user_choose ++;
if (user_choose == max_items)
{
user_choose = 0;
}
return_temp=0; //返回临时变量清0
break;
case 4: //向左
key=0;
if(left_right==0)
{
left_right=6;
}
left_right--;
twinkling_addr_pro(); //调用闪动地址选择
break;
case 5: //向右
key=0;
left_right++;
if(left_right>=6)
{
left_right=0;
}
twinkling_addr_pro(); //调用闪动地址选择
break;
case 6: //确认
key=0;
if(set_time_temp==1)
{
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
set_time_temp=0;
clear_screen();
write_com(0x90);
han_zi_display(" 时间设置完成");
delay_ms(2000);
break;
}
if (menu_point[user_choose].subs != nullsubs)
{
left_right=0;
tem_2[0]=tem[0]; //把日期、时间变量做个备份
tem_2[1]=tem[1];
tem_2[2]=tem[2];
tem_2[3]=tem[3];
tem_2[4]=tem[4];
tem_2[5]=tem[5];
tem_2[6]=tem[6];
(*menu_point[user_choose].subs)();
}
else if(menu_point[user_choose].children_menus != null)
{
choose_temp=user_choose;
menu_point = menu_point[user_choose].children_menus; //把结构指针还指向子菜单
user_choose = 0;
}
break;
case 7: //返回
key=0;
return_temp++;
if(return_temp==1)
{
menu_point = main_menu;
user_choose = 0;
left_right=0;
if(set_time_temp==1)
{
clear_screen();
set_time_temp=0;
tem[0]=tem_2[0]; //还原设置前的日期、时间数据
tem[1]=tem_2[1];
tem[2]=tem_2[2];
tem[3]=tem_2[3];
tem[4]=tem_2[4];
tem[5]=tem_2[5];
tem[6]=tem_2[6];
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
break;
}
}
else
{
return_temp=0;
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
break;
case 8: //说明
key=0;
break;
default:
key=0;
break;
}
if(set_time_temp==0)
{
show_menu();
}
else //!=0表示菜单处在修改日期一栏
{
date_time_set();
}
key=0;
kk=0;
GICR|=(1<<INT1); //打开外部中断1
}
if(set_time_temp==1)
{
GICR&=~(1<<INT1); //关闭按键中断
key_inc_dec(); //按键+、-处理
GICR|=(1<<INT1); //打开按键中断
time_set_display();
delay_ms(100);
char_twinkling(twinkling_addr);
delay_ms(100);
}
}
clear_screen(); //清除DDRAM--显示资料寄存器
scan_en=0; //主菜单调用允许标志位
return_en=0; //菜单自动计时返回允许标志位
auto_return=0; //菜单自动计时返回变量
key=0; //按键值清0
return_temp=0; //返回临时变量清0
user_choose = 0;
menu_point = main_menu; //把结构指针还指向主菜单
set_time_temp=0; //日期、时间设置菜单变量
twinkling_addr=0x91;
left_right=0;
}
//***************************************************按键+、-处理**************************************************
void key_inc_dec(void)
{
if(key_inc==0)
{
delay_ms(5);
if(key_inc==0)
{
buzzer_pro(1); //峰鸣器指示
LCD_BACK_ON; //打开LCD背光
lcd_back_time=0; //计时变量清0
lcd_back_en=0xaa; //打开计时变量
auto_return=0; //清除菜单自动返回累计时间变量
switch(twinkling_addr)
{
case 0x88: //小时选项
do
{
tem[3]++;
if(tem[3]>=24)
{
tem[3]=0;
}
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_inc==0);
break;
case 0x8a: //分钟选项
do
{
tem[4]++;
if(tem[4]>=60)
{
tem[4]=0;
}
time_set_display(); //更新显示
delay_ms(120);
auto_return=0;
}
while(key_inc==0);
break;
case 0x8f: //星期选项
do
{
tem[6]++;
if(tem[6]>=7)
{
tem[6]=0;
}
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_inc==0);
break;
case 0x91: //年选项
do
{
tem[0]++;
if(tem[0]>=29)
{
tem[0]=7;
}
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_inc==0);
break;
case 0x93: //月选项
do
{
tem[1]++;
if(tem[1]>=13)
{
tem[1]=1;
}
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_inc==0);
break;
case 0x95: //日选项
do
{
tem[2]++;
if(tem[2]>=32)
{
tem[2]=1;
}
time_set_display(); //更新显示
delay_ms(150);
auto_return=0;
}
while(key_inc==0);
break;
default:
break;
}
}
}
if(key_dec==0)
{
delay_ms(5);
if(key_dec==0)
{
buzzer_pro(1); //峰鸣器指示
LCD_BACK_ON; //打开LCD背光
lcd_back_time=0; //计时变量清0
lcd_back_en=0xaa; //打开计时变量
auto_return=0; //清除菜单自动返回累计时间变量
switch(twinkling_addr)
{
case 0x88: //小时选项
do
{
if(tem[3]==0)
{
tem[3]=24;
}
tem[3]--;
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_dec==0);
break;
case 0x8a: //分钟选项
do
{
if(tem[4]==0)
{
tem[4]=60;
}
tem[4]--;
time_set_display(); //更新显示
delay_ms(120);
auto_return=0;
}
while(key_dec==0);
break;
case 0x8f: //星期选项
do
{
if(tem[6]==0)
{
tem[6]=7;
}
tem[6]--;
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_dec==0);
break;
case 0x91: //年选项
do
{
if(tem[0]==7)
{
tem[0]=29;
}
tem[0]--;
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_dec==0);
break;
case 0x93: //月选项
do
{
if(tem[1]==1)
{
tem[1]=13;
}
tem[1]--;
time_set_display(); //更新显示
delay_ms(200);
auto_return=0;
}
while(key_dec==0);
break;
case 0x95: //日选项
do
{
if(tem[2]==1)
{
tem[2]=32;
}
tem[2]--;
time_set_display(); //更新显示
delay_ms(150);
auto_return=0;
}
while(key_dec==0);
break;
default:
break;
}
}
}
}
//**************************************************字符闪动地址选择***********************************************
void twinkling_addr_pro(void)
{
switch(left_right)
{
case 0:
twinkling_addr=0x91;
break;
case 1:
twinkling_addr=0x93;
break;
case 2:
twinkling_addr=0x95;
break;
case 3:
twinkling_addr=0x88;
break;
case 4:
twinkling_addr=0x8a;
break;
case 5:
twinkling_addr=0x8f;
break;
default:
break;
}
clear_screen();
return_temp=0; //返回临时变量清0
}
//*************************************************显示菜单********************************************************
void show_menu(void)
{
uchar n = 0;
max_items = menu_point[0].menu_count;
WDR(); //喂狗
if (max_items >= 4)
{
for (n = 0;n<4;n++)
{
switch(n)
{
case 0:
write_com(0x80);
break;
case 1:
write_com(0x90);
break;
case 2:
write_com(0x88);
break;
case 3:
write_com(0x98);
break;
default:
break;
}
han_zi_display(menu_point[n].display_string);
if (n == user_choose)
{
switch(n)
{
case 0:
select_menu(0x80);
break;
case 1:
select_menu(0x90);
break;
case 2:
select_menu(0x88);
break;
case 3:
select_menu(0x98);
break;
default:
break;
}
}
}
}
else //子菜单选择
{
WDR(); //喂狗
clear_screen();
for (n = 0;n<max_items;n++)
{
write_com(0x80);
switch(choose_temp)
{
case 0:
han_zi_display(" 1.时间日期设置");
break;
case 1:
han_zi_display(" 2.报警开关设置");
break;
case 2:
han_zi_display(" 3.人体红外设置");
break;
case 3:
han_zi_display(" 4.路灯开关设置");
break;
default:
break;
}
if(n==0)
{
write_com(0x88);
}
else if(n==1)
{
write_com(0x98);
}
han_zi_display(menu_point[n].display_string);
if (n== user_choose)
{
if(n==0)
{
select_menu(0x89);
}
else if(n==1)
{
select_menu(0x99);
}
}
}
}
}
//******************************************************初始化菜单目录*********************************************
void menu_initial(void)
{
main_menu_initial();
alarm_menu_initial();
infrared_menu_initial();
lamp_menu_initial();
card_main_menu_initial();
card_inc_menu_initial();
card_dec_menu_initial();
}
//******************************************************主目录初始化函数*******************************************
void main_menu_initial(void)
{
main_menu[0].menu_count = 4;
main_menu[0].display_string = " 1.时间日期设置";
main_menu[0].subs = date_time_set;
main_menu[0].children_menus =null;
main_menu[0].parent_menus = null;
main_menu[1].menu_count = 4;
main_menu[1].display_string = " 2.报警开关设置";
main_menu[1].subs = nullsubs;
main_menu[1].children_menus = alarm_menu;
main_menu[1].parent_menus = null;
main_menu[2].menu_count = 4;
main_menu[2].display_string = " 3.人体红外设置";
main_menu[2].subs = nullsubs;
main_menu[2].children_menus = infrared_menu;
main_menu[2].parent_menus = null;
main_menu[3].menu_count = 4;
main_menu[3].display_string = " 4.路灯开关设置";
main_menu[3].subs = nullsubs;
main_menu[3].children_menus = lamp_menu;
main_menu[3].parent_menus = null;
}
//**************************************************报警开关设置目录初始化函数*************************************
void alarm_menu_initial(void)
{
alarm_menu[0].menu_count = 2;
alarm_menu[0].display_string = " 1. 打开 ";
alarm_menu[0].subs = alarm_set;
alarm_menu[0].children_menus = null; //&null
alarm_menu[0].parent_menus = main_menu;
alarm_menu[1].menu_count = 2;
alarm_menu[1].display_string = " 2. 关闭 ";
alarm_menu[1].subs = alarm_set;
alarm_menu[1].children_menus = null; //&null
alarm_menu[1].parent_menus = main_menu;
}
//*************************************************人体红外开关设置目录初始化函数**********************************
void infrared_menu_initial(void)
{
infrared_menu[0].menu_count = 2;
infrared_menu[0].display_string = " 1. 打开 ";
infrared_menu[0].subs = infrared_set;
infrared_menu[0].children_menus = null; //&null
infrared_menu[0].parent_menus = main_menu;
infrared_menu[1].menu_count = 2;
infrared_menu[1].display_string = " 2. 关闭 ";
infrared_menu[1].subs = infrared_set;
infrared_menu[1].children_menus = null; //&null
infrared_menu[1].parent_menus = main_menu;
}
//*************************************************路灯开关设置目录初始化函数**************************************
void lamp_menu_initial(void)
{
lamp_menu[0].menu_count = 2;
lamp_menu[0].display_string = " 1. 打开 ";
lamp_menu[0].subs = lamp_set;
lamp_menu[0].children_menus = null;
lamp_menu[0].parent_menus = main_menu;
lamp_menu[1].menu_count = 2;
lamp_menu[1].display_string = " 2. 关闭 ";
lamp_menu[1].subs = lamp_set;
lamp_menu[1].children_menus = null;
lamp_menu[1].parent_menus = main_menu;
}
//**********************************************管理卡操作主菜单***************************************************
void card_main_menu_initial(void)
{
card_main_menu[0].menu_count = 3;
card_main_menu[0].display_string = " 1.添加新卡?";
card_main_menu[0].subs =inc_new_card;
card_main_menu[0].children_menus =card_inc_menu;
card_main_menu[0].parent_menus = null;
card_main_menu[1].menu_count = 3;
card_main_menu[1].display_string = " 2.删除全部卡?";
card_main_menu[1].subs = nullsubs;
card_main_menu[1].children_menus = card_dec_menu;
card_main_menu[1].parent_menus = null;
card_main_menu[2].menu_count = 3;
card_main_menu[2].display_string = " 3.查询卡记录?";
card_main_menu[2].subs = query_card;
card_main_menu[2].children_menus = null;
card_main_menu[2].parent_menus = null;
}
//************************************************添加新卡子菜单***************************************************
void card_inc_menu_initial(void)
{
card_inc_menu[0].menu_count = 2;
card_inc_menu[0].display_string = " 1. 确认 ";
card_inc_menu[0].subs = save_card;
card_inc_menu[0].children_menus = null;
card_inc_menu[0].parent_menus = main_menu;
card_inc_menu[1].menu_count = 2;
card_inc_menu[1].display_string = " 2. 取消 ";
card_inc_menu[1].subs = no_save_card;
card_inc_menu[1].children_menus = null;
card_inc_menu[1].parent_menus = main_menu;
}
//************************************************删除全部卡子菜单*************************************************
void card_dec_menu_initial(void)
{
card_dec_menu[0].menu_count = 2;
card_dec_menu[0].display_string = " 1. 确认 ";
card_dec_menu[0].subs = clear_card;
card_dec_menu[0].children_menus = null;
card_dec_menu[0].parent_menus = main_menu;
card_dec_menu[1].menu_count = 2;
card_dec_menu[1].display_string = " 2. 取消 ";
card_dec_menu[1].subs =no_clear_card;
card_dec_menu[1].children_menus = null;
card_dec_menu[1].parent_menus = main_menu;
}
//**************************************************增加新卡*******************************************************
void inc_new_card(void)
{
uchar eeprom_addr=0;
uchar uu=0;
if(user_choose==0)
{
manage_card_inc_en=0xaa; //准备接收新卡号码
clear_screen();
auto_return=0; //菜单自动返回变量清0
write_com(0x80);
han_zi_display(" 请刷卡!");
GICR|=(1<<INT0); //开外部中断0
while((manage_card_inc_en==0xaa)&&(auto_return<OVER_FLOW))
{
WDR(); //喂狗
}
if(manage_card_inc_en==0)
{
GICR&=~((1<<INT1)|(1<<INT0)); //关闭外部中断0、1
write_com(0x90);
han_zi_display("卡号:");
write_com(0x93);
write_data(lcd_dis_num/10000000+0x30);
write_data(lcd_dis_num%10000000/1000000+0x30);
write_data(lcd_dis_num%10000000%1000000/100000+0x30);
write_data(lcd_dis_num%10000000%1000000%100000/10000+0x30);
write_data(lcd_dis_num%10000000%1000000%100000%10000/1000+0x30);
write_data(lcd_dis_num%10000000%1000000%100000%10000%1000/100+0x30);
write_data(lcd_dis_num%10000000%1000000%100000%10000%1000%100/10+0x30);
write_data(lcd_dis_num%10000000%1000000%100000%10000%1000%100%10+0x30);
write_com(0x88);
han_zi_display(" 请核对!");
delay_ms(3000);
}
else
{
manage_card_inc_en=0; //在请刷卡界面,如果没有刷卡,自动返回后要清0此变量
lcd_dis_num=0;
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
GICR|=(1<<INT1); //打开外部中断1
auto_return=0; //菜单自动返回变量清0
WDR(); //喂狗
}
}
//***************************************************卡数量查询****************************************************
void query_card(void)
{
ulong tem_1=0;
uchar hh;
card_pro(); //把EEPROM数据读出来
GICR&=~((1<<INT1)|(1<<INT0)); //关闭外部中断0、1
clear_screen();
WDR(); //喂狗
write_com(0x80);
han_zi_display("卡记录: 共五张卡");
for(hh=0;hh<3;hh++)
{
if(card_data[hh][4]==0xff)
{
tem_1=0;
}
else
{
tem_1=card_data[hh][1];
tem_1<<=8;
tem_1+=card_data[hh][2];
tem_1<<=8;
tem_1+=card_data[hh][3];
tem_1<<=8;
tem_1+=card_data[hh][4];
}
switch(hh)
{
case 0:
write_com(0x90);
han_zi_display("1.");
break;
case 1:
write_com(0x88);
han_zi_display("2.");
break;
case 2:
write_com(0x98);
han_zi_display("3.");
break;
default:
break;
}
WDR(); //喂狗
write_data(tem_1/10000000+0x30); //显示卡号
write_data(tem_1%10000000/1000000+0x30);
write_data(tem_1%10000000%1000000/100000+0x30);
write_data(tem_1%10000000%1000000%100000/10000+0x30);
write_data(tem_1%10000000%1000000%100000%10000/1000+0x30);
write_data(tem_1%10000000%1000000%100000%10000%1000/100+0x30);
write_data(tem_1%10000000%1000000%100000%10000%1000%100/10+0x30);
write_data(tem_1%10000000%1000000%100000%10000%1000%100%10+0x30);
}
delay_ms(5000);
clear_screen();
write_com(0x80);
han_zi_display("卡记录: 共五张卡");
for(hh=3;hh<5;hh++)
{
if(card_data[hh][4]==0xff)
{
tem_1=0;
}
else
{
tem_1=card_data[hh][1];
tem_1<<=8;
tem_1+=card_data[hh][2];
tem_1<<=8;
tem_1+=card_data[hh][3];
tem_1<<=8;
tem_1+=card_data[hh][4];
}
switch(hh)
{
case 3:
write_com(0x90);
han_zi_display("4.");
break;
case 4:
write_com(0x88);
han_zi_display("5.");
break;
default:
break;
}
WDR(); //喂狗
write_data(tem_1/10000000+0x30);
write_data(tem_1%10000000/1000000+0x30);
write_data(tem_1%10000000%1000000/100000+0x30);
write_data(tem_1%10000000%1000000%100000/10000+0x30);
write_data(tem_1%10000000%1000000%100000%10000/1000+0x30);
write_data(tem_1%10000000%1000000%100000%10000%1000/100+0x30);
write_data(tem_1%10000000%1000000%100000%10000%1000%100/10+0x30);
write_data(tem_1%10000000%1000000%100000%10000%1000%100%10+0x30);
}
write_com(0x98);
han_zi_display("稍后自动返回!");
delay_ms(5000);
clear_screen();
GICR|=(1<<INT1); //打开外部中断1
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//*****************************************************保存新卡****************************************************
void save_card(void)
{
uchar eeprom_addr=0;
uchar uu=0;
uchar yy=0;
WDR(); //喂狗
if((card_data[0][3]==0xff)&&(card_data[0][4]==0xff))
{
eeprom_addr=1; //从EEPROM的地址1处开始写数据
}
else if((card_data[1][3]==0xff)&&(card_data[1][4]==0xff))
{
eeprom_addr=6; //从EEPROM的地址6处开始写数据
}
else if((card_data[2][3]==0xff)&&(card_data[2][4]==0xff))
{
eeprom_addr=11; //从EEPROM的地址11处开始写数据
}
else if((card_data[3][3]==0xff)&&(card_data[3][4]==0xff))
{
eeprom_addr=16; //从EEPROM的地址16处开始写数据
}
else if((card_data[4][3]==0xff)&&(card_data[4][4]==0xff))
{
eeprom_addr=21; //从EEPROM的地址21处开始写数据
}
else
{
clear_screen();
WDR(); //喂狗
write_com(0x80);
han_zi_display(" 卡已存满!");
write_com(0x90);
han_zi_display("请全部删除, 再增");
write_com(0x88);
han_zi_display(" 加新卡!");
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
GICR|=(1<<INT1); //打开外部中断1
delay_ms(6000);
return;
}
yy=eeprom_addr;
for(uu=0;eeprom_addr<(yy+5);eeprom_addr++)
{
eeprom_write(eeprom_addr,rev_dat[uu++]);
WDR(); //喂狗
}
clear_screen();
write_com(0x90);
han_zi_display(" 已保存卡号!");
card_pro(); //把EEPROM数据读出来,更新RAM中的card_data数组
delay_ms(4000);
GICR|=(1<<INT1); //打开外部中断1
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//*********************************************不保存卡函数********************************************************
void no_save_card(void)
{
rev_dat[0]=rev_dat[1]=rev_dat[2]=rev_dat[3]=rev_dat[4]=0;
lcd_dis_num=0;
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//*********************************************清除全部卡函数******************************************************
void clear_card(void)
{
uchar ii;
for(ii=1;ii<36;ii++) //从EEPROM地址1处开始写0XFF
{
eeprom_write(ii,0xff); //把前EEPROM 的前30位内容全部清成0xff
WDR(); //喂狗
}
clear_screen();
write_com(0x90);
han_zi_display("已删除全部卡号!");
write_com(0x88);
han_zi_display("请尽快添加新卡!");
card_pro(); //把EEPROM数据读出来
delay_ms(4000);
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//********************************************取消删除卡时处理的函数***********************************************
void no_clear_card(void) //不处理任何数据
{
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出子菜单,进入主屏
}
//***********************************************日期时间设置******************************************************
void date_time_set(void)
{
clear_screen();
tem[5]=0; //秒变量清0
set_time_temp=1;
time_set_display();
}
//******************************************报警开关设置***********************************************************
void alarm_set(void)
{
clear_screen();
write_com(0x90);
han_zi_display(" 设置完成 ");
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出菜单,进入主屏
delay_ms(500);
//添加相应的功能(此程序没有此功能)
}
//******************************************人体红外传感器设置*****************************************************
void infrared_set(void)
{
clear_screen();
write_com(0x90);
han_zi_display(" 设置完成 ");
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出菜单,进入主屏
delay_ms(500);
//添加相应的功能(此程序没有此功能)
}
//******************************************路灯开关设置***********************************************************
void lamp_set(void)
{
clear_screen();
write_com(0x90);
han_zi_display(" 设置完成 ");
auto_return=88; //随便赋一个比OVER_FLOW大的数字,目的是退出菜单,进入主屏
delay_ms(500);
//添加相应的功能(此程序没有此功能)
}
//******************************************空函数,不处理任何数据*************************************************
void nullsubs(void)
{
}
//*****************************************************************************************************************
void time_set_display(void)
{
write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
han_zi_display(" 日期时间设置 ");
write_com(0x91);
write_data((tem[0]/10)+0x30);
write_data((tem[0]%10)+0x30);
han_zi_display("年");
write_data((tem[1]/10)+0x30);
write_data((tem[1]%10)+0x30);
han_zi_display("月");
write_data((tem[2]/10)+0x30);
write_data((tem[2]%10)+0x30);
han_zi_display("日");
date_time_display();
write_com(0x8d);
lcd_week_pro(); //星期处理
write_com(0x98);
han_zi_display(" OK设置; NG退出");
}
//***********************************************星期处理**********************************************************
void lcd_week_pro(void)
{
switch(tem[6])
{
case 0:
han_zi_display("星期日");
break;
case 1:
han_zi_display("星期一");
break;
case 2:
han_zi_display("星期二");
break;
case 3:
han_zi_display("星期三");
break;
case 4:
han_zi_display("星期四");
break;
case 5:
han_zi_display("星期五");
break;
case 6:
han_zi_display("星期六");
break;
default:
break;
}
}
//**********************************************菜单选中标志"●"****************************************************
void select_menu(uchar data1)
{
write_com(data1);
write_data(0xa1); //哪个菜单项选中时显示"●"
write_data(0xf1);
}
//*************************************************清整个GDRAM空间*************************************************
void clear_gdram(void)
{
uchar x,y;
for(y=0;y<64;y++) //64
{
for(x=0;x<16;x++) //16
{
write_com(0x34);
write_com(y+0x80); //行地址
write_com(x+0x80); //列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
WDR(); //喂狗
}
}
}
//********************************************清屏*****************************************************************
void clear_screen(void)
{
write_com(0x01);
delay_ms(10);
}
//*********************************************系统起动引导主画面**************************************************
void root_directory(void)
{
write_com(0x80); //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
han_zi_display(" 门禁系统 ");
write_com(0x91);
write_data((tem[0]/10)+0x30);
write_data((tem[0]%10)+0x30);
han_zi_display("年");
write_data((tem[1]/10)+0x30);
write_data((tem[1]%10)+0x30);
han_zi_display("月");
write_data((tem[2]/10)+0x30);
write_data((tem[2]%10)+0x30);
han_zi_display("日");
write_com(0x8d);
switch(tem[6])
{
case 0:
han_zi_display("星期日");
break;
case 1:
han_zi_display("星期一");
break;
case 2:
han_zi_display("星期二");
break;
case 3:
han_zi_display("星期三");
break;
case 4:
han_zi_display("星期四");
break;
case 5:
han_zi_display("星期五");
break;
case 6:
han_zi_display("星期六");
break;
default:
break;
}
write_com(0x98);
han_zi_display("室内温度:");
if(cold==0xaa)
{
write_data('-');
}
else
{
write_data(0x20);
}
write_data(temp0/10+0x30);
write_data(temp0%10+0x30);
write_com(0x9e);
han_zi_display("℃");
}
//**********************************************时间、日期显示*****************************************************
void date_time_display(void)
{
write_com(0x88);
write_data((tem[3]/10)+0x30); //HOUR
write_data((tem[3]%10)+0x30);
if(set_time_temp==0) //=0 表示没有进入时间设置菜单
{
write_data(':'); //通常情况下,":"要显示为半角,目的:好看
}
else
{
han_zi_display("时"); //进入设置时间菜单时,显示为汉字,目的:方便反白显示
}
write_data((tem[4]/10)+0x30); //MINUTE
write_data((tem[4]%10)+0x30);
if(set_time_temp==0) //=0 表示没有进入时间设置菜单
{
write_data(':'); //通常情况下,":"要显示为半角,目的:好看
write_data((tem[5]/10)+0x30); //SECOND
write_data((tem[5]%10)+0x30);
}
else
{
han_zi_display("分"); //进入设置时间菜单时,显示为汉字,目的:方便反白显示
}
}
//*********************************************读EEPROM,到RAM中***************************************************
void card_pro(void)
{
uchar i=0,u=0,r=1; //EEPROM地址从0x01处保存
for(i=0;i<5;i++) //共有5张开门卡,1张管理卡
{
for(u=0;u<5;u++) //每个卡有5个字节数据
{
card_data[i][u]=eeprom_read(r++); //把EEPROM中的5张开门卡复制到RAM中
WDR(); //喂狗
}
}
}
//********************************************比较匹配A 中断*******************************************************
#pragma interrupt_handler time1_comp:7 //工作在CTC模式 每1S中断一次
void time1_comp(void)
{
if(return_en) //菜单不动作自动返回允许变量
{
auto_return++; //当auto_return>=OVER_FLOW时自动退出菜单设置
}
xx++;
if(lcd_back_en==0xaa) //LCD背光计时变量允许
{
lcd_back_time++;
if(lcd_back_time>=LCD_LAMP) //30秒后关闭LCD背光
{
lcd_back_time=0;
lcd_back_en=0;
LCD_BACK_OFF;
}
}
if(set_time_temp==0)
{
tem[5]++;
if(tem[5]>=60) //60 秒进位
{
tem[5]=0;
tem[4]++;
charge_tem++;
scan_en=0;
if(tem[4]>=60) //60 分进位
{
tem[4]=0;
tem[3]++;
if(tem[3]>=24) //24 小时进位
{
tem[3]=0;
tem[6]++;
tem[2]++;
if(tem[6]>=7) //7 星期进位
{
tem[6]=0;
}
if((tem[1]==1)||(tem[1]==3)||(tem[1]==5)||(tem[1]==7)||(tem[1]==8)||(tem[1]==10)||(tem[1]==12)) //判断大小月
{
if(tem[2]>=32) //如果为大月,则有31天
{
tem[2]=1;
tem[1]++;
}
}
else
{
if(tem[2]>=31) //如果为小月,则代表只有30天
{
tem[2]=1;
tem[1]++;
}
}
if(tem[1]>=13) //月进位
{
tem[1]=1;
tem[0]++;
if(tem[0]>=29) //当年大于2029年时,清零即2007年
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于RFID的门禁系统规划与设计 说明书.rar
(375.05 KB, 下载次数: 34)
2018-12-28 21:29 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1