主程序:
main() { mInitSTDIO( );//设置波特率为9600 delayms(250); if(modify_baudrate(0x03,0xcc)!=1)err(); if(set_usb_mode( 6 )!=1)err(); #ifdef TEST_LOW_SPEED set_freq(0x01); //work in 1.5M /* 设置系统工作频率 */ delayms(5); TR1 = 0; TH1 = 0xf8; /* 22.1184MHz晶振, 115200bps 修改波特率为14400*/ TR1 = 1; #endif while(1) { while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待设备端连接上来 */ delayms(5); reset_device(); delayms(5); get_descr(0x01); set_addr(5); get_descr(0x02); parse_config_descr(); set_config(config_value); if(set_idle()!=1) err(); Request.Req.bmRequestType=0x81; Request.Req.bRequest=0x06; Request.Req.wValue=0x0022; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0000|((unsigned int)(report_descr_len+0x40)<<8); if(get_report_descr_ex()==1) {} else err(); if(set_report()!=1) err(); delayms(250); EA=1; //打开中断,从中断端点接收数据 get_int_in(); //发送从中断端点读数据的令牌 do{ if(flag_output==1) { P1_2^=0x01; flag_output=0; } }while(1); while ( wait_interrupt()!=USB_INT_DISCONNECT ); /* 等待设备端连接上来 */ } }
中断程序:
void intt0() interrupt 2 { unsigned char len_temp,i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ status=CH375_RD_DAT_PORT(); if(status!=USB_INT_SUCCESS) //&&((status&0xf0)==0x20)) { CH375_WR_CMD_PORT( CMD_CLR_STALL ); CH375_WR_DAT_PORT(1); endp6_mode=0x80; endp7_mode=0x80; toggle_recv(); issue_token(( endp_int << 4 ) | DEF_USB_PID_IN);//发送从中断端点读数据的令牌 } else { len_temp=rd_usb_data(data_buf); for(i=0;i!=len_temp;i++) { data_in[i]=data_buf[i]; } flag_output=1; toggle_recv(); issue_token(( endp_int << 4 ) | DEF_USB_PID_IN);//发送从中断端点读数据的令牌 } }
hcn,我想问你,你给我的这个控制鼠标的程序是怎么实现对鼠标热插拨的,我怎么也看不明白.
我说一下我的理解: 在主程序的 do{ }while(1) 这个循环的是: 鼠标有动作,就闪一次灯. 还有就是中断程序: 鼠标拨出后,我想中断程序应该会接收到这个 USB_INT_DISCONNECT 状态码,表明鼠标已被拨出.
我认为鼠标拨出了之后,应该要跳出主程序中那个 do{ }while(1) 循环,再次等待鼠标插上,但是这个循环中没有跳出循环的条件语句,我不明白了!
还有主程序的最后一句,即那个等待循环的作用是什么?
hcn,希望你能给我解释一下!