📄 da1302.lst
字号:
C51 COMPILER V8.08 DA1302 06/30/2007 15:23:46 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DA1302
OBJECT MODULE PLACED IN da1302.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE da1302.c LARGE OPTIMIZE(9,SPEED) DEBUG OBJECTEXTEND
line level source
1 #include <at89c51xd2.h>
2 #include <intrins.h>
3 #include "ds1302.h"
4 #include "lm3228.h"
5 #include "common.h"
6 #include "ds1302_hanzi.h"
7
8 sbit IO_DATA =P1^5;
9 sbit CLK =P1^6;
10 sbit RST =P1^7;
11
12 uchar data time1[8];
13
14
15 //从1302读取一个字节
16 uchar read_1302(void)
17 {
18 1 uchar xdata i,data_1302;
19 1
20 1 for(i=0;i<8;i++)
21 1 {
22 2
23 2 data_1302>>=1;
24 2 if(IO_DATA)
25 2 {
26 3 data_1302|=0x80;
27 3 }
28 2 CLK=1;
29 2 //nop();
30 2 CLK=0;
31 2 }
32 1 return(data_1302);
33 1 }
34 //向1302写入一个字节
35 void write_1302(uchar data_1302)
36 {
37 1 uchar xdata i;
38 1
39 1 for(i=0;i<8;i++)
40 1 {
41 2
42 2 data_1302>>=1;
43 2 IO_DATA=CY;
44 2 CLK=0;
45 2 //nop();
46 2 CLK=1;
47 2 //nop();
48 2 CLK=0;
49 2 }
50 1
51 1 }
52 //从1302的某地址读一个字节的数据
53 /*uchar read_byte_1302(uchar addr)
54 {
55 uchar data data_1302;
C51 COMPILER V8.08 DA1302 06/30/2007 15:23:46 PAGE 2
56 RST=0;
57 CLK=0;
58 RST=1;
59 write_1302(addr|0x01);
60 data_1302=read_1302();
61 CLK=1;
62 RST=0;
63 CLK=0;
64 return (data_1302);
65 }*/
66 //向1302的某地址写入一个字节的数据
67 void write_byte_1302(uchar addr,uchar data_1302)
68 {
69 1 RST=0;
70 1 CLK=0;
71 1 RST=1;
72 1 write_1302(addr);
73 1 write_1302(data_1302);
74 1 CLK=1;
75 1 RST=0;
76 1 CLK=0;
77 1 }
78 //是否写保护
79 void protect_1302(bit flag)
80 {
81 1 if(flag)
82 1 write_byte_1302(DS1302_CONTROL,0x80);
83 1 else
84 1 write_byte_1302(DS1302_CONTROL,0x00);
85 1 }
86
87 //停止1302时钟
88 /*void stop_1302(void)
89 {
90 write_byte_1302(DS1302_SECOND,0x80);
91 }*/
92 //启动1302时钟
93 void start_1302(void)
94 {
95 1 write_byte_1302(DS1302_SECOND,0x00);
96 1 }
97
98 //读1302的时间序列
99 void read_data(uchar *j)
100 {
101 1 uchar xdata i;
102 1 RST=0;
103 1 CLK=0;
104 1 RST=1;
105 1 write_1302(0xbf);
106 1 for(i=0;i<8;i++)
107 1 {
108 2 *(j)=read_1302();
109 2 j++;
110 2
111 2 }
112 1 CLK=1;
113 1 RST=0;
114 1 CLK=0;
115 1 }
116 //写1302的时间序列
117 void write_data(uchar *j)
C51 COMPILER V8.08 DA1302 06/30/2007 15:23:46 PAGE 3
118 {
119 1 uchar xdata i;
120 1 RST=0;
121 1 CLK=0;
122 1 RST=1;
123 1 write_1302(0xbe);
124 1 for(i=0;i<8;i++)
125 1 {
126 2 write_1302(*j);
127 2 j++;
128 2 }
129 1 CLK=1;
130 1 RST=0;
131 1 CLK=0;
132 1 }
133 //显示时间
134 void display_time(uchar lowaddr,uchar highaddr)
135 {
136 1
137 1 read_data(time1); //读时间
138 1
139 1 if(time1[2]&0x80) //如果成立,即12小时制,否则24小时制
140 1 { //显示小时
141 2 if(time1[2]&0x20) //如果成立,即下午,否则上午
142 2 {
143 3 string_display_code(1,&time2[12],lowaddr+0x09,highaddr);
144 3 string_display_code(1,&time2[13],lowaddr+0x0a,highaddr);
145 3 if(time1[2]&0x10) //下午
146 3 {
147 4 string_display_code(1,&time2[(time1[2]&0x10)>>4],lowaddr+0x00,highaddr);
148 4 string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
149 4 }
150 3 else
151 3 {
152 4 string_display_code(1,&time2[14],lowaddr+0x00,highaddr);
153 4 string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
154 4 }
155 3 }
156 2 else //上午
157 2 {
158 3 string_display_code(1,&time2[11],lowaddr+0x09,highaddr);
159 3 string_display_code(1,&time2[13],lowaddr+0x0a,highaddr);
160 3 if(time1[2]&0x10)
161 3 {
162 4 string_display_code(1,&time2[(time1[2]&0x10)>>4],lowaddr+0x00,highaddr);
163 4 string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
164 4
165 4 }
166 3 else
167 3 {
168 4 string_display_code(1,&time2[14],lowaddr+0x00,highaddr);
169 4 string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
170 4 }
171 3 }
172 2 }
173 1 else //24小时制
174 1 {
175 2 if(time1[2]&0x30)
176 2 {
177 3 string_display_code(1,&time2[(time1[2]&0x30)>>4],lowaddr+0x00,highaddr);
178 3 string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
179 3 }
C51 COMPILER V8.08 DA1302 06/30/2007 15:23:46 PAGE 4
180 2 else
181 2 {
182 3 string_display_code(1,&time2[14],lowaddr+0x00,highaddr);
183 3 string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
184 3 }
185 2 }
186 1 string_display_code(1,&time2[10],lowaddr+0x02,highaddr); //显示:
187 1
188 1 string_display_code(1,&(time2[(time1[1]&0x70)>>4]),lowaddr+0x03,highaddr); //显示分钟
189 1 string_display_code(1,&time2[time1[1]&0x0f],lowaddr+0x04,highaddr);
190 1
191 1
192 1
193 1 string_display_code(1,&time2[10],lowaddr+0x05,highaddr); //显示:
194 1
195 1
196 1 string_display_code(1,&(time2[(time1[0]&0x70)>>4]),lowaddr+0x06,highaddr); //显示秒
197 1 string_display_code(1,&time2[time1[0]&0x0f],lowaddr+0x07,highaddr);
198 1
199 1 }
200 //设置时间
201 void set_time(uchar *time)
202 {
203 1 protect_1302(0); //清除写保护
204 1 //写预设时间
205 1 write_data(time);
206 1
207 1 start_1302(); //启动1302
208 1
209 1 protect_1302(1); //开启写保护
210 1 }
211
212
213 //显示星期
214 void display_week(uchar lowaddr,uchar highaddr)
215 {
216 1 uchar xdata i;
217 1 hanzi_display(hanzi3,sizeof(hanzi3),lowaddr,highaddr); //显示“星期”
218 1 read_data(time1);
219 1 i=time1[5]; //显示星期几
220 1 hanzi_display(&hanzi4[(i-2)*32],32,lowaddr+0x4,highaddr); //sizeof(hanzi4[i])
221 1 }
222 //显示“现在时间”
223 void display_currenttime(uchar lowaddr,uchar highaddr)
224 {
225 1 hanzi_display(hanzi2,sizeof(hanzi2),lowaddr,highaddr);
226 1 }
227 //
228 void display_year(uchar lowaddr,uchar highaddr)
229 {
230 1 read_data(time1);
231 1 set_point(SET_ADDRESS_POINTER,lowaddr,highaddr);
232 1 string_display_code(1,&time2[(time1[6]>>4&0x0f)],lowaddr,highaddr);
233 1 string_display_code(1,&time2[time1[6]&0x0f],lowaddr+0x01,highaddr); //年
234 1 text_display('-');
235 1 string_display_code(1,&time2[time1[4]>>4&0x01],lowaddr+0x03,highaddr);
236 1 string_display_code(1,&time2[time1[4]&0x0f],lowaddr+0x04,highaddr); //月
237 1 text_display('-');
238 1 string_display_code(1,&time2[time1[3]>>4&0x03],lowaddr+0x06,highaddr);
239 1 string_display_code(1,&time2[time1[3]&0x0f],lowaddr+0x07,highaddr); //日
240 1 }
241 void time_display(void)
C51 COMPILER V8.08 DA1302 06/30/2007 15:23:46 PAGE 5
242 {
243 1 display_currenttime(0x00,0x08);
244 1 display_year(0x28,0x31);
245 1 display_week(0x10,0x08);
246 1 display_time(0x38,0x31);
247 1 }
248
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 729 ----
CONSTANT SIZE = 431 ----
XDATA SIZE = ---- 6
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -