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