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

📄 lock_main.c

📁 一个基于单片机系统的门禁例子
💻 C
📖 第 1 页 / 共 4 页
字号:
			}
			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:

⌨️ 快捷键说明

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