📄 main.lst
字号:
218 1
219 1
220 1 while( TRUE )
221 1 {
222 2
223 2 if (bEPPflags.bits.timer)
224 2 {
225 3 DISABLE;//定时器溢出,检测按键状态
226 3 bEPPflags.bits.timer = 0;
227 3 ENABLE;
228 3
229 3 if(bEPPflags.bits.configuration)//设备未配置返回
230 3 check_key_LED(); //检测键盘
231 3 }
232 2 if(flag==1){
233 3 send(A,H,C,D,E,F);}
234 2 // D12_WriteEndpoint(3,1,'1'); }
235 2 if (bEPPflags.bits.bus_reset)
236 2 {//设备复位处理
237 3 DISABLE;
238 3 bEPPflags.bits.bus_reset = 0;
239 3 ENABLE;
240 3
241 3 } // if bus reset
C51 COMPILER V6.12 MAIN 06/23/2007 09:21:32 PAGE 5
242 2
243 2 if(bEPPflags.bits.ep1_rxdone) //端点1输出
244 2 { //控制LED/数码管/
245 3 /*
246 3 GenEpBuf[0] 操作对象
247 3 1 LED
248 3 2 数码管
249 3 3 锋鸣器
250 3 0x55 读IIC
251 3 */
252 3 DISABLE;
253 3 bEPPflags.bits.ep1_rxdone=0;
254 3 ENABLE;
255 3 if(GenEpBuf[0]==1){P1=GenEpBuf[1];} //LEDDATA=GenEpBuf[1];
256 3 if(GenEpBuf[0]==2)
257 3 {
258 4 if(GenEpBuf[1]==0)display(0);
259 4 if(GenEpBuf[1]==1)display(1);
260 4 if(GenEpBuf[1]==2)display(2);
261 4 if(GenEpBuf[1]==3)display(3);
262 4 if(GenEpBuf[1]==4)display(4);
263 4 if(GenEpBuf[1]==5)display(5);
264 4 if(GenEpBuf[1]==6)display(6);
265 4 if(GenEpBuf[1]==7)display(7);
266 4 if(GenEpBuf[1]==8)display(8);
267 4 if(GenEpBuf[1]==9)display(9);
268 4 if(GenEpBuf[1]==10)display(10);
269 4 if(GenEpBuf[1]==11)display(11);
270 4 if(GenEpBuf[1]==12)display(12);
271 4 if(GenEpBuf[1]==13)display(13);
272 4 if(GenEpBuf[1]==14)display(14);
273 4 if(GenEpBuf[1]==15)display(15);
274 4 }
275 3 if(GenEpBuf[0]==4)
276 3 {A=GenEpBuf[1];
277 4 H=GenEpBuf[2];
278 4 C=GenEpBuf[3];
279 4 D=GenEpBuf[4];
280 4 E=GenEpBuf[5];
281 4 F=GenEpBuf[6];
282 4 flag=1;
283 4
284 4 }
285 3 if(GenEpBuf[0]==3)beep=GenEpBuf[1]&0x01;
286 3 if(GenEpBuf[0]==0x55)
287 3 {
288 4 // Read24c02_nByte(GenEpBuf[1],10,EpBuf) ;
289 4 D12_WriteEndpoint(5, 10, EpBuf);
290 4 }
291 3 // if GenEpBuf[0]=0;
292 3 }
293 2
294 2
295 2 if (bEPPflags.bits.setup_packet)
296 2 {//Setup包处理
297 3 DISABLE;
298 3 bEPPflags.bits.setup_packet = 0;
299 3 ENABLE;
300 3 control_handler();//调用请求处理子程序
301 3 } // if setup_packet
302 2
303 2 if(bEPPflags.bits.main_rxdone) //端点2输出
C51 COMPILER V6.12 MAIN 06/23/2007 09:21:32 PAGE 6
304 2 {
305 3 DISABLE;
306 3 bEPPflags.bits.main_rxdone=0;
307 3 ENABLE;
308 3 EndpointII();//操作LCD和I2C
309 3 } //if main_rxdone
310 2 } // Main Loop
311 1 }
312
313 //返回stall应答
314 void stall_ep0(void)
315 {
316 1 D12_SetEndpointStatus(0, 1);
317 1 D12_SetEndpointStatus(1, 1);
318 1 }
319
320 //断开USB总线
321 void disconnect_USB(void)
322 {
323 1 // Initialize D12 configuration
324 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
325 1 }
326
327 //连接USB总线
328 void connect_USB(void)
329 {
330 1 // reset event flags
331 1 DISABLE;
332 1 bEPPflags.value = 0;//清除所有状态
333 1 ENABLE;
334 1
335 1 // V2.1 enable normal+sof interrupt
336 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
337 1
338 1 // Initialize D12 configuration
339 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
340 1 }
341
342 //重新连接到USB总线
343 void reconnect_USB(void)
344 {
345 1 unsigned long clk_cnt;
346 1 disconnect_USB();
347 1 clk_cnt = ClockTicks;
348 1 while(ClockTicks < clk_cnt + 20);
349 1 connect_USB();
350 1 }
351
352 //恢复到未配置状态
353 void init_unconfig(void)
354 {
355 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
356 1 }
357
358 //设置配置状态
359 void init_config(void)
360 {
361 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
362 1 }
363
364 //从端点号1发送数据
365 void single_transmit(unsigned char * buf, unsigned char len)
C51 COMPILER V6.12 MAIN 06/23/2007 09:21:32 PAGE 7
366 {
367 1 if( len <= EP0_PACKET_SIZE) {
368 2 D12_WriteEndpoint(1, len, buf);
369 2 }
370 1 }
371
372 //发送端点号1建立代码
373 void code_transmit(unsigned char code * pRomData, unsigned short len)
374 {
375 1 ControlData.wCount = 0;
376 1 if(ControlData.wLength > len)
377 1 ControlData.wLength = len;
378 1
379 1 ControlData.pData = pRomData;
380 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
381 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
382 2 ControlData.wCount += EP0_PACKET_SIZE;
383 2 DISABLE;
384 2 bEPPflags.bits.control_state = USB_TRANSMIT;
385 2 ENABLE;
386 2 }
387 1 else {
388 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
389 2 ControlData.wCount += ControlData.wLength;
390 2 DISABLE;
391 2 bEPPflags.bits.control_state = USB_IDLE;
392 2 ENABLE;
393 2 }
394 1 }
395
396 //LED和按键处理子程序
397 void check_key_LED(void)
398 {
399 1 static unsigned char c ;
400 1 D12_WriteEndpoint(3,1,&c); //输入键盘数据
401 1
402 1
403 1 }
404
405
406 void EndpointII()//2*16LCD/IIC
407 {
408 1
409 1 // if(EpBuf[0]==1) PrintUsb(EpBuf+2,EpBuf[1]); //LCD
410 1 // if(EpBuf[0]==2) Write24c02_nByte(EpBuf[2],EpBuf[1],EpBuf+3);//IIC
411 1 // EpBuf[0]=0;
412 1 }
413
414 //请求处理子程序 处理Setup包
415 void control_handler()
416 {
417 1 unsigned char type, req;
418 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
419 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
420 1 if (type == USB_STANDARD_REQUEST)
421 1 (*StandardDeviceRequest[req])();//调用标准请求
422 1 else if (type == USB_VENDOR_REQUEST)
423 1 (*VendorDeviceRequest[req])();//调用厂商请求
424 1 else
425 1 stall_ep0();
426 1 }
C51 COMPILER V6.12 MAIN 06/23/2007 09:21:32 PAGE 8
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 940 ----
CONSTANT SIZE = 112 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 14
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -