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

📄 时钟ds1302lcd.lst

📁 时钟DS1302(LCD)
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   时钟DS1302LCD                                                         04/20/2010 00:37:59 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 时钟DS1302LCD
OBJECT MODULE PLACED IN 时钟DS1302LCD.OBJ
COMPILER INVOKED BY: D:\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          * 名称 : Convert(uchar In_Date)
  42          * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
  43          * 输入 : 1602资料上的值
  44          * 输出 : 送到1602的值
  45          ***********************************************************************/
  46          uchar Convert(uchar In_Date)
  47          {
  48   1          uchar i, Out_Date = 0, temp = 0;
  49   1          for(i=0; i<8; i++)
  50   1          {
  51   2              temp = (In_Date >> i) & 0x01;
  52   2              Out_Date |= (temp << (7 - i));
  53   2          }
  54   1          return Out_Date;
  55   1      }
C51 COMPILER V7.50   时钟DS1302LCD                                                         04/20/2010 00:37:59 PAGE 2   

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

 118   1              if(hang == 2) a = 0xc0;
 119   1              a = a + lie - 1;
 120   1              enable(a);
 121   1              write(sign);
 122   1      }
 123          
 124          /********************************************************************
 125          * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
 126          * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
 127                           L1602_string(1,5,"ab cd ef;")
 128          * 输入 : 行,列,需要输入1602的数据
 129          * 输出 : 无
 130          ***********************************************************************/
 131          void L1602_string(uchar hang,uchar lie,uchar *p)
 132          {
 133   1              uchar a;
 134   1              if(hang == 1) a = 0x80;
 135   1              if(hang == 2) a = 0xc0;
 136   1              a = a + lie - 1;
 137   1              enable(a);
 138   1              while(1)
 139   1              {
 140   2                      if(*p == '\0') break;
 141   2                      write(*p);
 142   2                      p++;
 143   2              }
 144   1      }
 145          
 146          /********************************************************************
 147          * 名称 :  v_RTInputByte()
 148          * 功能 :  往DS1302写入1Byte数据
 149          * 输入 :  ucDa 写入的数据
 150          * 输出 :  无
 151          ***********************************************************************/
 152          void v_RTInputByte(uchar ucDa)
 153          {
 154   1              uchar i;
 155   1              ACC = ucDa;
 156   1              T_RST = 1;
 157   1              for(i=8; i>0; i--)
 158   1              {
 159   2                      T_IO = ACC0;
 160   2                      T_CLK = 1;
 161   2                      T_CLK = 0;
 162   2                      ACC = ACC >> 1;
 163   2              }
 164   1      }
 165          
 166          /********************************************************************
 167          * 名称  :   uc_RTOutputByte()
 168          * 功能  :   从DS1302读取1Byte数据
 169          * 输入  :       无
 170          * 返回值:   ACC
 171          ***********************************************************************/
 172          uchar uc_RTOutputByte(void) 
 173          {
 174   1              uchar i;
 175   1              T_RST = 1;
 176   1              for(i=8; i>0; i--)
 177   1              {
 178   2                      ACC = ACC >>1;
 179   2                      T_IO=1;
C51 COMPILER V7.50   时钟DS1302LCD                                                         04/20/2010 00:37:59 PAGE 4   

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

⌨️ 快捷键说明

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