📄 main.lst
字号:
220 1
221 1 }
222
223
224 //ds1302控制
225 sbit reset=P3^7;
226 sbit sclk=P2^6;
227 sbit io=P2^7;
228
229
230
231
232 void delay()
233 {uint j;
234 1 for(j=500;j>0;j--);
235 1 }
236
237 //-----------ds1302模块开始-------------------
238 //注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据
239 //读写时都是从第0位开始
240 void write_byte(uchar inbyte)
241 {
C51 COMPILER V7.06 MAIN 05/03/2008 23:24:27 PAGE 5
242 1 uchar i;
243 1 for(i=8;i>0;i--)
244 1 {
245 2 sclk=0; //写的时候低电平改变数据
246 2 if(inbyte&0x01)
247 2 io=1;
248 2 else
249 2 io=0;
250 2 sclk=1; //写的时候高电平,把数据写入ds1302
251 2 _nop_();
252 2 inbyte=inbyte>>1;
253 2 }
254 1 }
255 uchar read_byte() //sclk的下跳沿读数据
256 {
257 1 uchar i,temp=0;
258 1 io=1; //设置为输入口
259 1 for(i=7;i>0;i--)
260 1 {
261 2 sclk=0;
262 2 if(io==1)
263 2 temp=temp|0x80;
264 2 else
265 2 temp=temp&0x7f;
266 2 sclk=1; //产生下跳沿
267 2 temp=temp>>1;
268 2 }
269 1 return (temp);
270 1 }
271 //----------往ds1302的某个地址写入数据-------------
272 void write_ds1302(uchar cmd,uchar indata)
273 {
274 1 reset=1;
275 1 write_byte(cmd);
276 1 write_byte(indata);
277 1 reset=0;
278 1 sclk=0;
279 1 }
280 //----------读ds1302某地址的的数据-----------------
281 uchar read_ds1302(uchar addr)
282 {
283 1 uchar backdata;
284 1 reset=1;
285 1 write_byte(addr);
286 1 backdata=read_byte();//先写地址,然后读数据
287 1 reset=0;
288 1 sclk=0;
289 1 return (backdata);
290 1 }
291 //------------设置初始时间-------------------
292 void set_ds1302(uchar addr,uchar *p,uchar n)//写入n个数据
293 {
294 1 write_ds1302(0x8e,0x00);//写控制字,允许写操作
295 1 for(;n>0;n--)
296 1 {write_ds1302(addr,*p);
297 2 p++;
298 2 addr=addr+2;
299 2 }
300 1 write_ds1302(0x8e,0x80);//写保护,不允许写
301 1 }
302 //----------- 读取当前时间-------------------
303 void read_nowtime(uchar addr,uchar *p,uchar n)
C51 COMPILER V7.06 MAIN 05/03/2008 23:24:27 PAGE 6
304 {
305 1 for(;n>0;n--)
306 1 {
307 2 *p=read_ds1302(addr);
308 2 p++;
309 2 addr=addr+2;
310 2 }
311 1 }
312 void init_ds1302()
313 {
314 1 reset=0;
315 1 sclk=0;
316 1 write_ds1302(0x80,0x00);//写控制字,允许写
317 1 write_ds1302(0x90,0x00);//禁止涡流充电
318 1 }
319 //-----------ds1302模块结束-------------------
320
321
322 //- ----------公历转阴历结束-------------------
323 //LCD1602显示
324 void LCD1602_DISP(void)
325 {
326 1 uchar format=0;
327 1 if(SHEZHI[14]==0x0A)
328 1 {
329 2 flag_san_key=0;
330 2 set_ds1302(0x80,init,7);//设置初始时间,日期,年月
331 2 SHEZHI[14]=0x00;
332 2 for(format=0;format<14;format++)
333 2 {
334 3 SHEZHI[format]=0;
335 3 }
336 2
337 2 }
338 1
339 1 if(temp_OUT==0X0A)
340 1 {
341 2
342 2
343 2 read_nowtime(0x81,init,7); //读出当前时间,读出7个字节
344 2 //年
345 2 LCD_set_position(1);
346 2 LCD_printc(0X32);
347 2
348 2 LCD_set_position(2);
349 2 LCD_printc(0X30);
350 2
351 2 LCD_set_position(3);
352 2 LCD_printc(0X30+init[6]/16);
353 2
354 2 LCD_set_position(4);
355 2 LCD_printc(0X30+init[6]%16);
356 2
357 2 LCD_set_position(5);
358 2 LCD_prints(" ");
359 2 //月日
360 2
361 2 LCD_set_position(7);
362 2 LCD_printc(0X30+init[4]/16);
363 2 LCD_set_position(8);
364 2 LCD_printc(0X30+init[4]%16);
365 2
C51 COMPILER V7.06 MAIN 05/03/2008 23:24:27 PAGE 7
366 2 LCD_set_position(9);
367 2 LCD_prints("-");
368 2
369 2 LCD_set_position(10);
370 2 LCD_printc(0X30+init[3]/16);
371 2
372 2 LCD_set_position(11);
373 2 LCD_printc(0X30+init[3]%16);
374 2 LCD_set_position(12);
375 2 LCD_prints(" ");
376 2 //星期
377 2
378 2 LCD_set_position(14);
379 2 LCD_printc(0X30+init[5]%16);
380 2
381 2
382 2 //时分秒
383 2
384 2 LCD_set_position(0X4E);
385 2 LCD_printc(0X30+init[0]%16);
386 2
387 2 LCD_set_position(0X4D);
388 2 LCD_printc(0X30+init[0]/16);
389 2
390 2 LCD_set_position(0X4C);
391 2 LCD_prints(":");
392 2
393 2 LCD_set_position(0x4B);
394 2 LCD_printc(0X30+init[1]%16);
395 2
396 2 LCD_set_position(0x4a);
397 2 LCD_printc(0X30+init[1]/16);
398 2
399 2 LCD_set_position(0X49);
400 2 LCD_prints(":");
401 2
402 2 LCD_set_position(0X48);
403 2 LCD_printc(0X30+init[2]%16);
404 2 LCD_set_position(0X47);
405 2 LCD_printc(0X30+init[2]/16);
406 2 }
407 1 }
408
409
410
411 void main()
412
413 {
414 1 LCD_initial();
415 1 init_ds1302(); //初始化ds1302
416 1 set_ds1302(0x80,init,7);//设置初始时间,日期,年月
417 1
418 1 while(1)
419 1 {
420 2 DISP_DATA();
421 2 LCD1602_DISP();
422 2
423 2 }
424 1
425 1
426 1
427 1
C51 COMPILER V7.06 MAIN 05/03/2008 23:24:27 PAGE 8
428 1
429 1 }
430
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 966 ----
CONSTANT SIZE = 7 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 13
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -