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

📄 ds1302.lst

📁 时间+温度用液晶12864显示
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V6.12  DS1302                                                                 09/30/2007 20:22:51 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          #define uint unsigned int
   4          #define uchar unsigned char
   5          sbit  DS1302_CLK = P3^4;              //实时时钟时钟线引脚 
   6          sbit  DS1302_IO  = P3^3;              //实时时钟数据线引脚 
   7          sbit  DS1302_RST = P3^5;              //实时时钟复位线引脚
   8          sbit  DQ = P1^6;                      //温度传送数据IO口
   9          sbit  ACC0 = ACC^0;
  10          sbit  ACC7 = ACC^7;
  11          uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
  12          sbit Set = P2^0;       //模式切换键
  13          sbit Up  = P2^1;        //加法按钮
  14          sbit Down= P2^2;      //减法按钮
  15          sbit out = P2^3;       //立刻跳出调整模式按钮
  16          uchar done,count,temp,up_flag,down_flag;
  17          uchar temp_value,temp1_value;      //temp_value温度值正数部分 temp1_value温度值小数部分 
  18          uchar TempBuffer[5],week_value[3];
  19          void show_time();   //液晶显示程序
  20          //****************************************
  21          //12864液晶显示部分子程序模块
  22          //****************************************
  23          sbit rs		= P1^0;
  24          sbit rw		= P1^1;
  25          sbit e  	= P1^2;
  26          #define lcddata P0
  27          sbit busy=P0^7;   //lcd busy bit
  28          void wr_d_lcd(uchar content);
  29          void wr_i_lcd(uchar content);
  30          void clrram_lcd (void);
  31          void init_lcd(void);
  32          void busy_lcd(void);
  33          void rev_row_lcd(uchar row);
  34          void rev_co_lcd(uchar row,uchar col,uchar mode);
  35          void clr_lcd(void);
  36          void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
  37          void wr_row_lcd(uchar row,char *p);
  38          //**********************************
  39          //液晶初始化
  40          //**********************************
  41          void init_lcd(void)
  42          {
  43   1      	wr_i_lcd(0x06);  /*光标的移动方向*/
  44   1      	wr_i_lcd(0x0c);  /*开显示,关游标*/
  45   1      }
  46          //***********************************
  47          //填充液晶DDRAM全为空格
  48          //**********************************
  49          void clrram_lcd (void)
  50          {
  51   1      	wr_i_lcd(0x30);
  52   1      	wr_i_lcd(0x01);
  53   1      }
  54          //***********************************
  55          //对液晶写数据
C51 COMPILER V6.12  DS1302                                                                 09/30/2007 20:22:51 PAGE 2   

  56          //content为要写入的数据
  57          //***********************************
  58          void wr_d_lcd(uchar content)
  59          {
  60   1      	busy_lcd();
  61   1      	rs=1;
  62   1          rw=0;
  63   1      	lcddata=content;
  64   1      	e=1;
  65   1      	;
  66   1      	e=0;
  67   1      }
  68          //********************************
  69          //对液晶写指令
  70          //content为要写入的指令代码
  71          //*****************************
  72          void wr_i_lcd(uchar content)
  73          {
  74   1      	busy_lcd();
  75   1      	rs=0;
  76   1          rw=0;
  77   1      	lcddata=content;
  78   1      	e=1;
  79   1      	;
  80   1      	e=0;
  81   1      }
  82          //********************************
  83          //液晶检测忙状态
  84          //在写入之前必须执行
  85          //********************************
  86          void busy_lcd(void)
  87          {
  88   1        lcddata=0xff;
  89   1        rs=0;
  90   1        rw=1;
  91   1        e =1;
  92   1        while(busy==1);
  93   1        e =0;
  94   1      }
  95          //********************************
  96          //指定要显示字符的坐标
  97          //*******************************
  98          void gotoxy(unsigned char y, unsigned char x)
  99          {
 100   1      	if(y==1)
 101   1      		wr_i_lcd(0x80|x);
 102   1      	if(y==2)
 103   1              wr_i_lcd(0x90|x);
 104   1      	if(y==3)
 105   1      		wr_i_lcd((0x80|x)+8);
 106   1      	if(y==4)
 107   1              wr_i_lcd((0x90|x)+8);
 108   1      }
 109          //**********************************
 110          //液晶显示字符串程序
 111          //**********************************
 112          void print(uchar *str)
 113          {
 114   1      	while(*str!='\0')
 115   1      	{
 116   2      		wr_d_lcd(*str);
 117   2      		str++;
C51 COMPILER V6.12  DS1302                                                                 09/30/2007 20:22:51 PAGE 3   

 118   2      	}
 119   1      }
 120          
 121          
 122          
 123          
 124          
 125          
 126          //***********************************
 127          //DS1302时钟部分子程序模块
 128          //***********************************
 129          typedef struct __SYSTEMTIME__
 130          {
 131          	uchar Second;
 132          	uchar Minute;
 133          	uchar Hour;
 134          	uchar Week;
 135          	uchar Day;
 136          	uchar Month;
 137          	uchar  Year;
 138          	uchar DateString[11];
 139          	uchar TimeString[9];
 140          }SYSTEMTIME;	//定义的时间类型
 141          SYSTEMTIME CurrentTime;
 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          //实时时钟写入一字节(内部函数)
 155          //**********************************
 156          void DS1302InputByte(uchar d) 	
 157          { 
 158   1          uchar i;
 159   1          ACC = d;
 160   1          for(i=8; i>0; i--)
 161   1          {
 162   2              DS1302_IO = ACC0;           	//相当于汇编中的 RRC
 163   2              DS1302_CLK = 1;
 164   2              DS1302_CLK = 0;
 165   2              ACC = ACC >> 1; 
 166   2          } 
 167   1      }
 168          //*************************************
 169          //实时时钟读取一字节(内部函数)
 170          //*************************************
 171          uchar DS1302OutputByte(void) 	
 172          { 
 173   1          uchar i;
 174   1          for(i=8; i>0; i--)
 175   1          {
 176   2              ACC = ACC >>1;         			//相当于汇编中的 RRC 
 177   2              ACC7 = DS1302_IO;
 178   2              DS1302_CLK = 1;
 179   2              DS1302_CLK = 0;
C51 COMPILER V6.12  DS1302                                                                 09/30/2007 20:22:51 PAGE 4   

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

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

 302   2      	      Time->TimeString[0] = ' ';
 303   2      	      Time->TimeString[1] = ' ';
 304   2      		}
 305   1      	Time->TimeString[2] = ':';
 306   1          if(hide_min<2)
 307   1      	{
 308   2      	  Time->TimeString[3] = Time->Minute/10 + '0';
 309   2      	  Time->TimeString[4] = Time->Minute%10 + '0';
 310   2      	}

⌨️ 快捷键说明

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