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

📄 key_prc.c

📁 楼宇对讲系统里用的文字信息接收。用可视对讲话机的TFT屏可看到从管理中心发过来的广播信息和本户的特发信息
💻 C
📖 第 1 页 / 共 2 页
字号:

/***********************************************************/
/*							                               */
/*                CPU:AT89c55   20MHZ                      */
/*                Copyright  2004.09  Comelit              */
/*                Author:LV_XIAO_LU                        */
/*                                                         */
/***********************************************************/
/*                Version  1.0                             */
/***********************************************************/
/*      LEFT KEY LOCATE P1.7,RIGHT KEY LOCATE P1.6         */
/*    FUNCTION :                                           */
/*              LEFT KEY :MOVE sign of menu                */
/*              RIGHT KEY:   design                        */  
/***********************************************************/        
    
#include <reg52.h>
#include "string.h"
#include "typedef.h"
#include "define.h"
#include "variable.h"
#include "function.h"


sbit DIVA_STATUS_PORT = P3^2;
sbit MES_SW = P1^7;
sbit CALL_SW = P1^6 ;
sbit DISP_CTR_PORT = P3^5;

void Key_dummy(void);
void Key_left(void);
void Key_right(void);
void Prev_page_affirm(unsigned char mes_num);
void Key_hd(void);
void Key_scan(void);
bit  Key_judge(void);
void Con_key(void);
void Key_prc( void );
unsigned char  Judge_mes_num(void);
unsigned char  R_judge_mes_num(void);
void In_third_menu(void);
void Return_second_menu(unsigned char mes_num);
void Get_mes_content(unsigned char scr_disp_num,unsigned char select);
void Del_mes_prc(void);
void Get_num_code(unsigned char num);
void Get_list_str(unsigned char num);

/***********************************************************/
/***********************************************************/
code unsigned int num_to_code[]=
 {
        0xa3b0,0xa3b1,0xa3b2,0xa3b3,0xa3b4,
		0xa3b5,0xa3b6,0xa3b7,0xa3b8,0xa3b9
 };
/***********************************************************/
/***********************************************************/
void (*const code key_tbl[])(void)= 
{
	Key_dummy,
	Key_left,
	Key_right
};

/***********************************************************/
/***********************************************************/ 
void Key_dummy(void)
{
   return;
}



/***********************************************************/
/***********************************************************/
void Key_hd(void)
{
 	Key_scan();
 	if(key_tmr != 0)
    	key_tmr--;
 	else 
	{
    	key_tmr = KEY_TM;
	  	if(Key_judge() == KEYOK)
	     	Con_key();
	}
 return;
 }

/***********************************************************/
/***********************************************************/
void Key_scan(void)
 
{
  	unsigned char i;
	P3 = P3|0x18;         //p3.3=p3.4=1
//  	P3=P3|0x0c;           //test
  	key_data[0]=(~P3)&0x18;    // get P3.3,P3.4
//	key_data[0]=(~P3)&0x0c;  //test
  	for(i=2;i>0;i--)
   	{
    	key_data[i]= key_data[i-1];
    }
 
return;	   

}
 


/***********************************************************/
/***********************************************************/
bit  Key_judge(void)
{
 if((key_data[0] == key_data[1])&&(key_data[1] == key_data[2]))
           
     return(1);
 else 
     return(0);

}



/***********************************************************/
/*P3^4: 左键   P3^3:右键                                   */
/***********************************************************/
void Con_key(void)
{
  switch(key_data[1])
  {

   	case 0x10:
//   case 0x04:        //test
         keyvld = LEFTKEY;
		 break;
   	case 0x08:
         keyvld = RIGHTKEY;
	     break;
	default :
	     keyvld = NOKEY;
		 break;
   }
   if(keyvld == NOKEY)
      {
	     keyvld_old = keyvld ;
		 key_flag_F = 0;
		 
	   }

   else if(keyvld != keyvld_old)
        {      
            
	      	keyvld_old = keyvld;
	        key_flag_F = 1;
	         
	    }
	    
      return;
  }


  
/***********************************************************/
/***********************************************************/
void Key_prc( void )
{    
    if((write_F == 1)||(call_disp_F == 1))                //正在写FLASH时,禁止操作
	{ 
	   if(key_flag_F == 1)
	      key_flag_F = 0;
	   return;
	}
	else
	{    
   	    if(key_flag_F == 1)
	    {
	    	key_flag_F = 0;
			exit_time = TM30S ;
	    	key_tbl[keyvld]();
			disp_change_F = 1 ;
		}
//		else
//	 	{	 
//	   		disp_change_F = 0;	 
//	 	}
	 	if((exit_time != 0)&&(call_disp_F == 0))
	    	exit_time--;
	 	else if((disp_mode != DUMMY_DISP)&&(exit_time == 0))              // 关机
	 	{
	    	disp_mode = DUMMY_DISP;
	 	}
	 	return;
	 }
}

/***********************************************************/
/*     左键为信息选择                                      */
/***********************************************************/

void Key_left(void)
{
   switch(disp_mode)
   {
     case DUMMY_DISP :     //如果原显示模式是待机
//          if(call_disp_F == 0)
// 	      {
		     disp_mode = FIRST_MENU_DISP ;
             select_position = MES_READ_POSITION ;
			 CALL_SW = SW_ON;
			 sw_delay = TM60MS;        //这是为了等待继电器动作完成
		     read_mes_F = 1;
//		  }
		  break;  
     case FIRST_MENU_DISP:
   
          select_position++;             //指向下一功能
          if(select_position > CLOSE_POSITION )
             select_position = MES_READ_POSITION ;  //循环
		  break;

     case SECOND_MENU_DISP:

          select_position++;		  
		  if(scr_mes_num == 5)
		  {
		     if(list_num > 5 )
   			 {   
			     if(select_position > 7)
		            select_position = 0 ;
			 }
			 else if(select_position >6)
			        select_position = 0;
		  }
		  else if(mes_list == disp_tcb_list)
		           select_position = 0;
		  else if((list_num < 5)&&(select_position >scr_mes_num))
		           select_position = 0;
		  else if(select_position > (scr_mes_num+1))
		           select_position = 0;
		  break;
	  case THIRD_MENU_DISP:
	      select_position++;
		  if(disp_no_u == 0)
		  {   
			  if(select_position > 1)
			      select_position = 0;
		  }
		  else 
		  {
              if(select_position >2)
			      select_position = 0 ;
		  }
		  break;
	  default:
	      break;

     }

}

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

void Key_right(void)
{
   if(disp_mode == DUMMY_DISP)
   {
        if(call_disp_F == 0)
		{
            disp_mode = FIRST_MENU_DISP ;
            select_position = MES_READ_POSITION;
			CALL_SW = SW_ON;
			sw_delay = TM60MS;
		    read_mes_F = 1;
		}
   }
   else if(disp_mode == FIRST_MENU_DISP)
   {
        switch(select_position)
        {
            case MES_READ_POSITION:
                      disp_mode = SECOND_MENU_DISP ;
					  select_position = 0 ;          //指向第一条信息位置
					  EA = 0 ;
					  mes_list = disp_tcb_list ;
					  last_mes_list = disp_tcb_list;
					  EA = 1;
					  mes_list_old = mes_list ;					 
					  list_num = 0;                  //信息总条数清0
					  
					  scr_mes_num = Judge_mes_num();  //这一屏提示多少条信息
					  mes_list_F = 1;
                      disp_no_u = 0 ;
                      break;
            case CLOSE_POSITION:
                       disp_mode = DUMMY_DISP ;
                       
					  break ;
            default:

                    break;
         }
    }
    else if(disp_mode == SECOND_MENU_DISP)
    {
	    switch(scr_mes_num)
		{
		   case 0x00:   //无信息提示时处理,有二种情况,一是内存无信息,一是阅信息到最后无信息
//                     if(disp_tcb_list == (struct  MES_CON_BLOCK code *)END)
//                     if(disp_tcb_list == &MES_NULL)
                     if((mes_list == &MES_NULL)&&(last_mes_list == &MES_NULL))  
		             {
					    disp_mode = FIRST_MENU_DISP;
						disp_no_u = 0 ;
					  }
					  else
					  {
					      switch(select_position)
						  {
						      case 0x00:                    //上页按键确认

//					 	              select_position = 0;       //重新指向第一条提示信息
					 	              Prev_page_affirm(0);
					 	              disp_no_u = 0;
									  break;
							  case 0x01:                    //返回按键确认
							           disp_mode = FIRST_MENU_DISP;
						               disp_no_u = 0 ;
									   break;
							  default:
							           break;
					        }
							select_position = 0;
					  }
					 break;
           case 0x01:             /* 一条信息时处理*/
		             switch(select_position)
					 {
					    case 0x00:
						          In_third_menu();
								  Get_mes_content(1,0);
//								  disp_no_u = 0;
								  break;
						case 0x01:              
						          if(list_num >= 5)    //上页按键确认
						          {  
							           Prev_page_affirm(1);
									   
								   }
								  else               //"返回"按键确认
								     disp_mode = FIRST_MENU_DISP; 
								  break;
						case 0x02:             //"返回"按键确认
						          if(list_num >=5)
						              disp_mode = FIRST_MENU_DISP;
//								  disp_no_u = 0 ;
								  break;
						default:
						          break;
					  }
					  select_position = 0;

					   break;
						          
           case 0x02:             /* 二条信息时处理*/
		             switch(select_position)
					 {
					    case 0x00:
						         In_third_menu();
                                 Get_mes_content(2,0);
								  break;
						case 0x01:
						          In_third_menu();
                                 Get_mes_content(2,1);
								  break;
						case 0x02:              
						          if(list_num>=5)    //上页按键确认
						           {
						               Prev_page_affirm(2);
									    
									}
								  else               //"返回"按键确认
								     disp_mode = FIRST_MENU_DISP; 
								  break;
						case 0x03:             //"返回"按键确认
                                  disp_mode = FIRST_MENU_DISP ;
//						          select_position = 0;
								
                                  break;

						default:
						          break;
					   }
                      select_position = 0;
					   break;
           case 3:             /* 三条信息时处理*/
                     switch(select_position)
					 {
					    case 0x00:
						          In_third_menu();
                                  Get_mes_content(3,0);
								  break;
						case 0x01:
						         In_third_menu();
                                 Get_mes_content(3,1);
								  break;
                        case 0x02:
                                  In_third_menu();
                                 Get_mes_content(3,2);
                                  break;
						case 0x03:              
						          if(list_num>=5)    //上页按键确认
						          {
					                   Prev_page_affirm(3);   //传递1是由于该屏不足五条,mes_list
									                          //指向空
								  }
								  else               //"返回"按键确认
								     disp_mode = FIRST_MENU_DISP; 
								  break;
						case 0x04:             //"返回"按键确认
						          select_position = 0;
								  disp_mode = FIRST_MENU_DISP;
//                                  disp_no_u = 0 ;
                                  break;

						default:
						          break;
					  }
                      select_position = 0;
					   break;
        case 4:                /* 四条信息时处理*/
                     switch(select_position)
					 {
					    case 0x00:
						          In_third_menu();
                                   Get_mes_content(4,0);
								  break;

						case 0x01:
						          In_third_menu();

⌨️ 快捷键说明

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