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

📄 clock.lst

📁 LCD1602 显示时钟 LCD1602应用实例带有温度控制
💻 LST
📖 第 1 页 / 共 3 页
字号:
 716   1          { 
 717   2            DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期
 718   2          }     
 719   1      }
 720          
 721          //********* LCM1602驱动程序 ***************
 722          //写数据
 723          void WriteDataLCM(unsigned char WDLCM)
 724          {
 725   1        ReadStatusLCM(); //检测忙
 726   1        LCM_Data = WDLCM;
 727   1        LCM_RS = 1;
 728   1        LCM_RW = 0;
 729   1        LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 730   1        LCM_E = 0; //延时
 731   1        LCM_E = 1;
 732   1      }
 733          //写指令
 734          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 735          {
 736   1        if (BuysC) ReadStatusLCM(); //根据需要检测忙
 737   1        LCM_Data = WCLCM;
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 13  

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

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

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

 924   1      }
 925          
 926          //复位
 927          byte ow_reset(void)
 928          {
 929   1        byte presence;
 930   1        DQ = 0;        //拉低总线
 931   1        delay(29);    // 保持 480us
 932   1        DQ = 1;       // 释放总线
 933   1        delay(3);     // 等待回复
 934   1        presence = DQ; // 读取信号
 935   1        delay(25);    // 等待结束信号
 936   1        return(presence); // 返回   0:正常 1:不存在
 937   1      }     
 938          
 939          //从 1-wire 总线上读取一个字节
 940          byte read_byte(void)
 941          {
 942   1        byte i;
 943   1        byte value = 0;
 944   1        for (i=8;i>0;i--)
 945   1        {
 946   2          value>>=1;
 947   2          DQ = 0; 
 948   2          DQ = 1;
 949   2          delay(1);  
 950   2          if(DQ)value|=0x80;
 951   2          delay(6); 
 952   2        }
 953   1        return(value);
 954   1      }
 955          
 956          //向 1-WIRE 总线上写一个字节
 957          void write_byte(char val)
 958          {
 959   1        byte i;
 960   1        for (i=8; i>0; i--) // 一次写一位
 961   1        {
 962   2          DQ = 0; // 
 963   2          DQ = val&0x01;
 964   2          delay(5); // 
 965   2          DQ = 1;
 966   2          val=val/2;
 967   2        }
 968   1        delay(5);
 969   1      }
 970          
 971          //读取和显示温度
 972          Read_Temperature(char xx,char yy)
 973          {
 974   1        unsigned char i,tl_temp;
 975   1        unsigned int  x;
 976   1        unsigned char ct[8];
 977   1        union{byte c[2]; int x;}temp;
 978   1        
 979   1        ow_reset();
 980   1        write_byte(0xCC); // Skip ROM
 981   1        write_byte(0x44); // 转换温度
 982   1        ow_reset();
 983   1        write_byte(0xCC); //Skip ROM
 984   1        write_byte(0xbe); // 读取寄存器
 985   1        temp.c[1]=read_byte();//读出温度低8位
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 17  

 986   1        temp.c[0]=read_byte();//读出温度高8位
 987   1       
 988   1        // 零下温度判断
 989   1        sflag=0; //温度零下标志 0:零上,1:零下
 990   1        if((temp.c[0]&0xf8)!=0x00)
 991   1         {
 992   2          sflag=1; //零下标志位置1
 993   2          temp.c[1]=~temp.c[1]; //低8位取反
 994   2          temp.c[0]=~temp.c[0]; //高8位取反
 995   2          tl_temp=temp.c[1]+1;  //低8位加1 
 996   2          temp.c[1]=tl_temp;    //计算后重新存入数组
 997   2          if(tl_temp>255) temp.c[0]++;  //如果低8位大于255,向高8位进1
 998   2        }  
 999   1      
1000   1        x=((temp.c[0]&0x07)*256+temp.c[1])*.625;
1001   1        for(i=0;i<8;i++)
1002   1             {
1003   2               ct[i]=0;
1004   2             }
1005   1        i=0;
1006   1        while(x/10)
1007   1         {
1008   2          ct[i]=x%10;
1009   2          x=x/10;
1010   2          i++;
1011   2         }
1012   1        ct[i]=x;
1013   1      
1014   1        if(sflag==1) DisplayOneChar(xx-1,yy,0x2d);
1015   1        else         DisplayOneChar(xx-1,yy,0x20);
1016   1        DisplayOneChar(xx,  yy,ct[2]+0x30);//显示温度十位数
1017   1        DisplayOneChar(xx+1,yy,ct[1]+0x30);//显示温度个位数
1018   1        DisplayOneChar(xx+2,yy,0x2e);//显示小数点
1019   1        DisplayOneChar(xx+3,yy,ct[0]+0x30);//显示温度小数位
1020   1        DisplayOneChar(xx+4,yy,0x01);//显示自定义字符
1021   1        DisplayOneChar(xx+5,yy,0x43);//显示字符“C
1022   1      }
1023          
1024          //温度分辨率调整
1025          void adjust_res(char res) ///res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
1026                                     //              0.5, 0.25, 0.125   
1027          {
1028   1        ow_reset();        //复位
1029   1        write_byte(0xcc);  //跳过Rom
1030   1        write_byte(0x4e);  //写暂存器
1031   1        write_byte(0x02);  //写TH 
1032   1        write_byte(0x01);  //写TL
1033   1        //write_byte(0x5f);  //写结构寄存器
1034   1        write_byte(res);
1035   1        ow_reset();       //复位
1036   1        write_byte(0xcc); //跳过Rom 
1037   1        write_byte(0x48); //把暂存器内容写到EPRam中
1038   1      } 
1039          
1040          void mychar()//自定义字符
1041          {
1042   1      ///////////////////////自定义字符
1043   1       WriteCommandLCM(0x48, 0); //第一行
1044   1       WriteDataLCM(0x02);
1045   1       WriteCommandLCM(0x49, 0); //第2行
1046   1       WriteDataLCM(0x05);
1047   1       WriteCommandLCM(0x4a, 0); //第3
C51 COMPILER V7.06   CLOCK                                                                 07/14/2008 21:00:26 PAGE 18  

1048   1       WriteDataLCM(0x05);
1049   1       WriteCommandLCM(0x4b, 0); //第4
1050   1       WriteDataLCM(0x02);
1051   1       WriteCommandLCM(0x4c, 0); //第5
1052   1       WriteDataLCM(0x00);
1053   1       WriteCommandLCM(0x4d, 0); //第6
1054   1       WriteDataLCM(0x00);
1055   1       WriteCommandLCM(0x4e, 0); //第7
1056   1       WriteDataLCM(0x00);
1057   1       WriteCommandLCM(0x4f, 0); //第8
1058   1       WriteDataLCM(0x00);
1059   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2812    ----
   CONSTANT SIZE    =      6    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13      39
   IDATA SIZE       =   ----    ----
   BIT SIZE         =     16    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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