📄 i2c.lst
字号:
436 3 break;
437 3 default:
438 3 break;
439 3 }
440 2 WaitKeyOff();
441 2 GetRealClock();
442 2 LCD_DispChar(0,2,RealTime.RT.Hour/16); //128*64 取值x=0-128 y=0-8
443 2 LCD_DispChar(8,2,RealTime.RT.Hour%16);
444 2 LCD_DispChar(24,2,RealTime.RT.Minute/16);
445 2 LCD_DispChar(32,2,RealTime.RT.Minute%16);
446 2 LCD_DispChar(48,2,RealTime.RT.Second/16);
447 2 LCD_DispChar(56,2,RealTime.RT.Second%16);
448 2 //在0,4处显示02/01/01
449 2 LCD_DispChar(0,4,RealTime.RT.Year/16);
450 2 LCD_DispChar(8,4,RealTime.RT.Year%16);
451 2 LCD_DispChar(24,4,RealTime.RT.Month/16);
452 2 LCD_DispChar(32,4,RealTime.RT.Month%16);
453 2 LCD_DispChar(48,4,RealTime.RT.Day/16);
454 2 LCD_DispChar(56,4,RealTime.RT.Day%16);
455 2 Delay1ms(100);
456 2 }
457 1 }
458
459 //------------------------------------------------------------------------------------
460 // Interrupt Service Routine
461 //------------------------------------------------------------------------------------
462 void SMBUS_ISR (void) interrupt 7
463 {
464 1 switch (SMB0STA)
465 1 { // SMBus 状态码SMB0STA 寄存器
466 2 // 主发送器/接收器起始条件已发送
467 2 case SMB_START:
468 2 SMB0DAT = COMMAND ; // 装入要访问的从器件的地址
469 2 STA = 0; // 手动清除START 位
470 2 break;
471 2 //主发送器/接收器重复起始条件已发送
472 2 // 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后 ?
473 2 case SMB_RP_START:
474 2 SMB0DAT = COMMAND; // COMMAND 中应保持从地址 + R.
475 2 STA = 0;
476 2 break;
477 2 // 主发送器从地址 + WRITE 已发送收到ACK
478 2 case SMB_MTADDACK:
479 2 // 主发送器数据字节已发送收到ACK
480 2 case SMB_MTDBACK:
481 2 if (BYTE_NUMBER)
482 2 {
483 3 SMB0DAT = revolve(*I2CDataBuff); // If R/W=WRITE, load byte to write.
484 3 I2CDataBuff++;
485 3 BYTE_NUMBER--;
486 3 }
487 2 else
488 2 {
489 3 STO = 1; SM_BUSY = 0; // Free SMBus
C51 COMPILER V7.02b I2C 12/21/2002 22:32:37 PAGE 9
490 3 }
491 2 break;
492 2 // 主发送器从地址 + WRITE 已发送收到NACK
493 2 // 从器件不应答发送STOP + START 重试
494 2 case SMB_MTADDNACK:
495 2 STO = 1; STA = 1;
496 2 break;
497 2 // 主发送器数据字节已发送收到NACK
498 2 // 从器件不应答发送STOP + START 重试
499 2 case SMB_MTDBNACK:
500 2 STO = 1; STA = 1;
501 2 break;
502 2 // 主发送器竞争失败
503 2 // 不应出现如果出现重新开始传输过程
504 2 case SMB_MTARBLOST:
505 2 STO = 1; STA = 1;
506 2 break;
507 2
508 2 // 主接收器从地址 + READ 已发送,收到ACK
509 2 case SMB_MRADDACK:
510 2 AA = 1; // 在应答周期ACK
511 2 if (!BYTE_NUMBER)
512 2 {
513 3 STO = 1; SM_BUSY = 0; // 释放SMBus
514 3 }
515 2 break;
516 2 // 主接收器从地址 + READ 已发送收到NACK
517 2 // 从器件不应答发送重复起始条件重试
518 2 case SMB_MRADDNACK:
519 2 STA = 1;
520 2 break;
521 2 // 收到数据字节ACK 已发送
522 2 // 该状态不应出现因为AA 已在前一状态被清0 如果出现发送停止条件
523 2 case SMB_MRDBACK:
524 2 if (BYTE_NUMBER)
525 2 {
526 3 *I2CDataBuff=revolve(SMB0DAT);
527 3 I2CDataBuff++;
528 3 BYTE_NUMBER--;
529 3 }
530 2 if (!BYTE_NUMBER) AA= 0;
531 2 break;
532 2 // 收到数据字节NACK 已发送
533 2 // 读操作已完成读数据寄存器后发送停止条件
534 2 case SMB_MRDBNACK:
535 2 STO = 1;
536 2 SM_BUSY = 0; // 释放SMBus
537 2 break;
538 2 // 在本应用中所有其它状态码没有意义通信复位
539 2 default:
540 2 STO = 1; // 通信复位
541 2 SM_BUSY = 0;
542 2 break;
543 2 }
544 1 SI=0; // 清除中断标志
545 1 }
546 /*
547 {
548 switch (SMB0STA){ // Status code for the SMBus (SMB0STA register)
549 case SMB_START:
550 SMB0DAT = COMMAND; // COMMAND should hold slave address + R.
551 break;
C51 COMPILER V7.02b I2C 12/21/2002 22:32:37 PAGE 10
552 case SMB_MTADDNACK:
553 STO = 1;
554 STA = 1;
555 break;
556 case SMB_RP_START:
557 // SMB0DAT = COMMAND; // COMMAND should hold slave address + R.
558 // STA = 0;
559 // break;
560 case SMB_MTADDACK:
561 case SMB_MTDBACK:
562 if (BYTE_NUMBER)
563 {
564 if (COMMAND & 0x01) // If R/W=READ,
565 {
566 STA = 1;
567 }
568 else
569 {
570 SMB0DAT = *I2CDataBuff; // If R/W=WRITE, load byte to write.
571 I2CDataBuff++;
572 BYTE_NUMBER--;
573 }
574 }
575 else
576 {
577 STO = 1;
578 SM_BUSY = 0; // Free SMBus
579 }
580 break;
581
582 // Master Transmitter: Data byte transmitted. NACK received.
583 // Slave not responding. Send STOP followed by START to try again.
584 case SMB_MTDBNACK:
585 STO = 1;
586 STA = 1;
587 break;
588
589 // Master Transmitter: Arbitration lost.
590 // Should not occur. If so, restart transfer.
591 case SMB_MTARBLOST:
592 STO = 1;
593 STA = 1;
594 break;
595
596 // Master Receiver: Slave address + READ transmitted. NACK received.
597 // Slave not responding. Send repeated start to try again.
598 case SMB_MRADDNACK:
599 STA = 1;
600 break;
601
602 // Data byte received. ACK transmitted.
603 // State should not occur because AA is set to zero in previous state.
604 // Send STOP if state does occur.
605 case SMB_MRDBACK:
606 STO = 1;
607 SM_BUSY = 0;
608 break;
609
610 // Master Receiver: Slave address + READ transmitted. ACK received.
611 // Set to transmit NACK after next transfer since it will be the last (only) byte.
612 case SMB_MRADDACK:
613 // AA = 0; // NACK sent on acknowledge cycle.
C51 COMPILER V7.02b I2C 12/21/2002 22:32:37 PAGE 11
614 // break;
615
616 // Data byte received. NACK transmitted.
617 // Read operation has completed. Read data register and send STOP.
618 case SMB_MRDBNACK:
619 if (BYTE_NUMBER)
620 {
621 if (COMMAND & 0x01) // If R/W=READ,
622 {
623 *I2CDataBuff=SMB0DAT;
624 I2CDataBuff++;
625 }
626 BYTE_NUMBER--;
627 }
628 else
629 {
630 STO = 1;
631 SM_BUSY = 0; // Free SMBus
632 }
633 break;
634 // All other status codes meaningless in this application. Reset communication.
635 default:
636 STO = 1; // Reset communication.
637 SM_BUSY = 0;
638 break;
639 }
640
641 SI=0; // clear interrupt flag
642 }
643 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1639 ----
CONSTANT SIZE = 160 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 32 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -