📄 mainloop.lst
字号:
C51 COMPILER V6.12 MAINLOOP 10/08/2003 08:56:04 PAGE 5
242 1 else {
243 1 bEPPflags.value = 0;
244 1 reconnect_USB();//重新连接USB
245 1 }
246 1 */
247 1 /* Main program loop */
248 1
249 1 while( TRUE ){
250 2
251 2 showarray();
252 2 rownum++;
253 2 rownum=rownum%16;
254 2
255 2
256 2 if (bEPPflags.bits.timer){
257 3 DISABLE;//定时器溢出,检测按键状态
258 3 bEPPflags.bits.timer = 0;
259 3 ENABLE;
260 3 if(bEPPflags.bits.configuration)//设备未配置返回
261 3 check_key_LED();
262 3 }
263 2
264 2 if (bEPPflags.bits.bus_reset) {//设备复位处理
265 3 DISABLE;
266 3 bEPPflags.bits.bus_reset = 0;
267 3 ENABLE;
268 3 // Release D12's SUSPEND pin after bus reset
269 3 // Enable 74HCT123 pulse generation before disconnect
270 3 D12SUSPD = 1;
271 3 } // if bus reset
272 2
273 2 if (bEPPflags.bits.suspend) {//挂起改变处理
274 3 DISABLE;
275 3 bEPPflags.bits.suspend= 0;
276 3 ENABLE;
277 3
278 3 /* if(D12SUSPD == 1) {//挂起处理
279 3 D12SUSPD = 0;
280 3 P0 = 0xFF;
281 3 P1 = 0xFF;
282 3 P2 = 0xFF;
283 3 P3 = 0xFF;
284 3 D12_SetDMA(0xC3);
285 3 D12SUSPD = 1;
286 3 PCON |= 0x02;
287 3 // while (1);
288 3 }
289 3 */
290 3 } // if suspend change
291 2
292 2 if (bEPPflags.bits.setup_packet){//Setup包处理
293 3 DISABLE;
294 3 bEPPflags.bits.setup_packet = 0;
295 3 ENABLE;
296 3 control_handler();//调用请求处理子程序
297 3 D12SUSPD = 1;
298 3 } // if setup_packet
299 2
300 2 if(bEPPflags.bits.setup_dma != 0) {//DMA状态改变处理
301 3 DISABLE;
302 3 bEPPflags.bits.setup_dma --;
303 3 ENABLE;
C51 COMPILER V6.12 MAINLOOP 10/08/2003 08:56:04 PAGE 6
304 3 setup_dma();
305 3 } // if setup_dma
306 2
307 2 } // Main Loop
308 1 }
*** WARNING C280 IN LINE 214 OF .\MAINLOOP.C: 'key': unreferenced local variable
*** WARNING C280 IN LINE 214 OF .\MAINLOOP.C: 'i': unreferenced local variable
309
310 //返回stall应答
311 void stall_ep0(void)
312 {
313 1 D12_SetEndpointStatus(0, 1);
314 1 D12_SetEndpointStatus(1, 1);
315 1 }
316
317 //断开USB总线
318 void disconnect_USB(void)
319 {
320 1 // Initialize D12 configuration
321 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
322 1 }
323
324 //连接USB总线
325 void connect_USB(void)
326 {
327 1 // reset event flags
328 1 DISABLE;
329 1 bEPPflags.value = 0;//清除所有状态
330 1 ENABLE;
331 1
332 1 // V2.1 enable normal+sof interrupt
333 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
334 1
335 1 // Initialize D12 configuration
336 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
337 1 }
338
339 //重新连接到USB总线
340 void reconnect_USB(void)
341 {
342 1 unsigned long clk_cnt;
343 1
344 1
345 1 // Pull-down D12's SUSPEND pin
346 1 // Disable 74HCT123 pulse generation before disconnect
347 1 // Release D12's SUSPEND pin after receiving bus reset from host
348 1 D12SUSPD = 0;
349 1 disconnect_USB();
350 1
351 1 printf("Wait for 1 second ...\n");
352 1
353 1 clk_cnt = ClockTicks;
354 1 while(ClockTicks < clk_cnt + 20)
355 1 ;
356 1
357 1 connect_USB();
358 1
359 1 }
360
361 //恢复到未配置状态
362 void init_unconfig(void)
363 {
C51 COMPILER V6.12 MAINLOOP 10/08/2003 08:56:04 PAGE 7
364 1 // unsigned char i;
365 1
366 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
367 1 }
368
369 //设置配置状态
370 void init_config(void)
371 {
372 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
373 1 }
374
375 //从端点号1发送数据
376 void single_transmit(unsigned char * buf, unsigned char len)
377 {
378 1 if( len <= EP0_PACKET_SIZE) {
379 2 D12_WriteEndpoint(1, len, buf);
380 2 }
381 1 }
382
383 //发送端点号1建立代码
384 void code_transmit(unsigned char code * pRomData, unsigned short len)
385 {
386 1 ControlData.wCount = 0;
387 1 if(ControlData.wLength > len)
388 1 ControlData.wLength = len;
389 1
390 1 ControlData.pData = pRomData;
391 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
392 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
393 2 ControlData.wCount += EP0_PACKET_SIZE;
394 2 DISABLE;
395 2 bEPPflags.bits.control_state = USB_TRANSMIT;
396 2 ENABLE;
397 2 }
398 1 else {
399 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
400 2 ControlData.wCount += ControlData.wLength;
401 2 DISABLE;
402 2 bEPPflags.bits.control_state = USB_IDLE;
403 2 ENABLE;
404 2 }
405 1 }
406
407 //LED和按键处理子程序
408 void check_key_LED(void)
409 {
410 1 /* static unsigned char c, last_key = 0xf;
411 1
412 1 c = MCU_SWM0 & MCU_SWM1;
413 1 c &= 0x0f;
414 1 if (c != last_key) {
415 1 D12_WriteEndpoint(3, 1, &c);//发送按键状态
416 1 }
417 1
418 1 last_key = c;
419 1
420 1 if(bEPPflags.bits.ep1_rxdone) {
421 1 DISABLE;
422 1 bEPPflags.bits.ep1_rxdone = 0;
423 1 ENABLE;
424 1 MCU_LED0 = !(GenEpBuf[3] & 0x1);//改变LED状态
425 1 MCU_LED1 = !(GenEpBuf[3] & 0x2);
C51 COMPILER V6.12 MAINLOOP 10/08/2003 08:56:04 PAGE 8
426 1 }
427 1 */
428 1 }
429
430 //DMA建立子程序
431 void setup_dma()
432 {
433 1 ioSize = ioRequest.uSize;
434 1 ioCount = 0;
435 1
436 1 DISABLE;
437 1 bEPPflags.bits.dma_state = DMA_RUNNING;
438 1 ENABLE;
439 1
440 1 single_transmit(0, 0);
441 1
442 1 if(ioRequest.bCommand & 0x1) {
443 2 if(ioSize > 64 || ioSize == 0) {
444 3 //传输大于64字节数据
445 3 D12_WriteEndpoint(5, 64, EpBuf);
446 3 ioCount += 64;
447 3 }
448 2 else {
449 3 //传输64字节数据
450 3 D12_WriteEndpoint(5, ioSize, EpBuf);
451 3 ioCount += ioSize;
452 3 }
453 2 }
454 1 }
455
456 //请求处理子程序
457 void control_handler()
458 {
459 1 unsigned char type, req;
460 1
461 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
462 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
463 1
464 1 help_devreq(type, req); //显示设备请求
465 1
466 1 if (type == USB_STANDARD_REQUEST)
467 1 (*StandardDeviceRequest[req])();//调用标准请求
468 1 else if (type == USB_VENDOR_REQUEST)
469 1 (*VendorDeviceRequest[req])();//调用厂商请求
470 1 else
471 1 stall_ep0();
472 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 822 ----
CONSTANT SIZE = 494 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 24 18
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -