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

📄 key.c

📁 富士通单片机MB90F387上实现MODBUS
💻 C
字号:
/*****************
* 处理变频器键盘
*****************/

#include    "GLOBAL.H"



uint  psw1;  //密码1  保存在操作器上
uchar psw2req_flag = 0;
uchar psw2change_flag = 0;
uchar menu_ptr1;   
 
// 20 毫秒扫描一次,读取键值
uchar read_key(void)
{
    uchar keycode,buf,i;
    static uchar key_delay[10];
    // 扫描键值   
    keycode = 0;
    ROW0 = 0;
    delay(1);
    if (!COL0) keycode = KEY_ENTER; // 9
    if (!COL1) keycode = KEY_DN;    // 8
    if (!COL2) keycode = KEY_ESC;   // 7
    ROW0 = 1;

    ROW1 = 0;
    delay(1);
    if (!COL0) keycode = KEY_RIGHT; // 6
    if (!COL1) keycode = KEY_STOP;  // 5
    if (!COL2) keycode = KEY_LEFT;  // 4
    ROW1 = 1;

    ROW2 = 0;
    delay(1);
    if (!COL0) keycode = KEY_F2;    // 3
    if (!COL1) keycode = KEY_UP;    // 2
    if (!COL2) keycode = KEY_HOME;  // 1
    ROW2 = 1;
   

   // 单个按键
   for (i = 1; i < 10; i++)
   {
      if (keycode != i)
      {
          key_delay[i] = 0;
      }    
	  else
	  {
		  if (key_delay[i] < 60)
		  { 
		      key_delay[i]++;  
		  }
		  else 
		  {
		      key_delay[i] = 36; //处理一直按住
		  }                
		  if ((key_delay[i] == 2) || (key_delay[i] == 36)) return(i);
	  }
   }   
   return(0);
}
/*********************************************************************************
* 名称:process_keys
* 功能:密码登陆
* 输入:keycode 键盘码
*          
* 输出: 

* 返回:无
***********************************************************************************/
void process_keys(uchar keycode)
{
    uint const bit_val[] = {1,10,100,1000,10000};
	  //uchar i;
	  uint ii;
	  uint pswtmp1,pswtmp2,pswtmp3;
    if (keycode == KEY_LEFT)
    {
        if (bit_ptr < 4)
        		bit_ptr++;
        else
        		bit_ptr = 0;
    }
    if (keycode == KEY_RIGHT)
    {
        if (bit_ptr > 0) 
        		bit_ptr--;
        else 
        		bit_ptr = 4;
    }
    if (keycode == KEY_UP)    // 参数增量
    {
        if (0xffff - edit_val >= bit_val[bit_ptr])
        {
            edit_val += bit_val[bit_ptr];
        }
        
    }
    if (keycode == KEY_DN)    // 参数减量
    {
        if (edit_val >= bit_val[bit_ptr])
        {
            edit_val -= bit_val[bit_ptr];
        }
        else
        {
            edit_val = 0;
            bit_ptr = 0;
        }
    }	  
    switch(menu_ptr1)
    {    	
    	  case 0://主机地址设置,默认31
    	  {	  	    
            if (keycode == KEY_F2)
            {
                if(LCD_OFFSET-10>=0) LCD_OFFSET-=10;
                else LCD_OFFSET =250;       
                write_eerom(1006,LCD_OFFSET);  
                update_dac(LCD_OFFSET);   // 调整 LCD 偏置电压                     
            }      	  	  	  
            if (keycode == KEY_ESC)
		    		{    	 		    			 	
               	bit_ptr = 0;   
			    			menu_ptr1 = 0;		
			    			edit_val = read_eerom(1010);	    			 	
		    	  }
            else if (keycode == KEY_ENTER)
		    		{    	 
		    			 	Slave_addr = edit_val;
		    			 	write_eerom(1010,(uchar)Slave_addr); //注意类型转换
		    			 	menu_ptr1 = 1;
		    			 	edit_val = read_eerom(1011);
		    	  }		    	  
				  	break;    	
				  	  	
			  }
		 		case 1://模式选择,默认RTU
    	  {
            if (keycode == KEY_ESC)
		    		{    	 
               	bit_ptr = 0;   
			    			menu_ptr1 = 0;		
			    			edit_val = read_eerom(1011);		    			 	
		    	  }
            else if (keycode == KEY_ENTER)
		    		{    	 
		    			 	Modbus_mode = edit_val;
		    			 	write_eerom(1011,(uchar)Modbus_mode); //注意类型转换
		    			 	menu_ptr1 = 2;
		    			 	edit_val = read_eerom(1012);
		    	  }			    	  
				  	break;    	  	
			  }
				case 2: //通信波特率,默认9600
    	  {
            if (keycode == KEY_ESC)
		    		{    	 
               	bit_ptr = 0;   
			    			menu_ptr1 = 1;	
			    			edit_val = read_eerom(1012);			    			 	
		    	  }
            else if (keycode == KEY_ENTER)
		    		{    	 
		    			 	ModbusBPS = edit_val;
		    			 	write_eerom(1012,(uchar)ModbusBPS); //注意类型转换
		    			 	menu_ptr1 = 3;
		    			 	edit_val = read_eerom(1013);		    			 	
		    	  }			    	  
				  	break;    	  	
			  }				
				case 3: //通信格式选择 默认 8,N,1 	
    	  {
            if (keycode == KEY_ESC)
		    		{    	 
               	bit_ptr = 0;   
			    			menu_ptr1 = 2;	
			    			edit_val = read_eerom(1013);	    			 	
		    	  }
		    	  else if (keycode == KEY_ENTER)
		    		{    	 
		    			 	Commformat = edit_val;
		    			 	write_eerom(1013,(uchar)Commformat); //注意类型转换
		    			    setloop = 0x0f;
		    	  }	
				  	break;    	  	
			  }
				case 4: //密码登陆 	
			  {								
            if (keycode == KEY_ESC)
		    		{
		    				if(psw2req_flag == 0)
		    				{
		    	   		 		menu_ptr = 0;		    	   		 		
		    	   		 		psw2change_flag = 0;
		    	   		}
		    				if(psw2change_flag == 1) 
		    				{
		    						menu_ptr1 = 2;		    					
		    						psw2change_flag = 0;
		    				}
               	edit_val = 0;
               	bit_ptr = 0;                
            }            
						if (keycode == KEY_ENTER)
		    		{ 	     		
		    			      			    			   
          			if(psw2req_flag == 0)//psw login status
		    				{		 		   					 			   					 		
		       				 	if((edit_val == 54720)||(edit_val == 54726))
			   					  {
			   					 			edit_val = psw1;
			   					 			break;
			   					  }		       				 	       				 	         					
			        		  
			        	    bit_ptr = 0;
									  edit_val = 0;					  		    	
		    				}
		    	  } 
            if (keycode == KEY_F2)
            {
                if(LCD_OFFSET-10>=0) LCD_OFFSET-=10;
                else LCD_OFFSET =250;       
                write_eerom(1006,LCD_OFFSET);  
                update_dac(LCD_OFFSET);   // 调整 LCD 偏置电压                     
            } 		    	  
            break;
        }
		 		default:
		 				break;
	  } 
}
/*********************************************************************************
* 名称:display_menus
* 功能:处理psw
* 输入:keycode 键盘码 10          
* 输出: 
* 返回:无
***********************************************************************************/
void display_menus(void)
{
    char  buff[17];
    char  *p;
		uchar i;
		
	
    switch(menu_ptr1)
    {
      case 0://设主机地址,默认31
		 	{	   	 	   	 					    		    			    				
      		display_str(0,0,"  Setting Menu  ");	
      		display_str(0,2,"================");	
      		set_cursor(8-bit_ptr,4);  // 光标显示
      		strcpy(buff,    "                ");		          
          sprfu(&buff[4],edit_val,0,5);// 显示数据
          display_str(0,4,buff);	       
					display_str(0,6," Slave addr set ");
					          			 		
		 			break;
		 	}
		 	case 1://设工作模式,默认RTU 
		 	{	   	 			
      		display_str(0,0,"  Setting Menu  ");	
      		display_str(0,2,"================");	
      		set_cursor(8-bit_ptr,4);  // 光标显示
      		strcpy(buff,    "                ");				 			    		    			    				
          sprfu(&buff[4],edit_val,0,5);// 显示数据
          display_str(0,4,buff);	          
					display_str(0,6,"Modbus Mode set ");		 		
					break;																				
			}
		 	case 2://设波特率,默认9600 
		 	{
      		display_str(0,0,"  Setting Menu  ");	
      		display_str(0,2,"================");	
      		set_cursor(8-bit_ptr,4);  // 光标显示
      		strcpy(buff,    "                ");				 		
          sprfu(&buff[4],edit_val,0,5);// 显示数据		 		
          display_str(0,4,buff);	       
					display_str(0,6," BaudRate Set   ");		 		
					break;			 																					
			}
		 	case 3://设数据格式,默认8,N,1
		 	{
      		display_str(0,0,"  Setting Menu  ");	
      		display_str(0,2,"================");	
      		set_cursor(8-bit_ptr,4);  // 光标显示
      		strcpy(buff,    "                ");				 		
          sprfu(&buff[4],edit_val,0,5);// 显示数据
          display_str(0,4,buff);	          
					display_str(0,6," Data format Set");		 		
					break;			 																																								
			}						
			case 4: //密码登陆	
			{   		   		    					
		   	 	set_cursor(9-bit_ptr,6);  // 光标显示	    	
          display_str(0,0,"    密码输入    ");
    		  display_str(0,2, "==F2键调对比度==");
		    	display_str(0,4,"                ");		    			    				
					strcpy(buff,"                ");
          sprfu(&buff[5],edit_val,0,5);// 显示数据
          display_str(0,6,buff);							
					break;
			}
			case 5: //密码修改
			{
		    	set_cursor(9-bit_ptr,4);  // 光标显示  
		    	display_str(0,0,"    密码更改    ");
		  		display_str(0,2, "================");	    			    
		  		strcpy(buff,"                ");
          sprfu(&buff[5],edit_val,0,5);// 显示数据
          display_str(0,4,buff);        
        	display_str(0,6,"按ESC退出修改   ");             	
					break;	
			}				
		 	default:
		 			break;
    }
}

⌨️ 快捷键说明

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