📄 ds1307.lst
字号:
268 3 {
269 4 v = 15;
270 4 lcd_dis_num(v);
271 4 break;
272 4 }
273 3 default:
274 3 // case 16:
275 3 {
276 4 v = 16;
277 4 lcd_dis_num(v);
278 4 break;
279 4 }
280 3 }
281 2
282 2
283 2 }
284 1 }
285
286
287 void lcd_ini()
288 {
289 1 delay(100);
290 1 lcd_wrc(0x34);
291 1 lcd_wrc(0x30);
292 1 lcd_wrc(0x01);
293 1 lcd_wrc(0x06);
294 1 lcd_wrc(0x0c);
295 1 delay(100);
296 1 }
297 void lcd_wrc(uchar com)
298 {
299 1 lcd_checkbusy();
300 1 rs = 0;
301 1 rw = 0;
302 1 e = 1;
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 6
303 1 P0 = com;
304 1 P0 = com;
305 1 delay(10);
306 1 e = 0;
307 1 }
308
309 void lcd_wrd(uchar dat)
310 {
311 1 lcd_checkbusy();
312 1 rs = 1;
313 1 rw = 0;
314 1 e = 1;
315 1 P0 = dat;
316 1 P0 = dat;
317 1 delay(5);
318 1 e = 0;
319 1 }
320 void lcd_checkbusy()
321 {
322 1 uchar busy;
323 1 P0 = 0XFF;
324 1 busy = P0;
325 1 if(busy>0x7f)
326 1 {
327 2 rs = 0;
328 2 rw = 1;
329 2 e = 1;
330 2 busy = P0;
331 2 e = 0;
332 2 delay(10);
333 2 }
334 1 }
335 uchar lcd_rdd();
336 void delay(uchar n)
337 {
338 1 while(n--);
339 1 }
340 void lcd_on()
341 {
342 1 lcd_deng = 0;
343 1 }
344 void lcd_off()
345 {
346 1 lcd_deng = 1;
347 1 }
348 uchar lcd_read_ac()
349 {
350 1 uchar dat;
351 1 // P0 = 0X00;
352 1 rs = 0;
353 1 rw = 1;
354 1 e = 1;
355 1 dat = P0;
356 1 dat = P0;
357 1 e = 0;
358 1 return(dat&0x7f);
359 1 }
360 void lcd_dis_num(uint dat)
361 {
362 1 uint a=0;
363 1 dat =dat%10000;
364 1 a =dat/1000;
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 7
365 1 lcd_wrd(0x30+a);
366 1 dat =dat%1000;
367 1 a =dat/100;
368 1 lcd_wrd(0x30+a);
369 1 dat =dat%100;
370 1 a=dat/10;
371 1 lcd_wrd(0x30+a);
372 1 dat =dat%10;
373 1 lcd_wrd(0x30+dat);
374 1 }
375 void lcd_dis_ch(uchar h,uchar l)
376 {
377 1 lcd_wrd(h);
378 1 lcd_wrd(l);
379 1 }
380
381 void lcd_add(uchar h,uchar l) //定位地址
382 {
383 1 l--;
384 1 switch(h)
385 1 {
386 2 case 1:
387 2 {
388 3 lcd_wrc(0x80+l);
389 3 break;
390 3 }
391 2 case 2:
392 2 {
393 3 lcd_wrc(0x90+l);
394 3 break;
395 3 }
396 2 case 3:
397 2 {
398 3 lcd_wrc(0x88+l);
399 3 break;
400 3 }
401 2 case 4:
402 2 {
403 3 lcd_wrc(0x98+l);
404 3 break;
405 3 }
406 2 }
407 1 }
408
409
410 unsigned char key_data() //判断键值
411 {
412 1 uchar a=0,b=0,c=0,d=0,i=0;
413 1 a = 0xef;
414 1 for(i = 0;i<4;i++) //读行
415 1 {
416 2 P1 = a;
417 2 delay(10);
418 2 b = P1;
419 2 b = b&0x0f;
420 2 // b = b>>4;
421 2 if(b!=0x0F) //表示有键按下
422 2 {
423 3 delay(200); //软件延时 确认有键按下
424 3 b = P1&0X0F;
425 3 // b = b>>4;
426 3 if(b != 0x0F)
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 8
427 3 {
428 4 // return b;
429 4
430 4 c=b;
431 4 if(c==0X07)
432 4 {
433 5 d=i*4+3;
434 5 }
435 4 else if(c==0X0B)
436 4 {
437 5 d=i*4+2;
438 5 }
439 4 else if(c==0X0D)
440 4 {
441 5 d=i*4+1;
442 5 }
443 4 else if(c==0X0E)
444 4 {
445 5 d=i*4;
446 5 }
447 4 break;
448 4 }
449 3 }
450 2 else
451 2 {
452 3 a = a<<1;
453 3 a = a+0x01;
454 3 if(a==0xFF)
455 3 {
456 4 // return 0x0f;
457 4 d = 0x0f+1;
458 4 break;
459 4 }
460 3 }
461 2 }
462 1 // d=d-1;
463 1 return d;
464 1
465 1
466 1
467 1 }
468
469
470 /*******************************************************************
471 起动总线函数
472 函数原型: void Start_I2c();
473 功能: 启动I2C总线,即发送I2C起始条件.
474
475 ********************************************************************/
476
477 void Start_I2c() //起动总线函数
478 {
479 1 SDA=1; //发送起始条件的数据信号
480 1 _Nop();
481 1 SCL=1;
482 1 _Nop(); //起始条件建立时间大于4.7us,延时
483 1 _Nop();
484 1 _Nop();
485 1 _Nop();
486 1 _Nop();
487 1 SDA=0; //发送起始信号
488 1 _Nop(); // 起始条件锁定时间大于4
C51 COMPILER V7.07 DS1307 02/27/2007 10:08:54 PAGE 9
489 1 _Nop();
490 1 _Nop();
491 1 _Nop();
492 1 _Nop();
493 1 SCL=0; //钳住I2C总线,准备发送或接收数据
494 1 _Nop();
495 1 _Nop();
496 1 }
497
498
499
500 /*******************************************************************
501 结束总线函数
502 函数原型: void Stop_I2c();
503 功能: 结束I2C总线,即发送I2C结束条件.
504
505 ********************************************************************/
506 void Stop_I2c() //结束总线函数
507 {
508 1 SDA=0; /*发送结束条件的数据信号*/
509 1 _Nop(); /*发送结束条件的时钟信号*/
510 1 SCL=1; /*结束条件建立时间大于4*/
511 1 _Nop();
512 1 _Nop();
513 1 _Nop();
514 1 _Nop();
515 1 _Nop();
516 1 SDA=1; /*发送I2C总线结束信号*/
517 1 _Nop();
518 1 _Nop();
519 1 _Nop();
520 1 _Nop();
521 1 }
522
523
524
525
526 /*******************************************************************
527 字节数据传送函数
528 函数原型: void SendByte(uchar c);
529 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
530 此状态位进行操作.(不应答或非应答都使ack=0 假)
531 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
532 ********************************************************************/
533 void SendByte(uchar c) //字节数据传送函数send
534 {
535 1 uchar BitCnt;
536 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
537 1 {
538 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
539 2 else SDA=0;
540 2 _Nop();
541 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
542 2 _Nop();
543 2 _Nop(); /*保证时钟高电平周期大于4*/
544 2 _Nop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -