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

📄 da1302.lst

📁 利用实时时钟芯片DS1302设计的实时时钟
💻 LST
📖 第 1 页 / 共 4 页
字号:
 700   2                         OutputInformation(8,1,0x20);     //不显示
 701   2                         OutputInformation(9,1,0x20);
 702   2                       }
 703   1                      else
 704   1                DisplayListChar(5,1,reset);       //显示reset   
 705   1      }
 706          /**********************************退出***********************************************/
 707          void model6()
 708          {
 709   1        OutputInformation(10,1,0x20);       //不显示
 710   1        OutputInformation(11,1,0x20);       //不显示
 711   1        DisplayListChar(0,1,lamp);          //显示lamp
 712   1        DisplayListChar(5,1,reset);         //显示reset
 713   1        if(a==1)
 714   1               {OutputInformation(12,1,0x20);   //不显示
 715   2                OutputInformation(13,1,0x20);   //不显示
 716   2                OutputInformation(14,1,0x20);   //不显示
 717   2                OutputInformation(15,1,0x20);   //不显示
 718   2               }
 719   1        else
 720   1           DisplayListChar(12,1,exit);      //显示exit
 721   1      }
 722          
 723                  
 724            
 725          //********* LCM1602驱动程序 ***************
 726          //写数据
 727          void WriteDataLCM(uchar WDLCM)
 728          {
 729   1      ReadStatusLCM(); //检测忙
 730   1      LCM_Data = WDLCM;
 731   1      LCM_RS = 1;
 732   1      LCM_RW = 0;
 733   1      LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 734   1      LCM_E = 0; //延时
 735   1      LCM_E = 1;
C51 COMPILER V8.08   DA1302                                                                09/16/2008 21:50:25 PAGE 13  

 736   1      }
 737          //写指令
 738          void WriteCommandLCM(uchar WCLCM,BuysC)     //BuysC为0时忽略忙检测
 739           {
 740   1        if (BuysC) ReadStatusLCM(); //根据需要检测忙
 741   1        LCM_Data = WCLCM;
 742   1        LCM_RS = 0;
 743   1        LCM_RW = 0; 
 744   1        LCM_E = 0;
 745   1        LCM_E = 0;
 746   1        LCM_E = 1; 
 747   1       }
 748          //读状态
 749          uchar ReadStatusLCM(void)
 750           {
 751   1        LCM_RS = 0;
 752   1        LCM_RW = 1;
 753   1        LCM_E = 0;
 754   1        LCM_E = 0;
 755   1        LCM_E = 1;
 756   1        while (LCM_Data & Busy); //检测忙信号
 757   1        return(LCM_Data);
 758   1       }
 759          //LCM初始化
 760          void LCMInit(void) 
 761           {
 762   1        LCM_Data = 0;
 763   1        WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 764   1        Delay5Ms(); 
 765   1        WriteCommandLCM(0x38,0);
 766   1        Delay5Ms(); 
 767   1        WriteCommandLCM(0x38,0);
 768   1        Delay5Ms(); 
 769   1        WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 770   1        WriteCommandLCM(0x08,1); //关闭显示
 771   1        WriteCommandLCM(0x01,1); //显示清屏
 772   1        WriteCommandLCM(0x06,1); // 显示光标移动设置
 773   1        WriteCommandLCM(0x0C,1); // 显示开及光标设置
 774   1       }
 775          //按指定位置显示一个字符
 776          void OutputInformation(uchar X, uchar Y, uchar DData)
 777           {
 778   1        Y &= 0x1;
 779   1        X &= 0xF; //限制X不能大于15,Y不能大于1
 780   1        if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 781   1        X |= 0x80; //算出指令码
 782   1        WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 783   1        WriteDataLCM(DData);
 784   1       }
 785          //按指定位置显示一串字符  ***原来的遇到空格0x20就不显示***
 786          void DisplayListChar(uchar X, uchar Y, uchar code *DData)
 787          {
 788   1        uchar ListLength,j;
 789   1        ListLength = strlen(DData);
 790   1        Y &= 0x1;
 791   1        X &= 0xF; //限制X不能大于15,Y不能大于1
 792   1            if (X <= 0xF) //X坐标应小于0xF
 793   1              { 
 794   2               for(j=0;j<ListLength;j++)
 795   2                  {
 796   3                   OutputInformation(X, Y, DData[j]); //显示单个字符
 797   3                   X++;
C51 COMPILER V8.08   DA1302                                                                09/16/2008 21:50:25 PAGE 14  

 798   3                  }
 799   2              }
 800   1      }
 801          //5ms延时
 802          void Delay5Ms(void)
 803           {
 804   1        unsigned int TempCyc = 5552;
 805   1        while(TempCyc--);
 806   1       }
 807          //400ms延时
 808          void Delay400Ms(void)
 809           {
 810   1        uchar TempCycA = 5;
 811   1        unsigned int TempCycB;
 812   1        while(TempCycA--)
 813   1        {
 814   2         TempCycB=7269;
 815   2         while(TempCycB--);
 816   2        }
 817   1       }
 818          
 819          //********DS1302读写程序***************//
 820          /******************************************************************** 
 821          函 数 名:RTInputByte()
 822          功    能:实时时钟写入一字节
 823          说    明:往DS1302写入1Byte数据 (内部函数)
 824          入口参数:d 写入的数据 
 825          返 回 值:无  
 826          ***********************************************************************/
 827          void RTInputByte(uchar d) 
 828          { 
 829   1          uchar i;
 830   1          ACC = d;
 831   1          for(i=8; i>0; i--)
 832   1          {
 833   2              T_IO = ACC0;           /*相当于汇编中的 RRC */
 834   2              T_CLK = 1;
 835   2              T_CLK = 0;
 836   2              ACC = ACC >> 1; 
 837   2          } 
 838   1      }
 839          /******************************************************************** 
 840          函 数 名:RTOutputByte()
 841          功    能:实时时钟读取一字节
 842          说    明:从DS1302读取1Byte数据 (内部函数)
 843          入口参数:无  
 844          返 回 值:ACC
 845          设    计:zhaojunjie           日    期:2002-03-19
 846          修    改:                     日    期: 
 847          ***********************************************************************/
 848          uchar RTOutputByte(void) 
 849          { 
 850   1          uchar i;
 851   1          for(i=8; i>0; i--)
 852   1          {
 853   2              ACC = ACC >>1;         /*相当于汇编中的 RRC */
 854   2              ACC7 = T_IO;
 855   2              T_CLK = 1;
 856   2              T_CLK = 0;
 857   2          } 
 858   1          return(ACC); 
 859   1      }
C51 COMPILER V8.08   DA1302                                                                09/16/2008 21:50:25 PAGE 15  

 860          /******************************************************************** 
 861          函 数 名:W1302()
 862          功    能:往DS1302写入数据
 863          说    明:先写地址,后写命令/数据 (内部函数)
 864          调    用:RTInputByte() , RTOutputByte()
 865          入口参数:ucAddr: DS1302地址, ucData: 要写的数据
 866          返 回 值:无
 867          ***********************************************************************/
 868          void W1302(uchar ucAddr, uchar ucDa)
 869          {
 870   1          T_RST = 0;
 871   1          T_CLK = 0;
 872   1          T_RST = 1;
 873   1          RTInputByte(ucAddr);       /* 地址,命令 */
 874   1          RTInputByte(ucDa);       /* 写1Byte数据*/
 875   1          T_CLK = 1;
 876   1          T_RST = 0;
 877   1      }
 878          /******************************************************************** 
 879          函 数 名:R1302()
 880          功    能:读取DS1302某地址的数据
 881          说    明:先写地址,后读命令/数据 (内部函数)
 882          调    用:RTInputByte() , RTOutputByte()
 883          入口参数:ucAddr: DS1302地址
 884          返 回 值:ucData :读取的数据
 885          ***********************************************************************/
 886          uchar R1302(uchar ucAddr)
 887          {
 888   1          uchar ucData;
 889   1          T_RST = 0;
 890   1          T_CLK = 0;
 891   1          T_RST = 1;
 892   1          RTInputByte(ucAddr);             /* 地址,命令 */
 893   1          ucData = RTOutputByte();         /* 读1Byte数据 */
 894   1          T_CLK = 1;
 895   1          T_RST = 0;
 896   1          return(ucData);
 897   1      }
 898          
 899          /******************************************************************** 
 900          函 数 名:Set1302()
 901          功    能:设置初始时间
 902          说    明:先写地址,后读命令/数据(寄存器多字节方式)
 903          调    用:W1302()
 904          入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
 905                                         7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 906          返 回 值:无
 907          ***********************************************************************/
 908          void Set1302(uchar *pClock) 
 909          {
 910   1          uchar i;
 911   1          uchar ucAddr = 0x80; 
 912   1          W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作*/
 913   1          for(i =7; i>0; i--)
 914   1          { 
 915   2              W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
 916   2              pClock++;
 917   2              ucAddr +=2;
 918   2          }
 919   1          W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护*/
 920   1      }

C51 COMPILER V8.08   DA1302                                                                09/16/2008 21:50:25 PAGE 16  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3417    ----
   CONSTANT SIZE    =     69    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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