📄 usbmidi.c
字号:
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;
}
/******************************************************************************/
uint8 c;
/****************************主端点输入处理************************************/
void endp2_in(void)
{
uint8 i;
Prints("端点2输入................................",1);
for(i=0;i<4;i++)
{
InBuffer[i]=0;
}
KeyMapCanChange=0; //禁止修改按键值
if(KeyMapOk) //如果有按键按下
{
//4*4的键盘,最多能够识别3个键同时按下,
//如果开关上接二极管可以同时识别更多的键
if(Count1Bits(KeyMapOk)>3)
{
for(i=0;i<4;i++)InBuffer[i]=0x00; //按键过多
}
else
{
if(KeyMapOk&(1))
{
InBuffer[0]|=0x02; //右键
}
else
{
}
if(KeyMapOk&(1<<1)) //中键
{
InBuffer[0]|=0x04;
}
else
{
}
if(KeyMapOk&(1<<2)) //左键
{
InBuffer[0]|=0x01;
}
else
{
}
if(KeyMapOk&(1<<3)) //未用
{
}
else
{
}
if(KeyMapOk&(1<<4)) //向下滚
{
InBuffer[3]=-1;
}
else
{
}
if(KeyMapOk&(1<<5)) //向下移(Y轴增加)
{
InBuffer[2]=1;
}
else
{
}
if(KeyMapOk&(1<<6)) //未用
{
}
else
{
}
if(KeyMapOk&(1<<7)) //未用
{
}
else
{
}
if(KeyMapOk&(1<<8)) //往右移(X轴增加)
{
InBuffer[1]=1;
}
else
{
}
if(KeyMapOk&(1<<9)) //未用
{
}
else
{
}
if(KeyMapOk&(1<<10)) //往左移(X减小)
{
InBuffer[1]=-1;
}
else
{
}
if(KeyMapOk&(1<<11)) //未用
{
}
else
{
}
if(KeyMapOk&(1<<12)) //往上滚
{
InBuffer[3]=1;
}
else
{
}
if(KeyMapOk&(1<<13)) //往上移(Y减小)
{
InBuffer[2]=-1;
}
else
{
}
if(KeyMapOk&(1<<14)) //未用
{
}
else
{
}
if(KeyMapOk&(1<<15)) //未用
{
}
else
{
}
}
}
else //如果无按键按下,则返回0
{
}
KeyMapCanChange=1; //允许修改按键值
//Note on
InBuffer[0]=0x09;
InBuffer[1]=0x90|c;
InBuffer[2]=0x00;
InBuffer[3]=0x64;
while(!UartRflag);
UartRflag=0;
switch(UartData)
{
case '0': InBuffer[2]=55;break; //5
case '.': InBuffer[2]=57;break; //6
case 13: InBuffer[2]=59;break; //7 7和1之间一个半音
case '1': InBuffer[2]=60;break; //1 中央C C大调的1
case '2': InBuffer[2]=62;break; //2
case '3': InBuffer[2]=64;break; //3
case '4': InBuffer[2]=65;break; //4 3和4之间一个半音
case '5': InBuffer[2]=67;break; //5
case '6': InBuffer[2]=69;break; //6
case '7': InBuffer[2]=71;break; //7
case '8': InBuffer[2]=72;break; //1
case '9': InBuffer[2]=74;break; //2
case '+': InBuffer[2]=76;break; //3
case 'A': c++;c&=0x0f;break;
case 'B': c--;c&=0x0f;break;
case 'Z': InBuffer[0]=0x0C;InBuffer[1]=0xC0;InBuffer[2]=c;InBuffer[3]=0;break;
default: InBuffer[2]=100;break;
}
//返回4个字节数据
write_endpoint_buff(5,4,InBuffer);
InBuffer[0]=0x09;
InBuffer[1]=0x90|c;
// InBuffer[2]=0x00;
InBuffer[3]=0x64;
delay(100);
InBuffer[3]=0x00;
write_endpoint_buff(5,4,InBuffer);
}
/******************************************************************************/
/***************************主函数**********************************************/
void main(void)
{
InitUART(); //串口初始化
/*
T2CON=0x10;
TR2=1;
RCAP2H=0xFF;
RCAP2L=0xEA;
while(1);
*/
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 + -