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

📄 keycode.c

📁 38键小键盘程序,可以实现大小键盘的切换工作,并且接收命令和液晶显示
💻 C
📖 第 1 页 / 共 3 页
字号:
				break ;
				
			 case 0x7D :
				{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
		    break ;
		    
			 case 0x74 :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
			  break ;
			  
		   case 0x7A :
		   	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
				break ;
			
			 case 0x51 :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;	
				}
				break ;
				
			 case 0x71 :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
				break ;
				
				case 0x53 :
				{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;	
				}
				break ;
				
			 case 0x7B :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
		    break ;
		    
			 case 0x79 :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
		    break ;
		   
			 case 0x76 :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
			  break ;
			
			 case 0x3F :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;	
				}
			  break ;
			  
		  case 0x40 :
		  	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;	
				}
				break ;
				
			case 0x83 :
				{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
			  break ;
				
			 case 0x7E :
			 	{
					 biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
				}
				break ;	      
        //////////////////////2007-07-03新增结束////////////////////////////
        /***************************************************************/
       if(atxtflag==1)
				{		 
 				   //case 0x78:   //AT按下F11
 				   if(ScanCode==0x78)
 				   	{  
 				   		Delay400Ms();
 				   		Delay400Ms();
 				   		if(ScanCode==0x78)
 				   			{
 				   				Delay400Ms();
 				   				Delay400Ms();
 				   				if(ScanCode==0x78)
 				   					{
 				    
	           	   delay5Ms();
        		     buzzer = 0;
	               delay5Ms();
	               buzzer = 1;
	               delay5Ms();
	               buzzer = 0;
	               delay5Ms();
	               buzzer = 1;
	               delay5Ms();
	               buzzer = 0;
	               delay5Ms();
	               buzzer = 1;
	               delay5Ms();
	               buzzer = 0;
	               delay5Ms();
	               buzzer = 1;
	               biaozhiflag = 0;
	               inhibit = 0;
	               EA = 0;
					}	
				}
			}
	  }					      
				else //(atxtflag==0)XT
				{
							  //case 0x57:   //XT按下F11
						if(ScanCode==0x57)
 				   	{  
 				   		Delay400Ms();
 				   		Delay400Ms();
 				   		if(ScanCode==0x57)
 				   			{
 				   				Delay400Ms();
 				          Delay400Ms();
 				   				if(ScanCode==0x57)
 				   					{
							
							         delay5Ms();
        		           buzzer = 0;
	                     delay5Ms();
	                     buzzer = 1;
	                     delay5Ms();
	                     buzzer = 0;
	                     delay5Ms();
	                     buzzer = 1;
	                     delay5Ms();
	                     buzzer = 0;
	                     delay5Ms();
	                     buzzer = 1;
	                     delay5Ms();
	                     buzzer = 0;
	                     delay5Ms();
	                     buzzer = 1;
	                     biaozhiflag = 0;
	                     inhibit = 0;
	                     EA = 0;
							     } 
							  }
							}
						}
							 break ;
        /***************************************************************/
				default:	
							      break;  
                 } //结束switch (ScanCode)
              }  //结束if (!Key_UP)
   else
   {	
			Key_UP = 0;
		}
	BF = 0; //标识字符处理完了
} 
/////////////////////////接收大键盘命令处理完成//////////////////////
//////////////////////////小键盘扫描驱动程序开始/////////////////////
//计算校验函数
//unsigned char parity(unsigned char x)
//{
//  x^=x;
//  if(P)return(1);
//  else return(0);
//}

/*unsigned char parity2(unsigned int x){
#pragma asm
  mov a,r7
  xrl ar6,a
#pragma endasm
  if(P)return(1);
  else return(0);
}*/
/////////////////////////////////////////////
//2007-6-16修改时序(发送数据的时序)
/////////////////////////////////////////////
void SEND_byte(unsigned char x)
{
  bit flag_check;
 	uchar i,temp,char_temp;
	flag_check = 1;
  //inhibit = 1;       //关闭标准键盘
 	delay5Ms();
 	temp = x;
 	for(i=0;i<8;i++)
 	{
 		char_temp = temp&0x01;
 		if(char_temp==0x01)
 			{
 				flag_check = !flag_check;
 				}
 				temp = temp >>1;
 		}
 		
 		CLK = 1;        //首先把时钟线置高   
 		while(!CLK)     //判断时钟是否是低等待
 		{  ;  }
 		CLK = 1 ;
 		DATA = 1;
 		if(CLK == 1)   
 		{
 			delayus(30);//3
 			}
    if(CLK == 1 && DATA == 1) //发送数据到计算机
    {
    	DATA = 0;               //发送开始位
    	delayus(10);//1
    	CLK = 0;
    	delayus(5);//1
    	temp = x;
    	for(i=0;i<8;i++)        //发送8位数据低位在先
    	{
    		CLK = 1;
    		delayus(5);//1
    		char_temp = temp&0x01;
    		if(char_temp == 0x01)
    		{
    			DATA = 1;
    		}
    		else 
    		{ DATA = 0; }
    		delayus(10);//1
    		CLK = 0;
    		delayus(5);//1
    		temp = temp >>1;
    	}
    	 CLK = 1;               //发送检测位
    	 delayus(5);//1
    	 DATA = flag_check;
    	 delayus(10);//1
    	 CLK = 0;
    	 delayus(5);//1
    	 CLK = 1;              //发送停止位
    	 delayus(5);//1
    	 DATA = 1;
    	 delayus(10);//1
    	 CLK = 0;
    	 delayus(5);//1
    	 CLK = 1;
    	 delayus(30);//3
    	 CLK = 1;
    	 DATA = 1;
    	 if(CLK ==1&&DATA == 0)//PC机正在发送数据到mcu
    	 	{
    	 		return;                    //返回到接收函数
    	 		}
     } 	
     //inhibit = 1 ;//打开标准键盘	
} 
///////////////////////////////////////////////////////////////////////////  
unsigned char  ReadKeyVar(void)              //读取的健值  
{ 
    unsigned char i;                         //行下标 
    unsigned char j;                         //列下标 
    unsigned char hp;                        //行位置 
    unsigned char lp;                        //列位置 
    unsigned char keyval=NOKEY;              //返回键值 
    LOHI();                                  //列出行入 
    if (P1!=0xff)                            //如果有键按下 
    { 
        delay_ms(10);                        //延时消抖 
        hp=P1;                               //读取行位置值 
        for ( i=0; hp!=hh[i]&&i<8 ; i++ );   //查找 
        if ( i!=8)                           //如果找到了 
        { 
            HOLI(); 
            delay_ms(10);                               //就翻转 
            lp=P2&0Xff;                                 //读取列位置值,屏蔽不用的位 
            LOHI();      
            delay_ms(10);                               //翻回去 
            for ( j=0; lp!=ll[j] && j<5 ; j++ );        //查找 
            if ( j!=5)                                  //如果找到了 
            { 
                keyval=keyvartab[i][j];                //就取出键值 
                buzzer = 0;
               	delay5Ms();
	              delay5Ms();
                buzzer = 1;
                keyval=keyvartab[i][j];                //就取出键值 
            } 
            delay_ms(10);
            while(P1 != 0xff );                         //等待按键抬起 
        } 
    } 
    return (keyval);                                     //返回键值 
} 
/////////////////////////////////////////////////////////////////
//数字键到编码的转换函数
void numbertocode(void)
{ 
	unsigned char i;
	unsigned char TempCyc;
	unsigned char Keydata;
	unsigned char ASCII_code;
	//////biaozhiflag = 0;   //清有键标志位
	//////inhibit = 0;       //打开标准键盘
  if (DisNum > 15)
	{
		DisplayListChar(0, 1, Cls);//清LCD第二行
		DisNum = 0; 
	 } 
	Keydata = ReadKeyVar();
  if(Keydata == '!') //判断是否是ENTER键
  {  
     //////inhibit = 0;       //打开标准键
  	 if(atxtflag == 1) //判断是AX还是XT
  	 { 
	   SEND_byte(0x5A);
	   SEND_byte(0xf0);
	   SEND_byte(0x5A);
	 } //发送编码到PC机
  	 else
  	 { 
	   SEND_byte(0x1C);
	   ////SEND_byte(0x9C);
	  }

  	 DisplayListChar(0, 1, Cls);//清LCD第二行
	 DisNum = 0; 
  	 inhibit = 1;       //打开标准键盘
  	 biaozhiflag = 1;
  	 EA = 1;
     return ;  	 	      //返回
  	}
		else if(Keydata == '~') //判断是否是back键
		{  
			 //////inhibit = 0;       //打开标准键盘  
			 if(bit1_6flag == 1) //清1位数据 
				 {
				 	if(DisNum==0);			//判断当前显示位置是否是0位		     
				   else{ 
				  	   --DisNum;      //当前位置向左移一位
							 if(DisNum<16)  //判断是否是小于16个字母 
							 	{ DisplayOneChar(DisNum, 1, 0x20); } //清除一位数据
						   }
						  if(atxtflag == 1)  //判断是AX还是XT
						   	{ 
							SEND_byte(0x66); 
							SEND_byte(0xf0);
							SEND_byte(0x66); 
							} //发送编码到PC机
						   else
						   	{ 
							  SEND_byte(0x0E); 
							  ////SEND_byte(0x8E); 
							 }	 
					 }
				else   //清6为数据
				{
					for(i=0;i<6;i++)
					{
							if(DisNum==0);	//判断当前显示位置是否是0位					     
				      else           
				       { 
				  	    --DisNum;     //当前位置向左移一位
							  if(DisNum<16) //判断是否是小于16个字母 
							 	 { DisplayOneChar(DisNum, 1, 0x20); } //清除一位数据
						    }
						     if(atxtflag == 1) //判断是AX还是XT  
						   	 { 
							   SEND_byte(0x66);
							   SEND_byte(0xf0);
							   SEND_byte(0x66);
							   } //发送编码到PC机
						     else
						   	 { 
							    SEND_byte(0x0E);
								////SEND_byte(0x8E);
							 }

						   } //结束清6位数据	
					} //结束清6位数据	   		                   
        } //结束BACK键
         
		else //数字键或字母键
		{
			if(atxtflag == 1) //AT下的数字键或字母键
		   {  
		     	for(TempCyc = 0;(ATunshift[TempCyc][1]!=Keydata)&&(TempCyc<38); TempCyc++); //查表显示
			    if (ATunshift[TempCyc][1] == Keydata) 
			    { 
			     //////inhibit = 0;       //打开标准键盘  
				   if(numberflag == 1)
				   {  DisplayOneChar(DisNum, 1, ATunshift[TempCyc][1]); }
			      else
			      { DisplayOneChar(DisNum, 1, '*'); }
				    ASCII_code = 	ATunshift[TempCyc][0];
				    SEND_byte(ASCII_code);
					SEND_byte(0xf0);
					SEND_byte(ASCII_code);
					DisNum++;
				
			     }  //结束解码 
			  }   //结束AT下的发送和显示数字键或字母键
			else  //XT下的数字键或字母键
			 	{
			    for(TempCyc = 0;(XTunshift[TempCyc][1]!=Keydata)&&(TempCyc<38); TempCyc++); //查表显示
				  if (XTunshift[TempCyc][1] == Keydata) 
					 { 
					 	//////inhibit = 0;       //打开标准键盘  
			      if(numberflag == 1)
						{  DisplayOneChar(DisNum, 1, XTunshift[TempCyc][1]); }
						else
						{  DisplayOneChar(DisNum, 1, '*'); }	
				    ASCII_code = 	XTunshift[TempCyc][0];
				    SEND_byte(ASCII_code);
					////SEND_byte(ASCII_code+0x80);
				    DisNum++;
					
   	       } //结束解码 
		     } //结束XT下的发送和显示数字键或字母键	
   	   } //结束发送和显示数字键或字母
 } //结束解码程序
//////////////////////////小键盘扫描驱动程序开始///////////////////////////    
void main(void)
{
  unsigned char TempCyc;
   a1 = 1;
	 a2 = 1;
   inhibit = 1;
   atxtflag = 1;
   numberflag = 1;
	 bit1_6flag = 1;
	 
   buzzer = 0;
	 delay5Ms();
	 delay5Ms();
	 buzzer = 1;
	 delay5Ms();
	 delay5Ms();
	 buzzer = 0;
	 delay5Ms();
	 delay5Ms();
	 buzzer = 1;
	 
	 
	Delay400Ms(); //启动等待,等LCM讲入工作状态
	initlcm4bit(); //LCM初始化
	Delay5Ms(); //延时片刻(可不要)

	DisplayListChar(0, 0, cdle_net); //第一行显示    WELCOME!    
	DisplayListChar(0, 1, email);    //第二行显示we do our best!
	
	for (TempCyc=0; TempCyc<4; TempCyc++)
			Delay400Ms(); //延时
		  DisplayListChar(0, 1, Cls);	   //清显示
	
      IT1 = 0; //设外部中断1为低电平触发
	    EA = 1;
	    EX1 = 1; //开中断
	    
	   while(1)
		  {
			  if(BF)
				{ 
					 Decode(KeyV);
				   if(biaozhiflag==0)
				   {
				    do{	
				        numbertocode();
				       }while(biaozhiflag==0);
					   }
				    else
				     {
				      biaozhiflag=1;
				      inhibit = 1;//////后加07-06-23
				      EA = 1;
				     }
				   }     
			    else
			    {
			     biaozhiflag=1;//////后加07-06-23
			 	   inhibit = 1;
				   EA = 1; //开中断
			     }
		     }
}     

⌨️ 快捷键说明

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