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

📄 key_prc.c

📁 楼宇对讲系统里用的文字信息接收。用可视对讲话机的TFT屏可看到从管理中心发过来的广播信息和本户的特发信息
💻 C
📖 第 1 页 / 共 2 页
字号:
								  Get_mes_content(4,1);
								  break;
                        case 0x02:
                                  In_third_menu();
								  Get_mes_content(4,2);
                                  break;
                        case 0x03:
                                  In_third_menu();
								  Get_mes_content(4,3);
                                  break;
						case 0x04:              
						          if(list_num>=5)    //上页按键确认
						          {
						              Prev_page_affirm(4);
									  
								  }
								  else               //"返回"按键确认
								     disp_mode = FIRST_MENU_DISP; 
								  break;
						case 0x05:             //"返回"按键确认
						         
								  disp_mode = FIRST_MENU_DISP;
                                  
                                  break;

						default:
						          break;
					  }
                     select_position = 0;
                      break;

	    case 5:           /* 五条信息时处理*/
		
                     switch(select_position)
					 {
					    case 0x00:
						          In_third_menu();
								  Get_mes_content(5,0);
								  break;
						case 0x01:
						          In_third_menu();
								  Get_mes_content(5,1);
								  break;
                        case 0x02:
                                  In_third_menu();
								  Get_mes_content(5,2);
                                  break;
                        case 0x03:
                                  In_third_menu();								 
								  Get_mes_content(5,3);
                                  break;
                        case 0x04:
                                  In_third_menu();
								  Get_mes_content(5,4);
                                  break;
						case 0x05:              
						          if(list_num>5)     //上页按键确认
						          {
			                         Prev_page_affirm(5) ;
									  
 								  }
								  else
								  {   
								       scr_mes_num = Judge_mes_num();    //下页按键确认
                                       mes_list_F = 1;
								  }
								  
								  break;
                        case 0x06:             //"下页"按键确认
						          if(list_num > 5)
                                  {
								     
                                     scr_mes_num = Judge_mes_num();
									 mes_list_F = 1;
                                   
								   }
								   else      //返回按键确认
				     
									  disp_mode = FIRST_MENU_DISP;
						   
                                  break;
						case 0x07:             //"返回"按键确认
						          disp_mode = FIRST_MENU_DISP;
                                  
                                  break;

						default:
						          break;
					  }
                      select_position = 0;
                      break;
            }
       }
/*第三级菜单显示时按右键处理情况*/
     else if(disp_mode == THIRD_MENU_DISP)
     {
	    if(disp_no_u == 0)                //第一屏时
		{
		   if(content_disp_end_F == 1)             //一屏就显示完内容情况下
		   {
		       switch(select_position)
		       {
		        case 0x00:                     //按删除键确认
				     Del_mes_prc();            //要删除信息
					 mes_list_F =1;
					 break;
				case 0x01:                    //返回键确认					 
                     Return_second_menu(scr_mes_num);
					 mes_list_F = 1;					
					 break;
				default:
				     break;
			    }
		   }
			else            //第一屏,但信息内容一屏没显示完
		   {
               switch(select_position)
			   {
			    case 0x00:                   //下页按键处理
				     disp_no_u++;
					 content_disp_F = P_DISP ;
					 clear_scr_F = 1;
					 break;
                case 0x01:                   //返回键处理
				     Return_second_menu(scr_mes_num);
					 mes_list_F = 1;
					
					 break;
				default:
				     break;
				}
			}
	    }
		else         //不是第一屏
		{
		     if(content_disp_end_F == 1)   //显示内容已结束
			 {
			    switch(select_position)
				{
				  case 0x00:                    //上页按键确认				        
				        disp_no_u--;
						clear_scr_F = 1;
                        content_disp_F = N_DISP ;
						break;
				  case 0x01:                   //删除按键确认
				       //删除处理
					   Del_mes_prc();
					   mes_list_F = 1;
					   break;
				  case 0x02:                   //返回键确认				     
					 Return_second_menu(scr_mes_num);
					 mes_list_F = 1;
					 break;
				  default:
				       break;
                  }
			  }
			  else        //显示内容还没结束
			  {
			      switch(select_position)
				  {
				     case 0x00:                  //上页按键确认
					      if(disp_no_u >= 1)
						     disp_no_u--;
						  clear_scr_F = 1;
						  content_disp_F = N_DISP ;
						  //上页处理
						  break;
					  case 0x01:                //下页按键确认
					       disp_no_u++;
						   if(disp_no_u>4)
						   {
				                disp_no_u = 4;    //一条信息最多暂定五屏显示完
								break;
						   }
						   content_disp_F = P_DISP ;
						   clear_scr_F = 1;
						   break;
					  case 0x02:               //返回键确认
					        
					       Return_second_menu(scr_mes_num);
					       mes_list_F = 1;
					        break;
					  default:
					        break;
					}
			   }
		  }
		 
	  }
 }

/***********************************************************/
/***********************************************************/ 
				     
/***********************************************************/
/* 按"上页"按键时的处理                                    */
/* mes_num:是当前这一页有多少条信息                        */
/***********************************************************/ 
 void  Prev_page_affirm(unsigned char mes_num)
 {
    list_num-=mes_num;
    if(mes_num != 0)
	{
//       if(mes_list == (struct  MES_CON_BLOCK code *)END)	
       if(mes_list == &MES_NULL)  
       {
	       mes_list=last_mes_list ;
		    mes_num--;
	   }
	 /*先把指针回到这一页的第一条信息处*/
       while(mes_num)
	   {
	          mes_list = mes_list->prev;
		      mes_num--;
		      
	   }
	}

   /*再判上一屏有多少条信息*/
	 scr_mes_num = R_judge_mes_num();
	 list_num -= scr_mes_num ;
	 mes_list_F = 1;
	  
 }

/***********************************************************/
/*这是在查看信息内容时按返回键时处理情形
/*  mes_num:当前这一屏有多少条信息
/***********************************************************/ 
void Return_second_menu(unsigned char mes_num)
{
    list_num -= mes_num ;
//	if(mes_list == (struct  MES_CON_BLOCK code *)END)
    if(mes_list == &MES_NULL)
	{
         mes_list = last_mes_list;
		 if(mes_num != 0)
		    mes_num--;
	}

    while(mes_num)
	{
//	      if(mes_list->prev != (struct  MES_CON_BLOCK code *)END)
		  if(mes_list->prev != &MES_NULL)
	      {    mes_list = mes_list->prev;
		       mes_num--;
		  }
		  else
		      break;
	}	 
	 scr_mes_num = Judge_mes_num();
	 disp_mode = SECOND_MENU_DISP ;
     select_position = select_position_old ;
	 disp_no_u_old = 6 ;
	 disp_no_u = 0;
}



/**********************************************************/
/* mes_list指针指向的是在二级界面菜单显示时,待显示的链表**/
/*中的某一处,首次进入二级菜单时 mes_list -> disp_tcb_list*/
/**********************************************************/
unsigned char  Judge_mes_num(void)
{
   unsigned char i ;

   if(mes_list == &MES_NULL)   //无信息就返回0
       return 0;
   mes_list_old = mes_list ;   //为了显示*形所用
/*经过以下处理,mes_list指向该屏的信息内存块的末端*/
   for(i=0;i<5;i++)   //最多只判5条
   {
        if(mes_list ->next != &MES_NULL)
   		{	  
             mes_list = mes_list -> next ;
		}
		else
		{	
	        last_mes_list = mes_list;
            mes_list = &MES_NULL;
		    i++;
            break;
		}
	}
	
	return i;
}
 


/*******************************************************/
/*******************************************************/
unsigned char  R_judge_mes_num(void)
{
   unsigned char i=0 ;
   struct MES_CON_BLOCK *p = mes_list;
    if((mes_list == &MES_NULL)&&(last_mes_list != &MES_NULL))
    {
		 p = last_mes_list;
	}
    if(p->next == &MES_NULL)        
      i=1;
   for(;i<5;i++)
   {	  
//            if(p->prev != (struct  MES_CON_BLOCK xdata *)END)
			if(p->prev != &MES_NULL)
                p = p -> prev ;
			else
			{
			  i++;
			  break;
			}
			    
   }
   mes_list_old = p ;
	return i;
}


/*******************************************************/
/*******************************************************/
void In_third_menu(void)
{
  disp_mode = THIRD_MENU_DISP;
  content_disp_F = P_DISP ;
  select_position_old = select_position;    //阅读信息后返回时正常情况下仍选中该条信息
  disp_no_u_old= 6;        //disp_no_u不可能达到6
  disp_no_u=0;
}


/*******************************************************/
/*******************************************************/
void Get_mes_content(unsigned char scr_disp_num,unsigned char select)
{
 
   struct  MES_CON_BLOCK xdata *p;
   if(mes_list == &MES_NULL)
   {    
       p = last_mes_list;
       scr_disp_num --;
   }
   else
       p=mes_list ;
   while(scr_disp_num-- > select)
         p=p->prev;
  
   mes_content = (unsigned char xdata*)p->mes_addr.address.address;
   read_mes_page_adr =(unsigned char)(p->mes_addr.address.page_addr) ;
   p->new_old_F = OLD;             //进入该信息阅读,表示信息是旧的
   /*以下为编删除信息时增加*/
   del_mes_p = p ;  //将现在这条信息的控制块存入,以备删除信息时用
}

/*******************************************************/
/*  该函数为删除信息时需处理的动作                     */
/*******************************************************/
void Del_mes_prc(void)
{
  
   if(del_mes_p == last_mes_list )  //如果删除的信息是列表中的最后一条
   {  
       if(last_mes_list->prev !=&MES_NULL)     //不是第一条
       {
           last_mes_list = last_mes_list->prev;  
   		   select_position_old -= 1;    //防止将选择框移到"返回" 处
	   }
	   else                                   //删除的是最后一条信息
	   {
	      last_mes_list = &MES_NULL ;
	   }
   }
   Del_disp_tcb_block(del_mes_p);     // 从显示链表中脱开,然后放回到空链表中
   list_num--;                        //总的信息数减1
   scr_mes_num--;                     //当前这一屏的信息数量减1
   if(scr_mes_num != 0)
       Return_second_menu(scr_mes_num);   //直接返回二级菜单
   else                              //这一屏已没有信息列表了,那么返回上一屏列表
   {  
      if(list_num >= 5)              //之前有超过5条信息
           Return_second_menu(5);	  
	  else                           //之前不超过5条
           Return_second_menu(list_num);

	  select_position = 0;           //新屏的选项位置重新从第一行信息位置开始
   }

}

/************************************************/
/************************************************/

  void Get_num_code(unsigned char num)
  {
      unsigned char i;
	  if(num>=100)
	  {
	     i= num/100;
		 (unsigned int)num_code[0]= num_to_code[i];
		 num = num%100;
		 i=num/10;
         (unsigned int)num_code[2]= num_to_code[i];
		 i = num%10;
		 (unsigned int)num_code[4]= num_to_code[i];
		 num_code[6]='\0';
	  }
	  else if(num>=10)
	  {
	     i=num/10;
         (unsigned int)num_code[0]= num_to_code[i];
		 i = num%10;
		 (unsigned int)num_code[2]= num_to_code[i];
		 num_code[4]='\0';
	  }
	  else 
	  {
	     i = num;
	     (unsigned int)num_code[0]= num_to_code[i]; 
 		 num_code[2]='\0';
	  }
   }

/************************************************/
/************************************************/
   void Get_list_str(unsigned char num)
   {
//      memset(list_str,0x00,11);           //clear  list_str
      register char i=0 ;
      
	  while(i < 11)
         *(list_str + i++)= 0x00;

      Get_num_code(num);
      strcat(list_str,"第");
	  strcat(list_str,num_code);
	  strcat(list_str,"条");
   }   

⌨️ 快捷键说明

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