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

📄 ds1302.lst

📁 EDN板子做的1602显示时钟 温度
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V6.12  DS1302                                                                 09/29/2007 14:54:24 PAGE 1   


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

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

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

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

 241   2      	    Time->DateString[5] = ' ';
 242   2      	    Time->DateString[6] = ' ';
 243   2      	  }
 244   1      	Time->DateString[7] = '/';
 245   1      	if(hide_day<2)
 246   1      	{
 247   2      	  Time->DateString[8] = Time->Day/10 + '0';
 248   2      	  Time->DateString[9] = Time->Day%10 + '0';
 249   2      	}
 250   1      	  else
 251   1      	  {
 252   2      	    Time->DateString[8] = ' ';
 253   2      	    Time->DateString[9] = ' ';	    
 254   2      	  }
 255   1      	if(hide_week<2)
 256   1      	{
 257   2      	  week_value[0] = Time->Week%10 + '0';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为
             -等一下要在最后显示
 258   2      	}
 259   1      	  else
 260   1      	  {
 261   2      	    week_value[0] = ' ';
 262   2      	  }
 263   1      	  week_value[1] = '\0';
 264   1      
 265   1      	Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
 266   1      }
 267          
 268          void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
 269          {   if(hide_hour<2)
 270   1          {
 271   2      	  Time->TimeString[0] = Time->Hour/10 + '0';
 272   2      	  Time->TimeString[1] = Time->Hour%10 + '0';
 273   2      	}
 274   1      	  else
 275   1      	    {
 276   2      	      Time->TimeString[0] = ' ';
 277   2      	      Time->TimeString[1] = ' ';
 278   2      		}
 279   1      	Time->TimeString[2] = ':';
 280   1          if(hide_min<2)
 281   1      	{
 282   2      	  Time->TimeString[3] = Time->Minute/10 + '0';
 283   2      	  Time->TimeString[4] = Time->Minute%10 + '0';
 284   2      	}
 285   1      	  else
 286   1      	    {
 287   2      	      Time->TimeString[3] = ' ';
 288   2      	      Time->TimeString[4] = ' ';
 289   2         	    }
 290   1      	Time->TimeString[5] = ':';

⌨️ 快捷键说明

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