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

📄 pc_keybd.c

📁 PS2 keyboard driver using ATMEGA8L series uP
💻 C
字号:

/*****************************************************************/
/* KEYBOARD INTERRUPT                                            */ 
void Int1(void) interrupt 2 using 2
{
//	static unsigned char value;
	KData=1;
	if (kb_bit_count < 11 && kb_bit_count > 2)	// bit 3 to 10 is data & parity bit
	{															// start and stop bits are ignored
		value = value >> 1;
		if (KData) value = value | 0x80;
		kb_bit_count--;
	}
	else
	{
		if (--kb_bit_count == 0)	// All bit received
		{
			DebugValue=value;
			decode();
			kb_bit_count=11;
		}
	}
} 


/******************************************************************/
/* KEYBOARD ROUTINEs																*/
void KeyBd_Init(void)
{
	inptr = KEYBDBUF;
	outptr = KEYBDBUF;
	buff_cnt=0;
	kb_bit_count=11;
//	IT1=1;
//	KeyMaster=0;
//	EX0=0;
}

void decode(void)
{
	unsigned char i,temp;
	FuncBit=0;
	if(!is_up)	//last data received was the up key identifier
	{
		switch (value)
		{
			case 0xFA:
				FABit=1;
				FuncBit=1;
				break;
			
			case 0xAA:
				AABit=1;
				FuncBit=1;
				break;
				
			case 0xEE:
				EEBit=1;
				FuncBit=1;
				break;
				
			case 0xFE:
				ResendBit=1;
				FuncBit=1;
				break;
			
			case 0xFF:
				FFBit=1;
				FuncBit=1;
				break;
							
			case 0xF0:	// the up-key identifier
				is_up =1;
				FuncBit=1;
				break;
			
			case 0x12: //left SHIFT
				shiftbit=1;
				FuncBit=1;
				break;
			
			case 0x59:	//right SHIFT
				shiftbit=1;
				FuncBit=1;
				break;
			
			case 0xE0:	// the extend-key identifier
				extendbit=1;
				FuncBit=1;
				break;

			case 0x11:
				AltRightBit=1;
				FuncBit=1;
				break;
            	
			case 0x14:
				CtlRightBit=1;
				FuncBit=1;
				break;
							
			case 0x70:
				InsertBit=1;
				FuncBit=1;
				break;
				
			case 0x71:
				DeleteBit=1;
				FuncBit=1;
				break;
				
			case 0x6b:
				LArrowBit=1;
				FuncBit=1;
				break;
				
			case 0x6c:
				HomeBit=1;
				FuncBit=1;
				break;
				
			case 0x69:
				EndBit=1;
				FuncBit=1;
				break;
				
			case 0x75:
				UArrowBit=1;
				FuncBit=1;
				break;
				
			case 0x72:
				DArrowBit=1;
				FuncBit=1;
				break;
				
			case 0x7d:
				PageUpBit=1;
				FuncBit=1;
				break;
				
			case 0x7a:
				PageDownBit=1;
				FuncBit=1;
				break;
				
//			case 0x76:
//				ESCBit=1;
//				KeyBdTrigger=1;
//				FuncBit=1;
//				break;
				
			case 0x74:
				RArrowBit=1;
				FuncBit=1;
				break;
				
//			case 0x4a:
//				NumSlashBit=1;
//				FuncBit=1;
//				break;
				
//			case 0x5a:
//				EnterBit=1;
//				KeyBdTrigger=1;
//				FuncBit=1;
//				break;
			
			default:
			{
				if (!extendbit)
				{
					if (!shiftbit)
				 	{
				 		i=0;
				 		do
				 		{
				 			temp=unshifted[i][0];
				 			if (temp == value)
					 		{
								DebugValue=unshifted[i][1];
//								KEYBDBUF[0]=unshifted[i][1];
								KeyBdTrigger=1;
					 			break;
				 			}
							i++;
				 		}while(temp);
				 	}
				 	else
			 		{
				 		i=0;
				 		do
				 		{
							temp=shifted[i][0];
				 			if (temp == value)
					 		{
								DebugValue=shifted[i][1];
								KeyBdTrigger=1;
					 			break;
				 			}
							i++;
				 		}while(temp);
				 	}
				}
				else
				{
					switch (value)
					{
						case 0x11:
							AltRightBit=1;
							FuncBit=1;
							break;
            	
						case 0x14:
							CtlRightBit=1;
							FuncBit=1;
							break;
							
						case 0x70:
							InsertBit=1;
							FuncBit=1;
							break;

						case 0x71:
							DeleteBit=1;
							FuncBit=1;
							break;

						case 0x6b:
							LArrowBit=1;
							FuncBit=1;
							break;

						case 0x6c:
							HomeBit=1;
							FuncBit=1;
							break;

						case 0x69:
							EndBit=1;
							FuncBit=1;
							break;

						case 0x75:
							UArrowBit=1;
							FuncBit=1;
							break;

						case 0x72:
							DArrowBit=1;
							FuncBit=1;
							break;

						case 0x7d:
							PageUpBit=1;
							FuncBit=1;
							break;

						case 0x7a:
							FuncBit=1;
							PageDownBit=1;
							break;

						case 0x74:
							RArrowBit=1;
							FuncBit=1;
							break;

//						case 0x4a:
//							NumSlashBit=1;
//							FuncBit=1;
//							break;

						default:
						{
							if (!shiftbit)
						 	{
			 					i=0;
						 		do
						 		{
			 						temp=unshifted[i][0];
						 			if (temp == value)
							 		{
										DebugValue=unshifted[i][1];
										KeyBdTrigger=1;
							 			break;
			 						}
									i++;
						 		}while(temp);
						 	}
						 	else
					 		{
						 		i=0;
			 					do
						 		{
									temp=shifted[i][0];
			 						if (temp == value)
							 		{
										DebugValue=shifted[i][1];
										KeyBdTrigger=1;
							 			break;
						 			}
									i++;
						 		}while(temp);
						 	}
					 		break;
						}
					}
				}
				break;
			}
		}
	}	
			
	else
	{
		is_up=0;
		switch (value)
		{
			case 0xFA:
				FABit=1;
//				FuncBit=1;
				break;
			
			case 0xAA:
				AABit=1;
//				FuncBit=1;
				break;
				
			case 0xEE:
				EEBit=1;
//				FuncBit=1;
				break;
				
			case 0xFE:
				ResendBit=1;
//				FuncBit=1;
				break;
			
			case 0xFF:
				FFBit=1;
//				FuncBit=1;
				break;
							
			case 0x12: 	//left SHIFT
				shiftbit=0;
//				FuncBit=1;
				break;
				
			case 0x59:	//right SHIFT
				shiftbit=0;
//				FuncBit=1;
				break;

			case 0x11:
				AltRightBit=0;
//				FuncBit=1;
				break;
            	
			case 0x14:
				CtlRightBit=0;
//				FuncBit=1;
				break;
							
			case 0x70:
				InsertBit=0;
//				FuncBit=1;
				break;

			case 0x71:
				DeleteBit=0;
//				FuncBit=1;
				break;

			case 0x6b:
				LArrowBit=0;
//				FuncBit=1;
				break;

			case 0x6c:
				HomeBit=0;
//				FuncBit=1;
				break;

			case 0x69:
				EndBit=0;
//				FuncBit=1;
				break;

			case 0x75:
				UArrowBit=0;
//				FuncBit=1;
				break;

			case 0x72:
				DArrowBit=0;
//				FuncBit=1;
				break;

			case 0x7d:
				PageUpBit=0;
//				FuncBit=1;
				break;

			case 0x7a:
				PageDownBit=0;
//				FuncBit=1;
				break;

			case 0x74:
				RArrowBit=0;
//				FuncBit=1;
				break;

//			case 0x4a:
//				NumSlashBit=0;
//				FuncBit=1;
//				break;

//			case 0x5a:
//				EnterBit=0;
//				FuncBit=1;
//				break;
	
			default:
				extendbit=0;
//				FuncBit=1;
				break;
		}
//	KeyBdTrigger=1;	
	}					
}

//
void put_kbbuff (unsigned char c)
{
	if (buff_cnt < BUFF_SIZE)
	{
		*inptr=c;		//put char into buffer
		inptr++;			// Increment pointer
		
		buff_cnt++;
		if (inptr >= KEYBDBUF + BUFF_SIZE)	// pointer wrapping
		inptr = KEYBDBUF;
//ON_OK_LED();
//		while(1);
	}
}

// Set Keyboard LED status
void SetKeyLED (unsigned char s)
{
	char i=0;
	
   KeyBdTrigger=FABit=AABit=EEBit=FEBit=0;
	if (SendKeyData (0xed))
	{
		KeyBd_Init();
		KeyBdTrigger=0;
		delayms(10);
//		while(!KeyBdTrigger);
		i=SendKeyData(s);
		KeyBdTrigger=0;	
	}
	else
	{
		Display_Screen(KeyBoard_Err1);
		delayms(1000);
		Clear_Screen();
	}	
}

// Send Echo to keyboard
char SendEEcho(void)
{
	if (SendKeyData (0xee))
	{
		KeyBdTrigger=0;
		EX1=1;
		while(!KeyBdTrigger);
		KeyBdTrigger=EX1=0;			
		if (EEBit) return 1;
		else return 0;
	}
	else
	{
		Display_Screen(KeyBoard_Err1);
		delayms(1000);
		Clear_Screen();
		return 0;
	}
}
//Send Data from HOST to Keyboard
/**************************************************/
char SendKeyData(unsigned char code_a)
{
        
    unsigned char i,j;
    
    Keyclkbit=0;
    ParityBit=1;
    KData=1;
    KClock=1;
    EX1=0;
    EA=1;
    
    ResendBit=0;
    if (KClock)
    {
    	KClock=0;		// Start protocal
    	delay50us();
    	delay50us();
    	KData=0;       // release DATA bus
    	delay20us();
    	KClock=1;		//release CLOCK
    	delay20us();
    	IE1=0;
    	EX1=0;
        Keyclkbit=0;
//      while(!Keyclkbit);
    	for (i=0; i<3; i++)
    	{
    		for (j=0; j<255;j++)
    		{
				if (!KClock) break;
				delay10us();    		
			}
			if (!KClock) break;
    	}
    	
    	if(!KClock)
    	{
//			EX0=0;			//disable external interrupt 0
//	    	Keyclkbit=0;
   	 	for (i=0; i<8; i++)
    		{
      	 	if (code_a & 0x01)
       		{
         		KData=1;
         		ParityBit=~ParityBit; 
       		}
       		else
       		{ 
       			KData=0;
         	}
       		code_a >>= 1;
       		while(!KClock);
       		delay10us();
       		while(KClock);
				_nop_();
				_nop_();
//				delay10us();
      	}
       
      	if (ParityBit)KData=1;
      	else KData=0;

     		while(!KClock);
     		delay10us();
     		while(KClock);
			_nop_();
    		KData=1;
    		while (!KClock);
     		delay10us();
     		while(KClock);
    		KData=1;
    	}
    	else ResendBit=1;
    }	
    else
    {
		 ResendBit=1;
    }
	 EX1=IE1=0;

	 if (ResendBit)return 0;
	 else return 1;
}



/******************************************************/
/* generate a pulse in clock line                     */
/*                 ------                             */
/*    xxxxxx______|      xxxxxx                       */
/******************************************************/
void Clkpulse(void)
{
        delay20us();            /* transmit it. */
        KClock=0;
        delay20us();            /* transmit it. */
        KClock=1;
}


// Get data from keyboard buffer query
unsigned char getkey (void)
{
	unsigned char bytecnt;
	KeyBd_Init();
	KeyBdTrigger=0;
	IE1=0;
	EX1=1;
	ET1=ET0=0;
	while(!KeyBdTrigger); // && !FuncBit);
	EX1=0;
	Set_Cursor(4,15);
//	bytecnt=KEYBDBUF[0];
	DisplayNum(DebugValue);
	while(StartPB);
	return DebugValue;
}

/*
void delay50us(void)
{
	int i;
	for (i=0; i<9; i++);
}

void delay20us(void)
{
	char i;
	for (i=0; i<3; i++);
}

void delay10us(void)
{
	char i;
	for (i=0; i<1; i++);
} */

void delay50us(void)
{
	delay20us();
	delay20us();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();

}

void delay20us(void)
{
	delay10us();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
/*	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
*/}

void delay10us(void)
{
	char i;
	for (i=0; i<2 ;i++);
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
 
}

⌨️ 快捷键说明

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