📄 ds1302.lst
字号:
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 + -