lock_main.c

来自「一个基于单片机系统的门禁例子」· C语言 代码 · 共 1,865 行 · 第 1/4 页

C
1,865
字号
        				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);					

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?