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

📄 ds1302.lst

📁 用单片机驱动驱动液晶显示器
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V8.02   DS1302                                                                07/12/2008 21:49:01 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: F:\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <REG51.H>
   2          #include <intrins.h>
   3          //#include "LCD1602.h"
   4          //#include "DS1302.h"
   5          #define uint unsigned int
   6          #define uchar unsigned char
   7          sbit  DS1302_CLK = P1^7;              //实时时钟时钟线引脚 
   8          sbit  DS1302_IO  = P1^6;              //实时时钟数据线引脚 
   9          sbit  DS1302_RST = P1^5;              //实时时钟复位线引脚
  10          //sbit  wireless_1 = P3^0;
  11          //sbit  wireless_2 = P3^1;
  12          //sbit  wireless_3 = P3^2;
  13          //sbit  wireless_4 = P3^3;
  14          sbit  ACC0 = ACC^0;
  15          sbit  ACC7 = ACC^7;
  16          char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
  17          sbit Set = P2^0;       //模式切换键
  18          sbit Up = P2^1;        //加法按钮
  19          sbit Down = P2^2;      //减法按钮
  20          sbit out = P2^3;       //立刻跳出调整模式按钮
  21          sbit DQ = P1^0;        //温度传送数据IO口
  22          sbit SetTick=P2^4;         //调整闹钟时间
  23          char done,adjusttick,count,temp,flag,up_flag,down_flag;
  24          uchar temp_value;      //温度值
  25          uchar TempBuffer[5],week_value[2];
  26          
  27          
  28          void show_time();   //液晶显示程序
  29          void show_tick_time();
  30          /***********1602液晶显示部分子程序****************/
  31          
  32          
  33          //Port Definitions**********************************************************
  34          sbit LcdRs              = P2^5;
  35          sbit LcdRw              = P2^6;
  36          sbit LcdEn      = P2^7;
  37          sfr  DBPort     = 0x80;         //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
  38          
  39          //内部等待函数**************************************************************************
  40          unsigned char LCD_Wait(void)
  41          {
  42   1              LcdRs=0;
  43   1              LcdRw=1;        _nop_();
  44   1              LcdEn=1;        _nop_();
  45   1      
  46   1              LcdEn=0;
  47   1              return DBPort;          
  48   1      }
  49          //向LCD写入命令或数据************************************************************
  50          #define LCD_COMMAND                     0      // Command
  51          #define LCD_DATA                        1      // Data
  52          #define LCD_CLEAR_SCREEN        0x01      // 清屏
  53          #define LCD_HOMING              0x02      // 光标返回原点
  54          void LCD_Write(bit style, unsigned char input)
  55          {
C51 COMPILER V8.02   DS1302                                                                07/12/2008 21:49:01 PAGE 2   

  56   1              LcdEn=0;
  57   1              LcdRs=style;
  58   1              LcdRw=0;                _nop_();
  59   1              DBPort=input;   _nop_();//注意顺序
  60   1              LcdEn=1;                _nop_();//注意顺序
  61   1              LcdEn=0;                _nop_();
  62   1              LCD_Wait();     
  63   1      }
  64          
  65          //设置显示模式************************************************************
  66          #define LCD_SHOW                        0x04    //显示开
  67          #define LCD_HIDE                        0x00    //显示关          
  68          
  69          #define LCD_CURSOR                      0x02    //显示光标
  70          #define LCD_NO_CURSOR           0x00    //无光标                     
  71          
  72          #define LCD_FLASH                       0x01    //光标闪动
  73          #define LCD_NO_FLASH            0x00    //光标不闪动
  74          
  75          void LCD_SetDisplay(unsigned char DisplayMode)
  76          {
  77   1              LCD_Write(LCD_COMMAND, 0x08|DisplayMode);       
  78   1      }
  79          
  80          //设置输入模式************************************************************
  81          #define LCD_AC_UP                       0x02
  82          #define LCD_AC_DOWN                     0x00      // default
  83          
  84          #define LCD_MOVE                        0x01      // 画面可平移
  85          #define LCD_NO_MOVE                     0x00      //default
  86          
  87          void LCD_SetInput(unsigned char InputMode)
  88          {
  89   1              LCD_Write(LCD_COMMAND, 0x04|InputMode);
  90   1      }
  91          
  92          //初始化LCD************************************************************
  93          void LCD_Initial()
  94          {
  95   1              LcdEn=0;
  96   1              LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
  97   1              LCD_Write(LCD_COMMAND,0x38);
  98   1              LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
  99   1              LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
 100   1              LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
 101   1      }
 102          
 103          //液晶字符输入的位置************************
 104          void GotoXY(unsigned char x, unsigned char y)
 105          {
 106   1              if(y==0)
 107   1                      LCD_Write(LCD_COMMAND,0x80|x);
 108   1              if(y==1)
 109   1                      LCD_Write(LCD_COMMAND,0x80|(x-0x40));
 110   1      }
 111          
 112          //将字符输出到液晶显示
 113          void Print(unsigned char *str)
 114          {
 115   1              while(*str!='\0')
 116   1              {
 117   2                      LCD_Write(LCD_DATA,*str);
C51 COMPILER V8.02   DS1302                                                                07/12/2008 21:49:01 PAGE 3   

 118   2                      str++;
 119   2              }
 120   1      }
 121          
 122          
 123          
 124          
 125          
 126          
 127          /***********DS1302时钟部分子程序******************/
 128          typedef struct __SYSTEMTIME__
 129          {
 130                  unsigned char Second;
 131                  unsigned char Minute;
 132                  unsigned char Hour;
 133                  unsigned char Week;
 134                  unsigned char Day;
 135                  unsigned char Month;
 136                  unsigned char  Year;
 137                  unsigned char DateString[11];
 138                  unsigned char TimeString[9];
 139          }SYSTEMTIME;    //定义的时间类型
 140          SYSTEMTIME CurrentTime;
 141          SYSTEMTIME TickTime;
 142          
 143          
 144          #define AM(X)   X
 145          #define PM(X)   (X+12)                    // 转成24小时制
 146          #define DS1302_SECOND   0x80          //时钟芯片的寄存器位置,存放时间
 147          #define DS1302_MINUTE   0x82
 148          #define DS1302_HOUR             0x84 
 149          #define DS1302_WEEK             0x8A
 150          #define DS1302_DAY              0x86
 151          #define DS1302_MONTH    0x88
 152          #define DS1302_YEAR             0x8C 
 153          
 154          void DS1302InputByte(unsigned char d)   //实时时钟写入一字节(内部函数)
 155          { 
 156   1              unsigned char i;
 157   1              ACC = d;
 158   1              for(i=8; i>0; i--)
 159   1              {
 160   2                      DS1302_IO = ACC0;               //相当于汇编中的 RRC
 161   2                      DS1302_CLK = 1;
 162   2                      DS1302_CLK = 0;
 163   2                      ACC = ACC >> 1; 
 164   2              } 
 165   1      }
 166          
 167          unsigned char DS1302OutputByte(void)    //实时时钟读取一字节(内部函数)
 168          { 
 169   1              unsigned char i;
 170   1              for(i=8; i>0; i--)
 171   1              {
 172   2                      ACC = ACC >>1;                          //相当于汇编中的 RRC 
 173   2                      ACC7 = DS1302_IO;
 174   2                      DS1302_CLK = 1;
 175   2                      DS1302_CLK = 0;
 176   2              } 
 177   1              return(ACC); 
 178   1      }
 179          
C51 COMPILER V8.02   DS1302                                                                07/12/2008 21:49:01 PAGE 4   

 180          void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要写的数据
 181          {
 182   1              DS1302_RST = 0;
 183   1              DS1302_CLK = 0;
 184   1              DS1302_RST = 1;
 185   1              DS1302InputByte(ucAddr);        // 地址,命令 
 186   1              DS1302InputByte(ucDa);          // 写1Byte数据
 187   1              DS1302_CLK = 1;
 188   1              DS1302_RST = 0;
 189   1      } 
 190          
 191          unsigned char Read1302(unsigned char ucAddr)    //读取DS1302某地址的数据
 192          {
 193   1              unsigned char ucData;
 194   1              DS1302_RST = 0;
 195   1              DS1302_CLK = 0;
 196   1              DS1302_RST = 1;
 197   1              DS1302InputByte(ucAddr|0x01);        // 地址,命令 
 198   1              ucData = DS1302OutputByte();         // 读1Byte数据
 199   1              DS1302_CLK = 1;
 200   1              DS1302_RST = 0;
 201   1              return(ucData);
 202   1      }
 203          
 204          
 205          
 206          void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
 207          {
 208   1              unsigned char ReadValue;
 209   1              ReadValue = Read1302(DS1302_SECOND);
 210   1              Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 211   1              ReadValue = Read1302(DS1302_MINUTE);
 212   1              Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 213   1              ReadValue = Read1302(DS1302_HOUR);
 214   1              Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 215   1              ReadValue = Read1302(DS1302_DAY);
 216   1              Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
 217   1              ReadValue = Read1302(DS1302_WEEK);
 218   1              Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 219   1              ReadValue = Read1302(DS1302_MONTH);
 220   1              Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 221   1              ReadValue = Read1302(DS1302_YEAR);
 222   1              Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
 223   1      }
 224          
 225          void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
 226          {   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2
             -007/07/22
 227   1      {                               
 228   2              Time->DateString[0] = '2';
 229   2              Time->DateString[1] = '0';       

⌨️ 快捷键说明

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