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

📄 ex_support.c

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 C
📖 第 1 页 / 共 2 页
字号:
   else if (!(PINC & (BIT(5))))
   {
       chTempKeyCode = 25;
	   return chTempKeyCode;
   }
   
 //////////////////////////////////////////////////////////////
   //对1-4按钮进行扫描   
   DDRC &= ~(BIT(2) | BIT(3) | 
   			 BIT(4) | BIT(5));	//把端口pc2-pc5设置为输入
   DDRC  |=  BIT(1);			//把pc1端口设为输出
   
   PORTC |=  BIT(1) | BIT(2) | BIT(3) |
    		 BIT(4) | BIT(5);
			 
   PORTC &=~ BIT(1); 			//把pc1端口拉低
   NOP();
   NOP();
   
   
   if (!(PINC & (BIT(2))))     //读取pc2端口,如果返回值是0则表明按键被按下,    
                               //则返回按键的值                                  
                               //以下依次对pc3、pc4、pc5逐个读取值,如果返回值为0
                               //则返回相应按键值                                
   {
       chTempKeyCode = 1;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(3))))
   {
       chTempKeyCode = 2;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(4))))
   {
       chTempKeyCode = 3;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(5))))
   {
       chTempKeyCode = 4;
	   return chTempKeyCode;
   }
   
   
//////////////////////////////////////////////////////////////
   
   //对6-7按钮进行扫描   
   DDRC &= ~(BIT(1) | BIT(3) | 
   			 BIT(4) | BIT(5));//把端口pc1,pc3-pc5设置为输入
			 
   DDRC  |=  BIT(2);//把pc2端口设为输出
   
   PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
   			 BIT(4) | BIT(5);
			 
   PORTC &= ~BIT(2); //把pc2端口拉低
   NOP();
   NOP();
   
   
   if (!(PINC & (BIT(3))))     //读取pc3端口,如果返回值是0则表明按键被按下,    
                               //则返回按键的值                                  
                               //以下依次对pc4、pc5逐个读取值,如果返回值为0     
                               //则返回相应按键值                                
   {
       chTempKeyCode = 6;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(4))))
   {
       chTempKeyCode = 7;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(5))))
   {
       chTempKeyCode = 8;
	   return chTempKeyCode;
   }
 
//////////////////////////////////////////////////////////////
   
   //对11-12按钮进行扫描   
   DDRC &= ~(BIT(2) | BIT(1) | 
   			 BIT(4) | BIT(5));//把端口pc1-pc2,pc4-pc5设置为输入
			 
   DDRC  |=  BIT(3);//把pc3端口设为输出
   
   PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
   			 BIT(4) | BIT(5);
			 
   PORTC &= ~BIT(3);//把pc2端口拉低
   NOP();
   NOP(); 
   
   if (!(PINC & (BIT(4))))     //读取pc4端口,如果返回值是0则表明按键被按下,    
                               //则返回按键的值                                  
                               
   {
       chTempKeyCode = 11;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(5))))//读取pc5端口,如果返回值是0则表明按键被按下,    
                               //则返回按键的值                                  
   {
       chTempKeyCode = 12;
	   return chTempKeyCode;
   }
 ////////////////////////////////////////////////////////////////  
   //对16按钮进行扫描   
   DDRC &= ~(BIT(2) | BIT(1) | 
   			 BIT(3) | BIT(5));//把端口pc1-pc3、pc5设置为输入
			 
   DDRC  |=  BIT(4);								//把pc4端口设为输出
   
   PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
   			 BIT(4) | BIT(5);
			 
   PORTC &=~ BIT(4);			//把pc4端口拉低 
   NOP();
   NOP();
   
   
   if (!(PINC & (BIT(5))))                                         
   {
       chTempKeyCode = 16;
	   return chTempKeyCode;     //读取pc5端口,如果返回值是0则表明按键被按下,  
                               //则返回按键的值     
   }   
   
   
 //////////////////////////////////////////////////////////////
  //对20-17按钮进行扫描  
   DDRC &= ~(BIT(2) | BIT(3) | 
   			 BIT(4) | BIT(1));				//把端口pc1-pc4设置为输入
			 
   DDRC  |=  BIT(5);						//把pc5端口设为输出
   
   PORTC |=  BIT(1) | BIT(2) | BIT(3) | 
   			 BIT(4) | BIT(5);
			 
   PORTC &= ~BIT(5); 						//把pc5端口拉低 
   NOP();
   NOP();
   
   
   
   if (!(PINC & (BIT(4))))     //读取pc4端口,如果返回值是0则表明按键被按下,    
                               //则返回按键的值                                  
                               //以下依次对pc3-pc1逐个读取值,如果返回值为0     
                               //则返回相应按键值                                
   {
       chTempKeyCode = 20;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(3))))
   {
       chTempKeyCode = 19;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(2))))
   {
       chTempKeyCode = 18;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(1))))
   {
       chTempKeyCode = 17;
	   return chTempKeyCode;
   }
   
   
   
//////////////////////////////////////////////////////////////
    //对15-13按钮进行扫描  
   
   DDRC  &= ~(BIT(1) | BIT(3) | 
   			  BIT(2) | BIT(5));					//把端口pc1-pc3、pc5设置为输入
			  
   DDRC  |=   BIT(4);							//把pc4端口设为输出
   
   PORTC |=   BIT(1) | BIT(2) | BIT(3) | 
   		      BIT(4) | BIT(5);
			  
   PORTC &=  ~BIT(4); 							//把pc4端口拉低 
   NOP();
   NOP();
   
    
   if (!(PINC & (BIT(3))))    	 //读取pc3端口,如果返回值是0则表明按键被按下,    
                              	 //则返回按键的值                                  
                              	 //以下依次对pc2-pc1逐个读取值,如果返回值为0      
                              	 //则返回相应按键值                                
   {
       chTempKeyCode = 15;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(2))))
   {
       chTempKeyCode = 14;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(1))))
   {
       chTempKeyCode = 13;
	   return chTempKeyCode;
   }
 
 
 
//////////////////////////////////////////////////////////////
    //对10-9按钮进行扫描  
   
   DDRC  &= ~(BIT(2) | BIT(1) | 
   			  BIT(4) | BIT(5));		//把端口pc1-pc2、pc4-pc5设置为输入
   
   DDRC  |=   BIT(3);				//把pc3端口设为输出
   
   PORTC |=   BIT(1) | BIT(2) | 
   			  BIT(3) | BIT(4) | BIT(5);
			  
   PORTC &=  ~BIT(3);				//把pc3端口拉低 
   NOP();
   NOP(); 
   
   
   if (!(PINC & (BIT(2))))     		//读取pc2端口,如果返回值是0则表明按键被按下,    
                              		//则返回按键的值                                                            
   {
       chTempKeyCode = 10;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(1))))		//读取pc1端口,如果返回值是0则表明按键被按下,    
                               		//则返回按键的值            
   {
       chTempKeyCode = 9;
	   return chTempKeyCode;
   }
   
   
  ////////////////////////////////////////////////////// 
   //对5按钮进行扫描  
   DDRC  &= ~(BIT(4) | BIT(1) | 
   		      BIT(3) | BIT(5));		//把端口pc1、pc3-pc4设置为输入
			  
   DDRC |= BIT(2);					//把pc2端口设为输出
   
   PORTC |= BIT(1) | BIT(2) | BIT(3) |
   		    BIT(4) | BIT(5);
			
   PORTC &= ~BIT(2); 				//把pc2端口拉低 
   NOP();
   NOP();
   
   if (!(PINC & (BIT(1))))    		//读取pc1端口,如果返回值是0则表明按键被按下,    
                             		//则返回按键的值                                  
   {
       chTempKeyCode = 5;
	   return chTempKeyCode;
   }   
   

   return chTempKeyCode;			//返回按键值
}

UINT8 Get_Code (UINT8 chi)
{
	UINT8 chj;
	UINT8 Table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
	switch(chi)
	{
		case 1:		chj = Table[1];break;
		case 2:		chj = Table[2];break;
		case 3:		chj = Table[3];break;
		case 4:		chj = Table[4];break;
		case 5:		chj = Table[5];break;
		case 6:		chj = Table[6];break;
		case 7:		chj = Table[7];break;
		case 8:		chj = Table[8];break;
		case 9:		chj = Table[9];break;
		case 10:	chj = Table[0];break;
		case 11:	chj = Table[1];break;
		case 12:	chj = Table[2];break;
		case 13:	chj = Table[3];break;
		case 14:	chj = Table[4];break;
		case 15:	chj = Table[5];break;
		case 16:	chj = Table[6];break;
		case 17:	chj = Table[7];break;
		case 18:	chj = Table[8];break;
		case 19:	chj = Table[9];break;
		case 20:	chj = Table[0];break;
		case 21:	chj = Table[1];break;
		case 22:	chj = Table[2];break;
		case 23:	chj = Table[3];break;
		case 24:	chj = Table[4];break;
		case 25:	chj = Table[5];break;
		default:	chj = 0xFF;
	}
	return chj;
}

⌨️ 快捷键说明

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