ds1302.lst

来自「自己做的单片机Proteus仿真实例」· LST 代码 · 共 482 行 · 第 1/2 页

LST
482
字号
C51 COMPILER V9.00   DS1302                                                                07/29/2012 18:04:57 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg51.h>
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          sbit lcden=P2^3;
   5          sbit lcdrs=P2^4;
   6          sbit reset=P2^5;
   7          sbit io=P2^6;
   8          sbit scl=P2^7;
   9          sbit s1=P1^3;
  10          sbit s2=P1^5;
  11          sbit s3=P1^7;
  12          #define DS1302_SECOND   0x80
  13          #define DS1302_MINUTE   0x82
  14          #define DS1302_HOUR             0x84 
  15          #define DS1302_WEEK             0x8A
  16          #define DS1302_DAY              0x86
  17          #define DS1302_MONTH    0x88
  18          #define DS1302_YEAR             0x8C
  19          char Second,Minute,Hour,Week,Day,Month,Year,flag;
  20          uchar code table1[]="20  -  -  "; 
  21          uchar code table2[]="  :  :  ";
  22          void delay(uint z)
  23          {
  24   1           uint x,y;
  25   1               for(x=z;x>0;x--)  
  26   1                 for(y=110;y>0;y--);
  27   1      }
  28          ///////////////DS1302//////////////////////////////////////////////////////////////////
  29          void write_byte(uchar date)     //实时时钟写入一字节(内部函数)
  30          { 
  31   1          uchar i,j;
  32   1          j=date;
  33   1              scl=0;
  34   1          for(i=8;i>0;i--)
  35   1          {
  36   2                  j=j>>1;
  37   2              io=CY;                  //相当于汇编中的 RRC
  38   2              scl=1;
  39   2                  scl=0; 
  40   2          } 
  41   1      }
  42          
  43          uchar read_byte()       //实时时钟读取一字节(内部函数)
  44          { 
  45   1          uchar i,j;
  46   1          for(i=8;i>0;i--)
  47   1          {
  48   2              j=j>>1;
  49   2                      if(io==1) 
  50   2                        j|=0x80;                               //相当于汇编中的 RRC 
  51   2              scl=1;
  52   2                      scl=0;
  53   2          } 
  54   1          return(j); 
  55   1      }
C51 COMPILER V9.00   DS1302                                                                07/29/2012 18:04:57 PAGE 2   

  56          
  57          void write1302(uchar addr,uchar date)   //addr: DS1302地址, date 要写的数据
  58          {
  59   1          reset=0;
  60   1              scl=0;
  61   1              reset=1;
  62   1          write_byte(addr);
  63   1              write_byte(date);               // 写1Byte数据
  64   1          scl=1;
  65   1              reset=0;
  66   1      } 
  67          
  68          uchar read1302(uchar addr)      //读取DS1302某地址的数据
  69          {
  70   1          uchar date;
  71   1          reset=0;
  72   1              scl=0;
  73   1              reset=1;
  74   1          write_byte(addr|0x01);        // 地址,命令 
  75   1          date=read_byte();            // 读1Byte数据
  76   1          scl=1;
  77   1          reset=0;
  78   1          return(date);
  79   1      }
  80          void gettime()
  81          {   
  82   1          
  83   1              uchar value;
  84   1              value=read1302(DS1302_SECOND);
  85   1              Second=((value&0x70)>>4)*10+(value&0x0F);
  86   1      
  87   1              value=read1302(DS1302_MINUTE);
  88   1              Minute=((value&0x70)>>4)*10+(value&0x0F);
  89   1      
  90   1              value=read1302(DS1302_HOUR);
  91   1              Hour=((value&0x70)>>4)*10+(value&0x0F);
  92   1      
  93   1              value=read1302(DS1302_DAY);
  94   1              Day=((value&0x70)>>4)*10+(value&0x0F);
  95   1                      
  96   1              value=read1302(DS1302_WEEK);
  97   1              Week=((value&0x70)>>4)*10+(value&0x0F);
  98   1      
  99   1              value=read1302(DS1302_MONTH);
 100   1              Month=((value&0x70)>>4)*10+(value&0x0F);
 101   1      
 102   1              value=read1302(DS1302_YEAR);
 103   1              Year=((value&0x70)>>4)*10+(value&0x0F); 
 104   1              
 105   1      }
 106          ///////////1602显示部分///////////////////////////////////////////////////////////////////////////////////
             -/
 107          void write_com(uchar com)
 108          {
 109   1           lcdrs=0;
 110   1               P0=com;
 111   1               delay(5);
 112   1               lcden=1;
 113   1               lcden=0;
 114   1      }
 115          void write_data(uchar date)
 116          {
C51 COMPILER V9.00   DS1302                                                                07/29/2012 18:04:57 PAGE 3   

 117   1           lcdrs=1;
 118   1               P0=date;
 119   1               delay(5);
 120   1               lcden=1;
 121   1               lcden=0;
 122   1      }
 123          void write_sfm(uchar add,uchar date)
 124          {
 125   1           uchar shi,ge;
 126   1               shi=date/10;
 127   1               ge=date%10;
 128   1               write_com(0x80+0x40+add);
 129   1               write_data(0x30+shi);
 130   1               write_data(0x30+ge);
 131   1      }
 132          void write_nyr(uchar add,uchar date)
 133          {
 134   1           uchar shi,ge;
 135   1               shi=date/10;
 136   1               ge=date%10;
 137   1               write_com(0x80+add);
 138   1               write_data(0x30+shi);
 139   1               write_data(0x30+ge);
 140   1      }
 141          void write_week(uchar Week)
 142          {
 143   1           write_com(0x80+12);
 144   1               switch(Week)
 145   1               {
 146   2                    case 1: write_data('M');
 147   2                                delay(5);
 148   2                                        write_data('O');
 149   2                                        delay(5);
 150   2                                        write_data('N');
 151   2                                        break;
 152   2                        case 2: write_data('T');
 153   2                                delay(5);
 154   2                                        write_data('H');
 155   2                                        delay(5);
 156   2                                        write_data('U');
 157   2                                        break;
 158   2                        case 3: write_data('W');
 159   2                                delay(5);
 160   2                                        write_data('E');
 161   2                                        delay(5);
 162   2                                        write_data('D');
 163   2                                        break;
 164   2                        case 4: write_data('T');
 165   2                                delay(5);
 166   2                                        write_data('H');
 167   2                                        delay(5);
 168   2                                        write_data('U');
 169   2                                        break;
 170   2                        case 5: write_data('F');
 171   2                                delay(5);
 172   2                                        write_data('R');
 173   2                                        delay(5);
 174   2                                        write_data('I');
 175   2                                        break;
 176   2                        case 6: write_data('S');
 177   2                                delay(5);
 178   2                                        write_data('A');
C51 COMPILER V9.00   DS1302                                                                07/29/2012 18:04:57 PAGE 4   

 179   2                                        delay(5);
 180   2                                        write_data('T');
 181   2                                        break;                 
 182   2                        case 7: write_data('S');
 183   2                                delay(5);
 184   2                                        write_data('U');
 185   2                                        delay(5);
 186   2                                        write_data('N');
 187   2                                        break;
 188   2               }
 189   1      }
 190          void display()
 191          {
 192   1                 write_sfm(10,Second);
 193   1             write_sfm(7,Minute);
 194   1                 write_sfm(4,Hour);
 195   1                 write_week(Week);
 196   1                 write_nyr(3,Year);
 197   1                 write_nyr(6,Month);
 198   1                 write_nyr(9,Day);
 199   1      }
 200          ///////////扫描键盘////////////////////////////////////////////////////////////////////////////////////
 201          void keyscan()
 202          {
 203   1           uchar s1num;
 204   1           if(s1==0)
 205   1               {
 206   2                     delay(5);
 207   2                         if(s1==0)
 208   2                         {   
 209   3                               s1num++;
 210   3                                       flag=1;
 211   3                                       while(!s1);
 212   3                                       switch(s1num)
 213   3                                       {
 214   4                                            case 1:write_com(0x80+0x40+10);
 215   4                                                       write_com(0x0f);
 216   4                                                               break;
 217   4                                                case 2:write_com(0x80+0x40+7);
 218   4                                                  
 219   4                                                               break;          
 220   4                                                case 3:write_com(0x80+0x40+4);
 221   4                                                  
 222   4                                                               break;
 223   4                                                case 4:write_com(0x80+12);
 224   4                                                    
 225   4                                                               break;

⌨️ 快捷键说明

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