?? usbkeyboard.c
字號:
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(1);break;
case 6: get_descriptor_interface();break;
case 10: get_interface();break;
default: break;
}
break;
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 + -