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

📄 test02.c

📁 ps2 to ubs bridge sourc for 8051e code
💻 C
📖 第 1 页 / 共 5 页
字号:
	//
	PS2A_CTL = PS2A_CTL | 0x01; 		//set tx_on;
	PS2A_D = PS2_MS_GET_STATUS;
	//wait for tx_if
	while(!(PS2A_STA & 0x10));   
	
	if(PS2A_STA & 0x20) return 1;		//command fail, time-out
						//check tx_ack
	//if((PS2A_STA & 0x40)) return 2;
	PS2A_STA = 0x10; 			//clr tx_if	
		
						//
						//ACK stage
						//
	
	while(!(PS2A_STA & 0x01)); 		//wait rx_if	
	PS2A_STA = PS2A_STA & 0x01;		//clr rx_if
	if((PS2A_STA & 0x0E)) return 3; 	//command fail
	if(PS2A_D != 0xFA) return 4;		//rx data is not ACK
	
						//
						//Data Stage
						//
	
						//
						// Get 3 bytes, 1:status 2:resolution 3:sampling rate
						//
	while(!(PS2A_STA & 0x01)); 		//wait rx_if
	PS2A_STA = PS2A_STA & 0x01;		//clr rx_if
	if((PS2A_STA & 0x0E)) return 3;	 	//command fail
	MOUSE_STATUS[0] = PS2A_D;
	//
	while(!(PS2A_STA & 0x01)); 		//wait rx_if
	PS2A_STA = PS2A_STA & 0x01;		//clr rx_if
	if((PS2A_STA & 0x0E)) return 3; 	//command fail
	MOUSE_STATUS[1] = PS2A_D;
	//
	while(!(PS2A_STA & 0x01)); 		//wait rx_if
	PS2A_STA = PS2A_STA & 0x01;		//clr rx_if
	if((PS2A_STA & 0x0E)) return 3; 	//command fail
	MOUSE_STATUS[2] = PS2A_D;
	
		
	return 0; 				//command succeed
}

unsigned char KB_SET_ONE(unsigned char cmd, unsigned char one_byte)
{
					// send command byte 0xED
	PS2A_CTL = PS2A_CTL | 0x32;	
	PS2A_STA = 0xFF;
	//
	PS2A_CTL = PS2A_CTL | 0x01; 	//set tx_on;
	PS2A_D = cmd;
					//wait for tx_if
	while(!(PS2A_STA & 0x10));  
	
	if(PS2A_STA & 0x20) return 1;	//command fail, time-out
					//check tx_ack
	if((PS2A_STA & 0x40)) return 2;
	PS2A_STA = 0x10; 		//clr tx_if
		
					//
					//ACK stage
					//
	
	while(!(PS2A_STA & 0x01)); 	//wait rx_if
	PS2A_STA = PS2A_STA & 0x01;	//clr rx_if

					//	
					// send one indicator byte
					//
	
	PS2A_CTL = PS2A_CTL | 0x01; 	//set tx_on;
	PS2A_D = one_byte;
					//wait for tx_if
	while(!(PS2A_STA & 0x10));  
	
	if(PS2A_STA & 0x20) return 1;	//command fail, time-out
					//check tx_ack
	if((PS2A_STA & 0x40)) return 2;
	PS2A_STA = 0x10; 		//clr tx_if
		
					//
					//ACK stage
					//
	
	while(!(PS2A_STA & 0x01)); 	//wait rx_if
	PS2A_STA = PS2A_STA & 0x01;	//clr rx_if	
	
	
	if((PS2A_STA & 0x0E)) return 3; //command fail

	
	if(PS2A_D != 0xFA) return 4;	//rx data is not ACK
	else {return 0;} 		//command succeed	
}


//isr routine
void EXTINT_ISR (void) interrupt 0 
{
	return;	
}

//isr routine
void TMR_ISR (void) interrupt 1 
{	
	
	TIM_STA = TIM_STA | 0x08;
	
	// convert character in buffer into usage scan_code
	// mapping make/break scan_code
	
	kb_check=1;
	
	kb_idle_cnt++;
	ms_idle_cnt++;
	
 	return;	
}

unsigned char kb_scan(void)
{
	unsigned char key;
	unsigned char scan_code;
	
	kb_check = 0;
	mm_key0=0;
	mm_key1=0;
	key=0;
	
	scan_code = KB_BUF_DATA[rd_kb_ptr];
	if(scan_code==0xF0) { 			
		get_next_scan_code();
		// detect F0 break key
		switch (scan_code) { //detect flag keys
		  case 0x59: {
		  	right_shift_make=0;
		  	break;
		  }	
		  case 0x14: {
		  	left_ctrl_make=0;
		  	break;
		  }
		  case 0x11: {
		  	left_alt_make=0;
		  	break;
		  }
		  case 0x58: {
		  	caps_make=0;
		  	break;
		  }
		  case 0x12: {
		  	left_shift_make=0;
		  	break;
		  }
		  
		  case 0x77: {
		  	numlock_make=0;
		  	break;
		  }
		  case 0x7E: {
		  	scroll_make=0;
		  	break;
		  }
		  default: {
		  	break;
		  }	
		}//switch
		rd_kb_ptr++;  
		if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
		return 0;			
	}
	else if(scan_code==0xE0) {
		scan_code = get_next_scan_code();
		if(scan_code==0xF0) {
			scan_code = get_next_scan_code();
			if(scan_code==0x12) {
				scan_code = get_next_scan_code();
				if(scan_code==0xE0) {
				    scan_code = get_next_scan_code();
				    switch (scan_code) {//E0-F0-12-E0-
					case 0x70:{ 
						// shift + INSERT make	
						//shift_make = 1;
						key = 73;
						break;
					}
					case 0x71:{
						// shift + DEL make
						key = 76;
						break;
					}
					case 0x6B:{
						// shift + LEFT-ARROW make	
						key = 80;
						break;
					}
					case 0x6C:{
						// shift + HOME make	
						key = 74;
						break;
					}
					case 0x69:{
						// shift + END make
						key = 77;
						break;	
					}
					case 0x75:{
						// shift + UP make
						key = 82;
						break;
					}
					case 0x72:{
						// shift + DOWN make
						key = 81;
						break;
					}
					case 0x7D:{
						// shift + PAGE UP make
						key = 75;
						break;	
					}
					case 0x7A:{
						// shift + PAGE DOWN make
						key = 78;
						break;
					}
					case 0x74:{
						// shift + RIGHT-ARROW make
						key = 79;
						break;
					}
					case 0x4A:{
						// shift + (/) make
						key = 84;
						break;	
					}
					default:{
						//error
						// flush ptr
						rd_kb_ptr = rx_kb_ptr;
						return 0;
					}			
				     }//end of switch	
				     rd_kb_ptr++;  
				     if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
				     return key;
				} // E0
				else {  // error				
					// flush buffer
					rd_kb_ptr = rx_kb_ptr;
					return 0;
				}
			} // 12
			else if(scan_code==0x11){ //E0-F0-11
				// alt-r , break
				right_alt_make = 0; 		
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x14){ //E0-F0-14
				// CTRL_R , break
				right_ctrl_make = 0; 		
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x1F){ //E0-F0-1F
				// left-gui , break
				left_gui_make = 0; 		
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x27){ //E0-F0-27
				// right gui , break
				right_gui_make = 0; 		
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x38 | scan_code==0x30 | scan_code==0x28 | scan_code==0x20 | scan_code==0x10){ //E0-F0-xx
				//mm_key , break	
				
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x18 | scan_code==0x3A | scan_code==0x48 | scan_code==0x23 | scan_code==0x21){ //E0-F0-xx
				//mm_key , break	
				//mm_key=0;
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x32 | scan_code==0x34 | scan_code==0x3B | scan_code==0x15 | scan_code==0x4D){ //E0-F0-xx
				//mm_key , break	
				//mm_key=0;
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x50 | scan_code==0x40 | scan_code==0x2B){ //E0-F0-xx
				//mm_key , break	
				//mm_key=0;
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x5A){ //E0-F0-5A
				// (Enter) , break	
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x37){ //E0-F0-37
				// CTRL_R , break
				power_make = 0; 		
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x3F){ //E0-F0-3F
				// CTRL_R , break
				sleep_make = 0; 		
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x5E){ //E0-F0-5E
				// CTRL_R , break
				wakeup_make = 0; 		
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x7C & !left_shift_make & !right_shift_make & !left_ctrl_make & !right_ctrl_make){
				// Print break
				get_next_scan_code(); //0xE0
				get_next_scan_code(); //0xF0
				get_next_scan_code(); //0x12
				//			
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code==0x7C){
				// Print break
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			else if(scan_code>=0x69 & scan_code <=0x7D){
				
				if((left_shift_make == numlock_make) | (right_shift_make == numlock_make)){ 
					// INS, ...  break	
					//
					rd_kb_ptr++;  
					if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
					
					return 0;
				}
				else if(left_shift_make | right_shift_make) {
					//
					get_next_scan_code(); //0xE0
					get_next_scan_code(); //0x12
					//
					rd_kb_ptr++;  
					if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
					return 0;
				}
				else if(numlock_make){  //numlock_make
					//
					get_next_scan_code(); //0xE0
					get_next_scan_code(); //0xF0
					get_next_scan_code(); //0x12
					//
					rd_kb_ptr++;  
					if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
					return 0;					
				}
				else {
					// error
					rd_kb_ptr = rx_kb_ptr;
					return 0;	
					
				}
			}
			else if(scan_code==0x4A & (left_shift_make | right_shift_make)){ // shift+(/) break
				//E0-F0-4A
				get_next_scan_code(); //0xE0
				get_next_scan_code(); //0x12
				//
				rd_kb_ptr++;  
				if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
					
				return 0;	
			}
			//else if(scan_code==0x4A & right_shift_make){ // right_shift+(/) break
			//{
			//	//E0-F0-4A
			//	get_next_scan_code(); //0xE0
			//	get_next_scan_code(); //0x12
			//	//
			//	rd_kb_ptr++;  
			//	if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0; 
			//		
			//	return 0;	
			//}
			else {
				// error
				rd_kb_ptr=rx_kb_ptr;
				return 0;				
			}
		}//F0
		else if(scan_code==0x11){ // ALT-R make, E0-11
			right_alt_make = 1;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}
		else if(scan_code==0x14){ // CTRL-R make, E0-14
			right_ctrl_make = 1;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}
		else if(scan_code==0x1F){ // left gui make, E0-1F
			left_gui_make = 1;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}
		else if(scan_code==0x27){ // right gui make, E0-27
			right_gui_make = 1;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}
		else if(scan_code==0x2F){ // APP make, E0-2F
			//app_make = 1;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 101;
		}
		//=== Multi-Media Keyboard ===//
		else if(scan_code==0x38){ // WWW Back make, E0-38
			mm_key0=0x24;
			mm_key1= 0x2;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}
		else if(scan_code==0x30){ // WWW Forward make, E0-30
			mm_key0 = 0x25;
			mm_key1 = 0x2;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}
		else if(scan_code==0x28){ // WWW stop make, E0-28
			mm_key0=0x26;
			mm_key1=0x2;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}
		else if(scan_code==0x20){ // WWW Refresh make, E0-20
			mm_key0 = 0x27;
			mm_key1 = 0x2;
			rd_kb_ptr++;  
			if(rd_kb_ptr >= KB_BUF_MAX_LEN) rd_kb_ptr = 0;
			return 0;
		}

⌨️ 快捷键说明

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