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

📄 ds1302.lst

📁 12864+DS1302时钟+18B20温度计
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.06   DS1302                                                                02/28/2009 00:12:56 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /***********************************************************
   2          实验名称:带有温度显示的数字钟(LCD12864显示)示例程序
   3          程序说明:不能用STC89C52,因为容量不足。把程序烧到STC89C58上,然后正确插上12864,关闭点阵管显示,如果USB供
             -电不足请用外部变压器供电。
   4          作者:RF-X1开发板团队
   5          日期:2008-08-01
   6          ***********************************************************/
   7          
   8          #include <REG51.H>
   9          #include <intrins.h>
  10          #define uint unsigned int
  11          #define uchar unsigned char
  12          sbit  DS1302_CLK = P3^2;              //实时时钟时钟线引脚 
  13          sbit  DS1302_IO  = P3^3;              //实时时钟数据线引脚 
  14          sbit  DS1302_RST = P3^4;              //实时时钟复位线引脚
  15          sbit  DQ = P3^5;                      //温度传送数据IO口
  16          sbit  ACC0 = ACC^0;
  17          sbit  ACC7 = ACC^7;
  18          uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
  19          sbit Set = P3^5;       //模式切换键 对应实验板S4
  20          sbit Up  = P3^6;        //加法按钮 对应实验板S2
  21          sbit Down= P3^7;      //减法按钮  对应实验板S5
  22          //sbit out = P3^4;       //立刻跳出调整模式按钮 对应实验板S1
  23          uchar done,count,temp,up_flag,down_flag;
  24          uchar temp_value,temp1_value;      //temp_value温度值正数部分 temp1_value温度值小数部分 
  25          uchar TempBuffer[8],week_value[3];
  26          void show_time();   //液晶显示程序
  27          
  28          //****************************************
  29          //12864液晶显示部分子程序模块
  30          //****************************************
  31          sbit rs         = P2^0;
  32          sbit rw         = P2^1;
  33          sbit e          = P2^2;
  34          #define lcddata P1
  35          sbit busy=P1^7;   //lcd busy bit
  36          void wr_d_lcd(uchar content);
  37          void wr_i_lcd(uchar content);
  38          void clrram_lcd (void);
  39          void init_lcd(void);
  40          void busy_lcd(void);
  41          void rev_row_lcd(uchar row);
  42          void rev_co_lcd(uchar row,uchar col,uchar mode);
  43          void clr_lcd(void);
  44          void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
  45          void wr_row_lcd(uchar row,char *p);
  46          
  47          //**********************************
  48          //液晶初始化
  49          //**********************************
  50          void init_lcd(void)
  51          {
  52   1              wr_i_lcd(0x06);  /*光标的移动方向*/
  53   1              wr_i_lcd(0x0c);  /*开显示,关游标*/
  54   1      }
C51 COMPILER V7.06   DS1302                                                                02/28/2009 00:12:56 PAGE 2   

  55          
  56          //***********************************
  57          //填充液晶DDRAM全为空格
  58          //**********************************
  59          void clrram_lcd (void)
  60          {
  61   1              wr_i_lcd(0x30);
  62   1              wr_i_lcd(0x01);
  63   1      }
  64          
  65          //***********************************
  66          //对液晶写数据
  67          //content为要写入的数据
  68          //***********************************
  69          void wr_d_lcd(uchar content)
  70          {
  71   1              busy_lcd();
  72   1              rs=1;
  73   1          rw=0;
  74   1              lcddata=content;
  75   1              e=1;
  76   1              ;
  77   1              e=0;
  78   1      }
  79          
  80          //********************************
  81          //对液晶写指令
  82          //content为要写入的指令代码
  83          //*****************************
  84          void wr_i_lcd(uchar content)
  85          {
  86   1              busy_lcd();
  87   1              rs=0;
  88   1          rw=0;
  89   1              lcddata=content;
  90   1              e=1;
  91   1              ;
  92   1              e=0;
  93   1      }
  94          
  95          //********************************
  96          //液晶检测忙状态
  97          //在写入之前必须执行
  98          //********************************
  99          void busy_lcd(void)
 100          {
 101   1        lcddata=0xff;
 102   1        rs=0;
 103   1        rw=1;
 104   1        e =1;
 105   1        while(busy==1);
 106   1        e =0;
 107   1      }
 108          
 109          //********************************
 110          //指定要显示字符的坐标
 111          //*******************************
 112          
 113          void gotoxy(unsigned char y, unsigned char x)
 114          {
 115   1              if(y==1)
 116   1                      wr_i_lcd(0x80|x);
C51 COMPILER V7.06   DS1302                                                                02/28/2009 00:12:56 PAGE 3   

 117   1              if(y==2)
 118   1              wr_i_lcd(0x90|x);
 119   1              if(y==3)
 120   1                      wr_i_lcd((0x80|x)+8);
 121   1              if(y==4)
 122   1              wr_i_lcd((0x90|x)+8);
 123   1      }
 124          
 125          //**********************************
 126          //液晶显示字符串程序
 127          //**********************************
 128          void print(uchar *str)
 129          {
 130   1              while(*str!='\0')
 131   1              {
 132   2                      wr_d_lcd(*str);
 133   2                      str++;
 134   2              }
 135   1      }
 136          
 137          //***********************************
 138          //DS1302时钟部分子程序模块
 139          //***********************************
 140          typedef struct __SYSTEMTIME__
 141          {
 142                  uchar Second;
 143                  uchar Minute;
 144                  uchar Hour;
 145                  uchar Week;
 146                  uchar Day;
 147                  uchar Month;
 148                  uchar  Year;
 149                  uchar DateString[11];
 150                  uchar TimeString[9];
 151          }SYSTEMTIME;    //定义的时间类型
 152          SYSTEMTIME CurrentTime;
 153          
 154          
 155          #define AM(X)   X
 156          #define PM(X)   (X+12)                    // 转成24小时制
 157          #define DS1302_SECOND   0x80          //时钟芯片的寄存器位置,存放时间
 158          #define DS1302_MINUTE   0x82
 159          #define DS1302_HOUR             0x84 
 160          #define DS1302_WEEK             0x8A
 161          #define DS1302_DAY              0x86
 162          #define DS1302_MONTH    0x88
 163          #define DS1302_YEAR             0x8C 
 164          
 165          //**********************************
 166          //实时时钟写入一字节(内部函数)
 167          //**********************************
 168          void DS1302InputByte(uchar d)   
 169          { 
 170   1          uchar i;
 171   1          ACC = d;
 172   1          for(i=8; i>0; i--)
 173   1          {
 174   2              DS1302_IO = ACC0;               //相当于汇编中的 RRC
 175   2              DS1302_CLK = 1;
 176   2              DS1302_CLK = 0;
 177   2              ACC = ACC >> 1; 
 178   2          } 
C51 COMPILER V7.06   DS1302                                                                02/28/2009 00:12:56 PAGE 4   

 179   1      }
 180          
 181          //*************************************
 182          //实时时钟读取一字节(内部函数)
 183          //*************************************
 184          uchar DS1302OutputByte(void)    
 185          { 
 186   1          uchar i;
 187   1          for(i=8; i>0; i--)
 188   1          {
 189   2              ACC = ACC >>1;                          //相当于汇编中的 RRC 
 190   2              ACC7 = DS1302_IO;
 191   2              DS1302_CLK = 1;
 192   2              DS1302_CLK = 0;
 193   2          } 
 194   1          return(ACC); 
 195   1      }
 196          
 197          //**************************************
 198          //ucAddr: DS1302地址, ucData: 要写的数据
 199          //**************************************
 200          void Write1302(uchar ucAddr, uchar ucDa)        
 201          {
 202   1          DS1302_RST = 0;
 203   1          DS1302_CLK = 0;
 204   1          DS1302_RST = 1;
 205   1          DS1302InputByte(ucAddr);            // 地址,命令 
 206   1          DS1302InputByte(ucDa);              // 写1Byte数据
 207   1          DS1302_CLK = 1;
 208   1          DS1302_RST = 0;
 209   1      } 
 210          
 211          //**************************************
 212          //读取DS1302某地址的数据
 213          //**************************************
 214          uchar Read1302(uchar ucAddr)    
 215          {
 216   1          uchar ucData;
 217   1          DS1302_RST = 0;
 218   1          DS1302_CLK = 0;
 219   1          DS1302_RST = 1;
 220   1          DS1302InputByte(ucAddr|0x01);        // 地址,命令 
 221   1          ucData = DS1302OutputByte();         // 读1Byte数据
 222   1          DS1302_CLK = 1;
 223   1          DS1302_RST = 0;
 224   1          return(ucData);
 225   1      }
 226          
 227          //******************************************
 228          //获取时钟芯片的时钟数据到自定义的结构型数组
 229          //******************************************
 230          void DS1302_GetTime(SYSTEMTIME *Time)  
 231          {

⌨️ 快捷键说明

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