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

📄 password.lst

📁 采用时钟芯片PCF8563
💻 LST
字号:
C51 COMPILER V8.02   PASSWORD                                                              05/22/2009 23:15:40 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE PASSWORD
OBJECT MODULE PLACED IN password.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE password.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*======================================*/
   2          /*  名称:PCF8563时钟                   */
   3          /*  建立时间:2008.4.3                  */
   4          /*  程序功能:实现年月日时分秒显示      */
   5          /*  修改时间:2008.4.6                  */
   6          /*======================================*/
   7          
   8          #include <reg52.h>                //文件包含
   9          #include "intrins.h"
  10          
  11          #define uchar unsigned char    //宏定义
  12          #define uint unsigned int
  13          #define Nop() _nop_()     //定义空指令
  14          
  15          #define I2C_DeviceAddress 0xa2                   /* 定义器件在I2C总线中的地址 */
  16          
  17          
  18          uchar code LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};//共阴LED段码表--不带小数点
  19          uchar code display[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};       //共阳数码管
  20          //uchar data reg_set;
  21          uchar data time_set[5]={0x55,0x59,0x23,0xD6,0x88};         //初始时间03年8月16日21时59分25秒,星期4
  22          uchar data time_show[13]={0,0,0,0,0,0};    //显示时间
  23          uchar data time_disp[5];
  24          /*8583端口位定义*/
  25          
  26          sbit SCL=P3^0;     //模拟I2C时钟控制位
  27          sbit SDA=P3^1;     //模拟I2C数据传送位,串行双向数据输入/输出线
  28          
  29          
  30          sbit ge=P2^0;      //位选
  31          sbit shi=P2^1;
  32          sbit bai=P2^2;     
  33          sbit qian=P2^3;
  34          
  35          uchar second,minute,hour,day,month,year,week;
  36          uchar data x,y,count,i,sel,sele;
  37          /*状态标志*/
  38          bit ack;           //应答标志位  或bit bdata ack(定义可位寻址区);
  39          
  40          
  41          /*延时1ms/10程序*/
  42          void delay(int x)                               
  43          {       int i,j;
  44   1              for(j=0;j<x;j++)
  45   1              { for(i=0;i<10;i++);}           //空循环产生延时
  46   1      }
  47          
  48          
  49            
  50          /********************************************************************/
  51          void Start_I2C()
  52          {
  53   1       SDA=1;                                                  //数据线高电平
  54   1       SCL=1;                                                  //时钟线高电平
  55   1       Nop();Nop();Nop();Nop();Nop();  //起始条件建立时间大于4.7μs  
C51 COMPILER V8.02   PASSWORD                                                              05/22/2009 23:15:40 PAGE 2   

  56   1       SDA=0;                                                  //发送起始信号
  57   1       Nop();Nop();Nop();Nop();Nop();  //起始条件锁定时间大于4μs     
  58   1       SCL=0;                                                  //钳住I2C总线,准备发送或接收数据 
  59   1       Nop();Nop();
  60   1      }         
  61          
  62          /*
  63          ********************************************************************/
  64          void Stop_I2C()
  65          { //SCL=0; 可省略
  66   1       SDA=0;                   //发送结束条件的数据信号
  67   1       Nop();                   //发送结束条件的时钟信号
  68   1       SCL=1;                   //结束条件建立时间大于4μs
  69   1       Nop();Nop();Nop();Nop();
  70   1       SDA=1;                   //数据信号由0跳变为1
  71   1       Nop();Nop();Nop();Nop(); //SCL=0; 可省略
  72   1      }
  73          
  74          
  75          /**
  76          ********************************************************************/
  77          void Ack_I2C(bit a)
  78          {
  79   1        SDA=a;                     //0表示应答,1表示非应答                                            
  80   1        Nop();Nop();Nop();     
  81   1      SCL=1;
  82   1        Nop();Nop();Nop();Nop();Nop();        //时钟低电平周期大于4μs
  83   1      SCL=0;                              //清时钟线,钳住I2C总线以便继续接收
  84   1        Nop();Nop();   
  85   1      }
  86          
  87          /**
  88          ********************************************************************/
  89          bit checkAck_I2C()
  90          { 
  91   1        SDA=1; Nop();  Nop();           //8位发送完后释放数据线,准备接收应答位    
  92   1        SCL=1; Nop();  Nop();  Nop(); 
  93   1        if(SDA==1)ack=0;   
  94   1          else    ack=1;     //判断是否接收到应答信号,SDA=1表示无应答,SDA=0表示有应答
  95   1        SCL=0; Nop();  Nop();  
  96   1        return(ack);
  97   1      }
  98          /**
  99          ********************************************************************/
 100          void Write_8bit(uchar input)
 101          {
 102   1        uchar i;
 103   1        for(i=0;i<8;i++)        //要传送的数据长度为8位(一个字节)
 104   1        {
 105   2          if((input<<i)&0x80)   //判断发送位,并发送,先发高位
 106   2                 SDA=1;   
 107   2           else 
 108   2                 SDA=0;           
 109   2          Nop();
 110   2          SCL=1;                                    //置时钟线为高,通知被控器开始接收数据位  
 111   2          Nop();  Nop();  Nop();  Nop();  Nop();    //保证时钟高电平周期大于4μs   
 112   2          SCL=0; 
 113   2        }  
 114   1      }
 115          
 116          /*********************************************************************/    
 117          uchar Read_8bit()
C51 COMPILER V8.02   PASSWORD                                                              05/22/2009 23:15:40 PAGE 3   

 118          {
 119   1        uchar temp=0,i;
 120   1        SDA=1;            //置数据线为输入方式
 121   1        for(i=0;i<8;i++)
 122   1          {          
 123   2           //SCL=0;         //*置时钟线为低,准备接收数据位
 124   2           //Nop();  Nop();  Nop();   Nop();  Nop();     //*时钟低电平周期大于4.7μs
 125   2           SDA=1;
 126   2               SCL=1; Nop();  Nop();   //置时钟线为高使数据线上数据有效   
 127   2           temp=temp<<1;          //临时存放接收的数据,先接受的是最高位
 128   2           if(SDA==1)temp=temp+1; //读数据位,接收的数据位放入temp中,temp=temp|0x01;
 129   2           Nop(); Nop(); 
 130   2           SCL=0;   
 131   2           Nop(); Nop();
 132   2         }
 133   1        return(temp);
 134   1      }
 135          
 136          /********************************************************************/
 137          I2C_SendByte(uchar addr,uchar n)
 138          {
 139   1        uchar i;
 140   1        Start_I2C();                          //启动总线
 141   1        Write_8bit(I2C_DeviceAddress);    
 142   1        if(checkAck_I2C()==0)return(0);          
 143   1        Write_8bit(addr);                 //发送写入地址
 144   1        if(checkAck_I2C()==0)return(0);          
 145   1        
 146   1        for(i=0;i<n;i++)                    
 147   1              {
 148   2                Write_8bit(time_set[i]);
 149   2                if(checkAck_I2C()==0)return(0);        
 150   2          }
 151   1        Stop_I2C();            //结束总线 
 152   1      }
 153          
 154          /**********************************************************************/
 155          I2C_SendByte1(uchar addr,uchar reg_set)
 156          {
 157   1        //uchar i;
 158   1        Start_I2C();                      
 159   1        Write_8bit(I2C_DeviceAddress);    
 160   1        if(checkAck_I2C()==0)return(0);           
 161   1        Write_8bit(addr);                 
 162   1        if(checkAck_I2C()==0)return(0);           
 163   1        
 164   1        Write_8bit(reg_set);
 165   1        if(checkAck_I2C()==0)return(0);        
 166   1          
 167   1        Stop_I2C();            //结束总线 
 168   1      }
 169          
 170          /*********************************************************************/
 171          I2C_RcvByte(uchar addr,uchar n)
 172          {
 173   1        uchar i;
 174   1        Start_I2C();           //启动总线
 175   1        Write_8bit(I2C_DeviceAddress);     //发送读控制字
 176   1        if(checkAck_I2C()==0)return(0);
 177   1        Write_8bit(addr);        //发送要读取的寻址单元地址
 178   1        if(checkAck_I2C()==0)return(0);        
 179   1      
C51 COMPILER V8.02   PASSWORD                                                              05/22/2009 23:15:40 PAGE 4   

 180   1        Start_I2C();           //启动总线
 181   1        Write_8bit(I2C_DeviceAddress+1);     //发送读控制字——1010+从器件地址信息+1
 182   1        if(checkAck_I2C()==0)return(0);
 183   1        for(i=0;i<n;i++)                                        
 184   1        {                                                                      
 185   2          time_disp[i]=Read_8bit();    
 186   2              if(i!=n-1)Ack_I2C(0);            
 187   2               else     Ack_I2C(1);           
 188   2        }
 189   1                  
 190   1        Stop_I2C();             //结束总线   
 191   1      }
 192          
 193          
 194          display_led()              //共阳数码管显示
 195          {
 196   1        sel=0X01;
 197   1        for(i=0;i<8;i++)
 198   1          {     
 199   2                P2=sel;
 200   2                P0=display[time_show[i]];delay(1);
 201   2                sel=sel<<1;
 202   2              }
 203   1        
 204   1        P2=0;
 205   1        sel=0X01;
 206   1        for(i=8;i<13;i++)
 207   1          {     
 208   2                P1=sel;
 209   2                P0=display[time_show[i]];delay(1);
 210   2                sel=sel<<1;
 211   2              }
 212   1        P1=0;
 213   1      }               
 214          
 215          main()             
 216          {
 217   1        SDA=1;
 218   1        SCL=1;
 219   1      
 220   1        
 221   1        I2C_SendByte1(0x00,0x20);   // 向地址00H单元写入0x20,停止计时
 222   1        I2C_SendByte(0x02,5);       // 向地址02H单元和03H单元分别写入秒和分两个字节
 223   1        I2C_SendByte1(0x00,0x00);   // 向地址00H单元写入0x00,起动计时
 224   1      
 225   1        
 226   1        delay(10);
 227   1        
 228   1        while(1)
 229   1         {
 230   2               I2C_RcvByte(2,5);                   //将02单元开始的秒分时读出
 231   2               second=time_disp[0]&0x7F;
 232   2               minute=time_disp[1]&0x7F;
 233   2               hour=time_disp[2]&0x3F;
 234   2               day=time_disp[3]&0x3F;
 235   2               month=time_disp[4]&0x1F;
 236   2               year=time_disp[3]&0xC0;
 237   2               week=time_disp[4]&0xE0;
 238   2      
 239   2               time_show[0]=second&0x0F;        //秒低位       
 240   2               time_show[1]=(second&0xF0)>>4;   //秒高位
 241   2      
C51 COMPILER V8.02   PASSWORD                                                              05/22/2009 23:15:40 PAGE 5   

 242   2               time_show[2]=minute&0x0F;        //分低位
 243   2               time_show[3]=(minute>>4)&0x0F;   //分高位
 244   2      
 245   2           time_show[4]=hour&0x0F;        //时低位
 246   2               time_show[5]=(hour>>4)&0x0F;   //时高位
 247   2      
 248   2               time_show[6]=day&0x0F;        //日低位
 249   2               time_show[7]=(day>>4)&0x0F;   //日高位
 250   2      
 251   2               time_show[8]=month&0x0F;        //月低位
 252   2               time_show[9]=(month>>4)&0x0F;   //月高位
 253   2      
 254   2               time_show[10]=(year>>6)&0x03;        //年低位
 255   2               time_show[11]=0x00;             //年高位
 256   2      
 257   2               time_show[12]=(week>>5)&0x07;   //星期位
 258   2      
 259   2      
 260   2      
 261   2               display_led();
 262   2      
 263   2         }
 264   1       }
 265          
 266          
 267                                                                    


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    607    ----
   CONSTANT SIZE    =     22    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     36    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -