⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wpcf8574.lst

📁 基于8051F020,目的:用PCF8574器件实现并口输入
💻 LST
字号:
C51 COMPILER V7.05   WPCF8574                                                              02/14/2006 11:53:43 PAGE 1   


C51 COMPILER V7.05, COMPILATION OF MODULE WPCF8574
OBJECT MODULE PLACED IN WPCF8574.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe WPCF8574.C DB OE

stmt level    source

   1          //参考程序A:  WPCF8574.C
   2          //程序功能:PCF8574是带SUMBUS总线的串口转并口的数据转换芯片.8位输入口连结8个//开关(K1-K8)作输入,二个8位输出
             -锁存口分别连结8个LED灯,作二个8位输出..
   3          // 程序安排二个8位输出口锁存的数据电平相反.
   4          #include <c8051f020.h>                    // SFR declarations
   5          #include <intrins.h>
   6          #define  WRITE       0x00                 // 写位标志
   7          #define  READ        0x01                 // 读位标致
   8          #define  CHIP_B      0x70
   9          #define  SMB_START      0x08  // (MT & MR)主收发器发送起始位成功.再将从机写地
  10          //址送SMBUS
  11          #define  SMB_RP_START   0x10  // (MT & MR)主收发器重复发送起始位成功,再将从机
  12          //读地址送SMB0DAT
  13          #define  SMB_MTADDACK   0x18  // (MT) 主收发器发送从地址+W成功;收到 //ACK(从机应答)     
  14          #define  SMB_MTDBACK    0x28  // (MT)主收发器发送数据字节成功;收到ACK(从机//应答) 
  15          #define  SMB_MRADDACK   0x40  // (MR) 主收发器发送从地址+R成功;收到 //ACK(从机应答)
  16          #define  SMB_MRDBNACK   0x58  // (MR) 主收发器接收数据成功;主机发送NACK 
  17          char COMMAND;                    // 保存从地址用与中断程序
  18          char WORD;                       // 保存接收到的数据并把他发送出去.
  19          unsigned char xdata SENDMODE;                                        
  20          bit SM_BUSY;                      // 在收/发数据时该位置1,中断完成后被清另.
  21          void SYSCLK_Init (void);
  22          char SLA_READ(char chip_select);
  23          void SLA_SEND(char chip_select, char wr_data);
  24          void sleep_ms(unsigned int count)
  25          {
  26   1        unsigned char ii,jj;
  27   1        for(ii=0;ii<count;ii++)
  28   1          {
  29   2            for(jj=0;jj<250;jj++)
  30   2                _nop_();                      
  31   2          }   
  32   1      }
  33          void MAIN (void)
  34          {
  35   1         unsigned char i,temp;
  36   1         WDTCN = 0xde;                          // 禁止看们狗
  37   1         WDTCN = 0xad;
  38   1         SYSCLK_Init();                         // 开外部晶振
  39   1         XBR0 = 0x01;                           // 设置交叉开关,配置IO口
  40   1         XBR2 = 0x40;                           // 使能交叉开关和弱上拉.
  41   1         SMB0CN = 0x44;                         // 使能SMBus带低电平响应 (AA = 1)
  42   1         SMB0CR = 0xc9;           // 设置SMBus 速率= 100 kHz,系统时钟为11.0582MHZ
  43   1         EIE1 |= 2;                             // SMBus 中断使能
  44   1         EA = 1;                                // 全局中断使能
  45   1         SM_BUSY = 0;                           // 释放总线,用于第一次数据传送
  46   1         SI = 0;
  47   1         while(1){
  48   2         for(i=0;i<40;i++){                 //延时
  49   3                      sleep_ms(200);
  50   3         }
  51   2              temp = SLA_READ(0x70);           //芯片U1读取开关状态
  52   2              sleep_ms(200);
  53   2              SLA_SEND(0x72,temp);             //芯片U2输出开关状态
  54   2              sleep_ms(200);
C51 COMPILER V7.05   WPCF8574                                                              02/14/2006 11:53:43 PAGE 2   

  55   2              sleep_ms(200);
  56   2              SLA_SEND(0x74,~temp);           //芯片U3输出开关状态的反码
  57   2              sleep_ms(200);
  58   2              sleep_ms(200);
  59   2              sleep_ms(200);
  60   2              sleep_ms(200);
  61   2         }
  62   1         
  63   1      }
  64          void SYSCLK_Init (void)         //时钟初始化
  65          {
  66   1         int i;                                 // 延时计数器 i
  67   1         OSCXCN = 0x67;                         // 起动外部时钟(11.0592MHZ)
  68   1         for (i=0; i < 256; i++) ;              // 时间间隔 (>1ms)
  69   1         while (!(OSCXCN & 0x80)) ;             // 等待时钟丢失允许位(MSCLKE)位置1
  70   1         OSCICN = 0x88;                         // 选择外部晶振作系统时钟
  71   1                                                // 允许时钟丢失检测
  72   1      }
  73          //数据输出到从器件的函数:
  74          // chip_select = 器件从地址
  75          void SLA_SEND(char chip_select, char wr_data)
  76          {
  77   1         SENDMODE=0x01;
  78   1         while(SM_BUSY);                        // 当总线忙碌的时后就等待
  79   1         SM_BUSY = 1;                           // SMBus忙碌标志位置1 .
  80   1         SMB0CN = 0x44;                         // SMBus 使能, 响应信号为低电平
  81   1         COMMAND = (chip_select | WRITE);       // COMMAND = 7位地址加"写"位
  82   1         WORD = wr_data;                        // 输出数据在WORD中
  83   1         STO = 0;
  84   1         STA = 1;                               // 起动数据传输
  85   1              while(SM_BUSY);                       // 等待中断结束
  86   1      }
  87          //读取从器件输出数据的函数:
  88          char SLA_READ(char chip_select){
  89   1         SENDMODE=0;
  90   1         while(SM_BUSY);                        // 总线忙碌时要等待
  91   1         SM_BUSY = 1;                           // 总线忙碌标志位置1.
  92   1         SMB0CN = 0x44;                         // SMBus 使能, 响应信号为低电平
  93   1         COMMAND = (chip_select | READ);        // COMMAND = 7位地址加"读"位
  94   1         STO = 0;
  95   1         STA = 1;                               // 开始传送
  96   1         while(SM_BUSY);                        // 等待传送完成
  97   1         return WORD;                           // 返回接收到的数据
  98   1      }
  99          //  SMBus中断服务程序
 100          void SMBUS_ISR (void) interrupt 7
 101          { 
 102   1         switch (SMB0STA){                    // SMBus中断状态 SMB0STA register)
 103   2      //SMB_START     ;                  (SMB0STA  =08H)                                  
 104   2      //主发送器/接收器发送起始位成功.再将从机写地址送SMB0DAT并清除START位.
 105   2            case SMB_START:   //0x08
 106   2               SMB0DAT = COMMAND ;                    
 107   2               STA = 0;                       // 人工清除STA
 108   2               SI = 0;                        // 人工清除SI
 109   2               break;
 110   2      //SMB_RP_START                    ;(SMB0STA  =10H)
 111   2      //主发送器/接收器发送重复起始位成功.再将从机读地址送SMB0DAT并清除START位.
 112   2            case SMB_RP_START:        //0x10
 113   2               SMB0DAT = COMMAND;
 114   2               STA = 0;                       // 人工清除STA
 115   2               SI = 0;
 116   2               break;
C51 COMPILER V7.05   WPCF8574                                                              02/14/2006 11:53:43 PAGE 3   

 117   2      //SMB_MTADDACK                      (SMB0STA  =18H)
 118   2      //主发送器(MT)发送从地址+W成功;收到 ACK(从机应答),再将要发的子地址送入SMB0DAT.
 119   2               case SMB_MTADDACK:     //0x18
 120   2               SMB0DAT = WORD;
 121   2               SI = 0;                        // 清除中断标志
 122   2               break;
 123   2      //SMB_MTDBACK                            SMB0STA  =28H)
 124   2      //主发送器(MT)发送数据字节成功;收到ACK(从机应答) 
 125   2      //检查BYTE_SENT:如果为1,说明刚发出的是存储器地址;为0,刚发出的是数据字节    
 126   2            case SMB_MTDBACK:         //0x28
 127   2                              STO = 1;
 128   2                              SM_BUSY=0;
 129   2               SI = 0;
 130   2               break;
 131   2      //SMB_MRADDACK                          ;(SMB0STA  =40H)
 132   2      //(MR)主收发器发送从地址+R成功;收到 ACK(从机应答).主机发送NACK.
 133   2        case SMB_MRADDACK:    //0x40
 134   2               AA = 0;       // 主机在在回应周期发送NACK
 135   2               SI = 0;
 136   2               break;
 137   2      //SMB_MRDBNACK                  ;(SMB0STA  =58H)
 138   2      //(MR)主收发器接收数据成功;主机发送NACK 
 139   2      //读操作完成。读数据寄存器并发送STOP
 140   2            case SMB_MRDBNACK:        //0x58
 141   2               WORD= SMB0DAT;
 142   2               STO = 1;
 143   2               SM_BUSY = 0;
 144   2               AA = 1;           // 主机发送ACK,准备下一次传输
 145   2               SI = 0;
 146   2               break;
 147   2       }
 148   1        }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    280    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =      1    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       1
   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 + -