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

📄 时钟ds1302lcd.lst

📁 单片机的实用程序代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   时钟DS1302LCD                                                         11/05/2010 16:12:57 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 时钟DS1302LCD
OBJECT MODULE PLACED IN 时钟DS1302LCD.OBJ
COMPILER INVOKED BY: E:\Program Files\KEIL\C51\BIN\C51.EXE 时钟DS1302LCD.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /********************************************************************
   2          * 文件名  : 时钟DS1302LCD.c
   3          * 描述    :  该文件实现用DS1302来实现日历和时钟功能,液晶1602上显示出来。
   4          * 创建人  : 东流,2009年4月10日
   5          * 版本号  : 2.0
   6          ***********************************************************************/
   7          #include<reg52.h>
   8          #include<intrins.h>
   9          
  10          #define uchar unsigned char
  11          #define uint  unsigned int
  12          
  13          sbit ACC0 = ACC^0;
  14          sbit ACC7 = ACC^7;
  15          
  16          sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
  17          sbit T_IO = P3^5; /*实时时钟数据线引脚 */
  18          sbit T_RST = P1^7; /*实时时钟复位线引脚 */
  19          
  20          //这三个引脚参考资料
  21          sbit E=P2^7;            //1602使能引脚
  22          sbit RW=P2^6;           //1602读写引脚  
  23          sbit RS=P2^5;           //1602数据/命令选择引脚
  24          
  25          /********************************************************************
  26          * 名称 : delay()
  27          * 功能 : 延时,延时时间大概为140US。
  28          * 输入 : 无
  29          * 输出 : 无
  30          ***********************************************************************/
  31          
  32          void delay()
  33          {
  34   1              int i,j;
  35   1              for(i=0; i<=10; i++)
  36   1              for(j=0; j<=2; j++)
  37   1      ;
  38   1      }
  39          
  40          
  41          /********************************************************************
  42          * 名称 : enable(uchar del)
  43          * 功能 : 1602命令函数
  44          * 输入 : 输入的命令值
  45          * 输出 : 无
  46          ***********************************************************************/
  47          
  48          void enable(uchar del)
  49          {
  50   1              P0 = del;
  51   1              RS = 0;
  52   1              RW = 0;
  53   1              E = 0;
  54   1              delay();
  55   1              E = 1;
C51 COMPILER V7.50   时钟DS1302LCD                                                         11/05/2010 16:12:57 PAGE 2   

  56   1              delay();
  57   1      }
  58          
  59          /********************************************************************
  60          * 名称 : write(uchar del)
  61          * 功能 : 1602写数据函数
  62          * 输入 : 需要写入1602的数据
  63          * 输出 : 无
  64          ***********************************************************************/
  65          
  66          void write(uchar del)
  67          {
  68   1              P0 = del;
  69   1              RS = 1;
  70   1              RW = 0;
  71   1              E = 0;
  72   1              delay();
  73   1              E = 1;
  74   1              delay();
  75   1      }
  76          
  77          /********************************************************************
  78          * 名称 : L1602_init()
  79          * 功能 : 1602初始化,请参考1602的资料
  80          * 输入 : 无
  81          * 输出 : 无
  82          ***********************************************************************/
  83          void L1602_init(void)
  84          {
  85   1              enable(0x01);
  86   1              enable(0x38);
  87   1              enable(0x0c);
  88   1              enable(0x06);
  89   1              enable(0xd0);
  90   1      }
  91          
  92          /********************************************************************
  93          * 名称 : L1602_char(uchar hang,uchar lie,char sign)
  94          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  95                           L1602_char(1,5,'b')
  96          * 输入 : 行,列,需要输入1602的数据
  97          * 输出 : 无
  98          ***********************************************************************/
  99          void L1602_char(uchar hang,uchar lie,char sign)
 100          {
 101   1              uchar a;
 102   1              if(hang == 1) a = 0x80;
 103   1              if(hang == 2) a = 0xc0;
 104   1              a = a + lie - 1;
 105   1              enable(a);
 106   1              write(sign);
 107   1      }
 108          
 109          /********************************************************************
 110          * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
 111          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
 112                           L1602_string(1,5,"ab cd ef;")
 113          * 输入 : 行,列,需要输入1602的数据
 114          * 输出 : 无
 115          ***********************************************************************/
 116          void L1602_string(uchar hang,uchar lie,uchar *p)
 117          {
C51 COMPILER V7.50   时钟DS1302LCD                                                         11/05/2010 16:12:57 PAGE 3   

 118   1              uchar a;
 119   1              if(hang == 1) a = 0x80;
 120   1              if(hang == 2) a = 0xc0;
 121   1              a = a + lie - 1;
 122   1              enable(a);
 123   1              while(1)
 124   1              {
 125   2                      if(*p == '\0') break;
 126   2                      write(*p);
 127   2                      p++;
 128   2              }
 129   1      }
 130          
 131          /********************************************************************
 132          * 名称 :  v_RTInputByte()
 133          * 功能 :  往DS1302写入1Byte数据
 134          * 输入 :  ucDa 写入的数据
 135          * 输出 :  无
 136          ***********************************************************************/
 137          void v_RTInputByte(uchar ucDa)
 138          {
 139   1              uchar i;
 140   1              ACC = ucDa;
 141   1              T_RST = 1;
 142   1              for(i=8; i>0; i--)
 143   1              {
 144   2                      T_IO = ACC0;
 145   2                      T_CLK = 1;
 146   2                      T_CLK = 0;
 147   2                      ACC = ACC >> 1;
 148   2              }
 149   1      }
 150          
 151          /********************************************************************
 152          * 名称  :   uc_RTOutputByte()
 153          * 功能  :   从DS1302读取1Byte数据
 154          * 输入  :       无
 155          * 返回值:   ACC
 156          ***********************************************************************/
 157          uchar uc_RTOutputByte(void) 
 158          {
 159   1              uchar i;
 160   1              T_RST = 1;
 161   1              for(i=8; i>0; i--)
 162   1              {
 163   2                      ACC = ACC >>1;
 164   2                      T_IO=1;
 165   2                      ACC7 = T_IO;
 166   2                      T_CLK = 1;
 167   2                      T_CLK = 0;
 168   2              }
 169   1              return(ACC);
 170   1      }
 171          
 172          /********************************************************************
 173          * 名称   :   v_W1302(uchar ucAddr, uchar ucDa)
 174          * 功能   :   往DS1302写入数据
 175          * 输入   :   ucAddr: DS1302地址, ucDa: 要写的数据
 176          * 返回值 :   无
 177          ***********************************************************************/
 178          void v_W1302(uchar ucAddr, uchar ucDa)
 179          {
C51 COMPILER V7.50   时钟DS1302LCD                                                         11/05/2010 16:12:57 PAGE 4   

 180   1              T_RST = 0;
 181   1              T_CLK = 0;
 182   1              T_RST = 1;
 183   1              v_RTInputByte(ucAddr);   // 写地址 
 184   1              _nop_();
 185   1              _nop_();
 186   1              v_RTInputByte(ucDa);     // 写1Byte数据
 187   1              T_CLK = 1;
 188   1              T_RST = 0;
 189   1      }
 190          
 191          /********************************************************************
 192          * 名称   :  uc_R1302(uchar ucAddr)
 193          * 功能   :  读取DS1302某地址的数据
 194          * 输入   :  ucAddr: DS1302地址
 195          * 返回值 :  ucDa :读取的数据
 196          ***********************************************************************/
 197          uchar uc_R1302(uchar ucAddr)
 198          {
 199   1              uchar ucDa;
 200   1              T_RST = 0;
 201   1              T_CLK = 0;
 202   1              T_RST = 1;
 203   1              v_RTInputByte(ucAddr);    //写地址,命令
 204   1              _nop_();
 205   1              _nop_();
 206   1              ucDa = uc_RTOutputByte(); //读1Byte数据
 207   1              T_CLK = 1;
 208   1              T_RST = 0;
 209   1              return(ucDa);
 210   1      }
 211          
 212          /********************************************************************
 213          * 名称   :  v_BurstW1302T
 214          * 功能   :  往DS1302写入时钟数据(多字节方式)
 215          * 输入   :  pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
 216          *                                                  8Byte (BCD码) 1B 1B 1B 1B 1B 1B  1B  1B
 217          * 返回值 :  无
 218          ***********************************************************************/
 219          void v_BurstW1302T(uchar *pSecDa)
 220          {
 221   1              uchar i;
 222   1              v_W1302(0x8e, 0x00);          //控制命令,WP=0,写操作
 223   1              T_RST = 0;
 224   1              T_CLK = 0;
 225   1              T_RST = 1;
 226   1              v_RTInputByte(0xbe);          //0xbe:时钟多字节写命令
 227   1              for(i=8; i>0; i--)            //8Byte = 7Byte 时钟数据 + 1Byte 控制
 228   1              {
 229   2                      v_RTInputByte(*pSecDa);   //写1Byte数据
 230   2                      pSecDa++;
 231   2              }
 232   1              T_CLK = 1;
 233   1              T_RST = 0;
 234   1      }

⌨️ 快捷键说明

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