📄 1302_2.lst
字号:
C51 COMPILER V7.08 1302_2 03/05/2007 16:38:05 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE 1302_2
OBJECT MODULE PLACED IN 1302_2.OBJ
COMPILER INVOKED BY: D:\程序\keil c\C51\BIN\C51.EXE 1302_2.C LARGE INCDIR(c:|keil) DEBUG OBJECTEXTEND
line level source
1 #include <1302_2.h>
2 #include <keyboard451.h>
3 #include <set.h>
4
5 static int m;
6 data_1302 default_date_time ={
7 0x80, //秒,第七位初始为1,停止计数
8 0x00, //分
9 0x00, //时,第七位为零,24小时模式,第六位固定为0,第五位为20小时位,第四位为20小时以下位(1or0),后四位
-为小时数个位的BCD码
10 0x02, //日,7,6固定为0,5,4位表示数字十位的BCD码,3,2,1,0位为数字的个位BCD码
11 0x11, //月
12 0x04, //星期
13 0x06 //年
14 };
15 data_1302 data_to_1302 = {0};
16 ////////////////////////////////////////////////
17 set_struct set_pinyin_struct = {
18 //&data_to_1302,
19 0,
20 0
21 };
22 //---------------------------------------//
23 set_struct set_code_struct = {
24 //&data_to_1302,
25 0,
26 0
27 };
28 //---------------------------------------//
29 set_struct set_name_struct = {
30 //&data_to_1302,
31 0,
32 0
33 };
34 //---------------------------------------//
35 set_struct code_flag_struct = {
36 //&data_to_1302,
37 0,
38 0
39 };
40 //------------------------------------//
41
42 //////////////////////////////////////////
43 set_struct set_time_struct = {
44 &data_to_1302,
45 0
46 };
47
48 set_struct set_date_struct = {
49 &data_to_1302,
50 0
51 };
52
53 static void Input_Byte_1302(BYTE d) //向1302写入数据,按位
54 {
C51 COMPILER V7.08 1302_2 03/05/2007 16:38:05 PAGE 2
55 1 BYTE i;
56 1 ACC = d;
57 1 for(i=8; i>0; i--)
58 1 {
59 2 T_IO = ACC0;
60 2 T_CLK = 1;
61 2 T_CLK = 0;
62 2 ACC = ACC >> 1;
63 2 }
64 1 }
65
66 static BYTE Output_Byte_1302(void) //从1302读数据,按位
67 {
68 1 BYTE i;
69 1 for(i=8; i>0; i--)
70 1 {
71 2 ACC = ACC >>1;
72 2 ACC7 = T_IO;
73 2 T_CLK = 1;
74 2 T_CLK = 0;
75 2 }
76 1 return(ACC);
77 1 }
78
79 static void write_1302(BYTE ucAddr, BYTE ucDa) //写1302
80 {
81 1 T_RST = 0;
82 1 T_CLK = 0;
83 1 T_RST = 1;
84 1 Input_Byte_1302(ucAddr); /* 地址,命令 */
85 1 Input_Byte_1302(ucDa); /* 写1Byte数据*/
86 1 T_CLK = 1;
87 1 T_RST = 0;
88 1 }
89
90 static BYTE read_1302(BYTE ucAddr) //读1302
91 {
92 1 BYTE ucData;
93 1 T_RST = 0;
94 1 T_CLK = 0;
95 1 T_RST = 1;
96 1 Input_Byte_1302(ucAddr); /* 地址,命令 */
97 1 ucData = Output_Byte_1302(); /* 读1Byte数据 */
98 1 T_CLK = 1;
99 1 T_RST = 0;
100 1 return(ucData);
101 1 }
102 /********************************************************************
103 功 能:往DS1302写入时钟数据(多字节方式)
104 说 明:先写地址,后写命令/数据
105 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
106 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
107 ***********************************************************************/
108 void Burstwrite_1302T(BYTE *pWClock) //写1302,多字节
109 {
110 1 BYTE i;
111 1 write_1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
112 1 T_RST = 0;
113 1 T_CLK = 0;
114 1 T_RST = 1;
115 1 Input_Byte_1302(0xbe); /* 0xbe:时钟多字节写命令 */
116 1 for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
C51 COMPILER V7.08 1302_2 03/05/2007 16:38:05 PAGE 3
117 1 {
118 2 Input_Byte_1302(*pWClock); /* 写1Byte数据*/
119 2 pWClock++;
120 2 }
121 1 T_CLK = 1;
122 1 T_RST = 0;
123 1 }
124 /********************************************************************
125 功 能:读取DS1302时钟数据
126 说 明:先写地址/命令,后读数据(时钟多字节方式)
127 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
128 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
129 ***********************************************************************/
130 void Burstread_1302T(BYTE *pRClock) //读1302,多字节
131 {
132 1 BYTE i;
133 1 write_1302(0x8e,0x00);
134 1 T_RST = 0;
135 1 T_CLK = 0;
136 1 T_RST = 1;
137 1 Input_Byte_1302(0xbf); /* 0xbf:时钟多字节读命令 */
138 1 for (i=8; i>0; i--)
139 1 {
140 2 *pRClock = Output_Byte_1302(); /* 读1Byte数据 */
141 2 pRClock++;
142 2 }
143 1 T_CLK = 1;
144 1 T_RST = 0;
145 1 }
146 /********************************************************************
147 功 能:往DS1302寄存器数写入数据(多字节方式)
148 说 明:先写地址,后写数据(寄存器多字节方式)
149 入口参数:pWReg: 寄存器数据地址
150 ***********************************************************************/
151 void Burstwrite_1302R(BYTE *pWReg) //写1302寄存器,多字节
152 {
153 1 BYTE i;
154 1 write_1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
155 1 T_RST = 0;
156 1 T_CLK = 0;
157 1 T_RST = 1;
158 1 Input_Byte_1302(0xfe); /* 0xbe:时钟多字节写命令 */
159 1 for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
160 1 {
161 2 Input_Byte_1302(*pWReg); /* 写1Byte数据*/
162 2 pWReg++;
163 2 }
164 1 T_CLK = 1;
165 1 T_RST = 0;
166 1 }
167 /********************************************************************
168 功 能:读取DS1302寄存器数据
169 说 明:先写地址,后读命令/数据(寄存器多字节方式)
170 入口参数:pRReg: 寄存器数据地址
171 ***********************************************************************/
172 void Burstread_1302R(BYTE *pRReg) //读1302寄存器,多字节
173 {
174 1 BYTE i;
175 1 T_RST = 0;
176 1 T_CLK = 0;
177 1 T_RST = 1;
178 1 Input_Byte_1302(0xff); /* 0xff:时钟多字节读命令 */
C51 COMPILER V7.08 1302_2 03/05/2007 16:38:05 PAGE 4
179 1 for (i=31; i>0; i--) /*31Byte 寄存器数据 */
180 1 {
181 2 *pRReg = Output_Byte_1302(); /* 读1Byte数据 */
182 2 pRReg++;
183 2 }
184 1 T_CLK = 1;
185 1 T_RST = 0;
186 1 }
187
188 void Set_1302(data_1302 *pClock) //设置1302
189 {
190 1 BYTE i;
191 1 BYTE ucAddr = 0x80;
192 1 BYTE *j;
193 1 BYTE tem;
194 1 j = (BYTE*)pClock;
195 1 write_1302(0x8e,0x00);
196 1 for(i =7; i>0; i--)
197 1 {
198 2 tem = *j;
199 2 write_1302(ucAddr, tem);
200 2 j++;
201 2 ucAddr +=2;
202 2 }
203 1 write_1302(0x8e,0x80);
204 1 }
205
206 void Get_1302(data_1302 *ucCurtime) //读取1302数据
207 {
208 1
209 1 BYTE ucAddr = 0x81;
210 1
211 1 ucCurtime->second = read_1302(ucAddr);
212 1 ucAddr += 2;
213 1 ucCurtime->minute = read_1302(ucAddr);
214 1 ucAddr += 2;
215 1 ucCurtime->hour = read_1302(ucAddr);
216 1 ucAddr += 2;
217 1 ucCurtime->day = read_1302(ucAddr);
218 1 ucAddr += 2;
219 1 ucCurtime->month = read_1302(ucAddr);
220 1 ucAddr += 2;
221 1 ucCurtime->week = read_1302(ucAddr);
222 1 ucAddr += 2;
223 1 ucCurtime->year = read_1302(ucAddr);
224 1
225 1 }
226
227
228 void Write_Enable_1302(void) //1302写保护,允许
229 {
230 1 write_1302(0x8e, 0x00);
231 1 }
232
233
234 void Write_Disbale_1302(void) //1302写保护,禁止
235 {
236 1 write_1302(0x8e, 0x80);
237 1 }
238
239 void Work_Start_1302(void) //1302工作,允许
240 {
C51 COMPILER V7.08 1302_2 03/05/2007 16:38:05 PAGE 5
241 1 BYTE val;
242 1 val = read_1302(0x81);
243 1 val &= 0x7f; //最高位置零,保留低位数值
244 1 Write_Enable_1302();
245 1 write_1302(0x80, val);
246 1 write_1302(0x90, 0xa5); //涓流充电
247 1 Write_Disbale_1302();
248 1 }
249
250 void get_second_from_1302_data(data_1302 *get_data) //从1302读取秒数据
251 {
252 1 BYTE second_data ;
253 1 second_data = (get_data->second);
254 1 second_buffer.shiwei = 0x30 + ((second_data >> 4) & 0x07);
255 1 second_buffer.gewei = 0x30 + ((get_data->second) & 0x0F);
256 1 }
257
258 void get_minute_from_1302_data(data_1302 *get_data) //从1302读取分钟数据
259 {
260 1 BYTE minute_data ;
261 1 minute_data = (get_data->minute);
262 1 minute_buffer.shiwei = 0x30 + ((minute_data >> 4) & 0x07);
263 1 minute_buffer.gewei = 0x30 + (minute_data & 0x0F);
264 1 }
265 //注意指定24小时制,小时的十位可以取11否?还是只能是00,01,10,现在的程序是不能取11
266 void get_hour_from_1302_data(data_1302 *get_data) //从1302读取小时数据
267 {
268 1 BYTE hour_data ;
269 1 hour_data = (get_data->hour);
270 1 hour_buffer.gewei = 0x30 + (hour_data& 0x0F);
271 1 hour_data = ((hour_data >> 4) & 0x03);
272 1 /*
273 1 if (hour_data < 2)
274 1 hour_buffer.shiwei = 0x30 + hour_data;
275 1 else
276 1 hour_buffer.shiwei = 0x30 + 2;
277 1 */
278 1 hour_buffer.shiwei = 0x30 + hour_data;
279 1 }
280
281 void get_time_from_1302_data(data_1302 *get_data) //读取1302时间数据
282 {
283 1 get_second_from_1302_data(get_data);
284 1 get_minute_from_1302_data(get_data);
285 1 get_hour_from_1302_data(get_data);
286 1 }
287
288 static void get_day_from_1302_data(data_1302 *get_data) //读取1302天数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -