⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lock_main.c

📁 ID卡读卡器源程序 用Mega32通过U2270B读取H4001RFID卡号的范例
💻 C
📖 第 1 页 / 共 5 页
字号:
	                    	
							(*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;
    						}

⌨️ 快捷键说明

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