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

📄 usbkeyboard.c

📁 基于51的usb键盘程序源码设计
💻 C
📖 第 1 页 / 共 3 页
字号:
					case 2:  //到端点
						{
							if(Control_Data.DeviceRequest.bRequest==0)get_status(2);  
						}

					default: break;
				}
				break;
			
			case 0x20:  //类请求
				Prints("USB类请求................................",1);
				switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
				{
					case 0:  //到设备
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default:break;
						}
						break;
					
					case 1:  //到接口
						switch (Control_Data.DeviceRequest.bRequest)
						{
							case   GET_REPORT: get_report();   break; //获取报告
							case     GET_IDLE: get_idle();     break; //获取空闲状态
							case GET_PROTOCOL: get_protocol(); break; //获取协议
							default: break;
						}
						break;
					
					case 2:  //到端点
					{
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;
						}  
					}
					default: break;
				}
				break;
			
			case 0x40:  //用户请求
				Prints("USB用户请求................................",1);
				switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
				{
					case 0:  //到设备
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;
						}
						break;
					
					case 1:   //到接口
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;
						}
						break;
					
					case 2:  //到端点
						{
							switch (Control_Data.DeviceRequest.bRequest)
							{
								default: break;
							}  
						}
					default: break;
				}
		}
		return;
	}
	
	//如果是输出请求包
	if(usb_flags.flags.setup_packet_out) 
	{
		switch(Control_Data.DeviceRequest.bmRequestType&0x60)
		{
			case 0x00:  //标准请求
				Prints("USB标准请求................................",1);
				switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
				{
					case 0:   //到设备
						switch (Control_Data.DeviceRequest.bRequest)
						{
							case     CLEAR_FEATURE: clear_feature(0);break;
							case       SET_FEATURE: set_feature(0);break;
							case       SET_ADDRESS: set_usb_address();break;          //set_address	           
							case    SET_DESCRIPTOR: set_descriptor();break;           //set_descriptor
							case SET_CONFIGURATION: set_configuration(); break;       //set_configurat               	          
							default: break;
						}
						break;
					
					case 1:   //到接口
						switch (Control_Data.DeviceRequest.bRequest)
						{
							case CLEAR_FEATURE:  clear_feature(1);break;
							case   SET_FEATURE:  set_feature(1); break;
							case SET_INTERFACE: set_interface();break;
							default: break;
						}
						break;
					
					case 2:   //到端点
						switch (Control_Data.DeviceRequest.bRequest)
						{
							case CLEAR_FEATURE: clear_feature(2);break;
							case   SET_FEATURE: set_feature(2);break;
							default: break;      
						}
						break;
					
					default: break;
				}
				break;
			
			case 0x20:  //类请求
				Prints("USB类请求................................",1);
				switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
				{
					case 0:    //接收者为设备
						switch (Control_Data.DeviceRequest.bRequest)
						{             	          
							default: break;
						}
						break;
					
					case 1:   //接收者为接口
						switch (Control_Data.DeviceRequest.bRequest)
						{
							case   SET_REPORT: set_report();   break; //设置报告
							case     SET_IDLE: set_idle();     break; //设置空闲
							case SET_PROTOCOL: set_protocol(); break; //设置协议
							default: break;
						}
						break;
					
					case 2:   //接收者为端点
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;      
						}
						break;
					
					case 3: //其它接收者
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;      
						}
						break;
					
					default: break;
				}      
				break;
			
			case 0x40:  //用户请求
				Prints("USB用户请求................................",1);
				switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
				{
					case 0:    //接收者为设备
						switch (Control_Data.DeviceRequest.bRequest)
						{             	          
							default: break;
						}
						break;
					
					case 1:   //接收者为接口
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;
						}
						break;
					
					case 2:   //接收者为端点
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;      
						}
						break;
					
					case 3: //其它接收者
						switch (Control_Data.DeviceRequest.bRequest)
						{
							default: break;      
						}		   
						break;
					
					default: break;
				}
		}
	}
}
/******************************************************************************/

/**********************端点1输出***********************************************/
/*void endp1_out(void)
{
 Prints("端点1输出................................",1);
}*/
/******************************************************************************/

/*************************端点1输入*****************************************/
/*void endp1_in(void)
{
 Prints("端点1输入................................",1);
}*/
/******************************************************************************/

/***************************端点2输出****************************************/
void endp2_out(void)
{
	uint8 i,j;
	
	j=read_endpoint_buff(4,64,buffer);
	P2=~buffer[0];
	Prints("端点2输出................................",1);
	Prints("    端点2的数据是  ",0);
	for(i=0;i<j;i++)
	{
		PrintHex(buffer[i]);
		if(i==16)Prints("",1);
	}
	Prints("",1);
}
/******************************************************************************/


//用来返回数据的缓冲
uint8 idata InBuffer[64];

/***************************统计x中有多少个bit为1*******************************/
uint8 Count1Bits(uint16 x)
{
	uint8 i;
	
	i=0;
	while(x)
	{
		if(x&0x8000)i++;
		x<<=1;
	}
	return i;
}
/******************************************************************************/

/****************************主端点输入处理************************************/
void endp2_in(void)                                      
{
	uint8 i;
	// Prints("端点2输入................................",1);
	KeyMapCanChange=0;  //禁止修改按键值 
	if(KeyMapOk) //如果有按键按下
	{
		//4*4的键盘,最多能够识别3个键同时按下,
		//如果开关上接二极管可以同时识别更多的键
		if(Count1Bits(KeyMapOk)>3) 
		{
			for(i=2;i<8;i++)InBuffer[i]=0x01;  //按键过多
		}
		else
		{
			if(KeyMapOk&(1<<3)) //左Ctrl键
			{
				InBuffer[0]|=1;
			}
			else
			{
				InBuffer[0]&=~1;
			}
			
			if(KeyMapOk&(1<<7)) //左shift键
			{
				InBuffer[0]|=1<<1;
			}
			else
			{
				InBuffer[0]&=~(1<<1);
			}
			
			if(KeyMapOk&(1<<2)) //左ALT键
			{
				InBuffer[0]|=1<<2;
			}
			else
			{
				InBuffer[0]&=~(1<<2);
			}

			i=2;

			if(KeyMapOk&(1))
			{
				InBuffer[i++]=0x28;	    //回车键
			}

			if(KeyMapOk&(1<<1))
			{
				InBuffer[i++]=0x62;	    //0键
			}

			if(KeyMapOk&(1<<4))
			{
				InBuffer[i++]=0x5B;	    //3键
			}

			if(KeyMapOk&(1<<5))
			{
				InBuffer[i++]=0x5A;	    //2键
			}

			if(KeyMapOk&(1<<6))
			{
				InBuffer[i++]=0x59;	    //1键
			}

			if(KeyMapOk&(1<<8))
			{
				InBuffer[i++]=0x5E;	    //6键
			}

			if(KeyMapOk&(1<<9))
			{
				InBuffer[i++]=0x5D;	    //5键
			}

			if(KeyMapOk&(1<<10))
			{
				InBuffer[i++]=0x5C;	    //4键
			}

			if(KeyMapOk&(1<<11))
			{
				InBuffer[i++]=0x39;	    //Caps Lock键
			}

			if(KeyMapOk&(1<<12))
			{
				InBuffer[i++]=0x61;	    //9键
			}

			if(KeyMapOk&(1<<13))
			{
				InBuffer[i++]=0x60;	    //8键
			}

			if(KeyMapOk&(1<<14))
			{
				InBuffer[i++]=0x5F;	    //2键
			}

			if(KeyMapOk&(1<<15))
			{
				InBuffer[i++]=0x53;	    //Num Lock键
			}

			for(;i<8;i++)
			{
				InBuffer[i]=0;  //多余的清0
			}
		}
	}
	else //如果无按键按下,则返回0
	{
		for(i=0;i<8;i++)
		{
			InBuffer[i]=0;
		}
	}
	KeyMapCanChange=1; //允许修改按键值
	//返回8个字节数据
	write_endpoint_buff(5,8,InBuffer);
}
/******************************************************************************/


/***************************主函数**********************************************/
void main(void)
{
	InitUART();  //串口初始化
	Printc(0x0c);  //清屏
	Printc(0x0c);
	Prints("系统启动................................",1);
	delay(1000);	 //延迟
	disconnect_usb(); 	   //断开USB连接
	init_usb();		   //初始化USB芯片
	connect_usb();		   //连接USB
	InitTimer0();  //定时器0初始化,用来做键盘扫描,定时时间大约为5ms
	KeyMapCanChange=1;
	while(1)
	{ 
		if(!USB_INT)		//中断产生
		{
			read_interrupt_register();
			if(Interrupt_Register.Interrupt.bus_reset){usb_bus_reset();continue;}
			if(Interrupt_Register.Interrupt.suspend_change){usb_bus_suspend();continue;}
			if(Interrupt_Register.Interrupt.control_out_port){endp0_out();continue;}
			if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;}
			//	 if(Interrupt_Register.Interrupt.port_out_1)endp1_out();
			//	 if(Interrupt_Register.Interrupt.port_in_1)endp1_in();
			if(Interrupt_Register.Interrupt.main_out_port){endp2_out();}
			if(Interrupt_Register.Interrupt.main_in_port){endp2_in();}
		}
	}
}
/******************************************************************************/

⌨️ 快捷键说明

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