📄 ad7109.lst
字号:
308 1 lcd_wrc(0x30);
309 1 lcd_wrc(0x01);
310 1 lcd_wrc(0x06);
311 1 lcd_wrc(0x0c);
312 1 delay(100);
313 1 }
314 void lcd_wrc(uchar com)
315 {
316 1 lcd_checkbusy();
317 1 rs = 0;
318 1 rw = 0;
319 1 e = 1;
320 1 P0 = com;
321 1 P0 = com;
322 1 delay(10);
323 1 e = 0;
324 1 }
325
326 void lcd_wrd(uchar dat)
327 {
328 1 lcd_checkbusy();
329 1 rs = 1;
330 1 rw = 0;
331 1 e = 1;
332 1 P0 = dat;
333 1 P0 = dat;
334 1 delay(5);
335 1 e = 0;
336 1 }
337 void lcd_checkbusy()
338 {
339 1 uchar busy;
340 1 P0 = 0XFF;
341 1 busy = P0;
342 1 if(busy>0x7f)
343 1 {
344 2 rs = 0;
345 2 rw = 1;
346 2 e = 1;
347 2 busy = P0;
348 2 e = 0;
349 2 delay(10);
350 2 }
351 1 }
352 uchar lcd_rdd();
353 void delay(unsigned int n)
354 {
355 1 while(n--);
356 1 }
357 void lcd_on()
358 {
359 1 lcd_deng = 0;
360 1 }
361 void lcd_off()
362 {
363 1 lcd_deng = 1;
364 1 }
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 7
365 uchar lcd_read_ac()
366 {
367 1 uchar dat;
368 1 // P0 = 0X00;
369 1 rs = 0;
370 1 rw = 1;
371 1 e = 1;
372 1 dat = P0;
373 1 dat = P0;
374 1 e = 0;
375 1 return(dat&0x7f);
376 1 }
377 void lcd_dis_num(uint dat)
378 {
379 1 uint a=0;
380 1 dat =dat%10000;
381 1 a =dat/1000;
382 1 lcd_wrd(0x30+a);
383 1 dat =dat%1000;
384 1 a =dat/100;
385 1 lcd_wrd(0x30+a);
386 1 dat =dat%100;
387 1 a=dat/10;
388 1 lcd_wrd(0x30+a);
389 1 dat =dat%10;
390 1 lcd_wrd(0x30+dat);
391 1 }
392 void lcd_dis_ch(uchar h,uchar l)
393 {
394 1 lcd_wrd(h);
395 1 lcd_wrd(l);
396 1 }
397
398 void lcd_add(uchar h,uchar l) //定位地址
399 {
400 1 l--;
401 1 switch(h)
402 1 {
403 2 case 1:
404 2 {
405 3 lcd_wrc(0x80+l);
406 3 break;
407 3 }
408 2 case 2:
409 2 {
410 3 lcd_wrc(0x90+l);
411 3 break;
412 3 }
413 2 case 3:
414 2 {
415 3 lcd_wrc(0x88+l);
416 3 break;
417 3 }
418 2 case 4:
419 2 {
420 3 lcd_wrc(0x98+l);
421 3 break;
422 3 }
423 2 }
424 1 }
425
426
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 8
427 unsigned char key_data() //判断键值
428 {
429 1 uchar a=0,b=0,c=0,d=0,i=0;
430 1 a = 0xef;
431 1 for(i = 0;i<4;i++) //读行
432 1 {
433 2 P1 = a;
434 2 delay(10);
435 2 b = P1;
436 2 b = b&0x0f;
437 2 // b = b>>4;
438 2 if(b!=0x0F) //表示有键按下
439 2 {
440 3 delay(200); //软件延时 确认有键按下
441 3 b = P1&0X0F;
442 3 // b = b>>4;
443 3 if(b != 0x0F)
444 3 {
445 4 // return b;
446 4
447 4 c=b;
448 4 if(c==0X07)
449 4 {
450 5 d=i*4+3;
451 5 }
452 4 else if(c==0X0B)
453 4 {
454 5 d=i*4+2;
455 5 }
456 4 else if(c==0X0D)
457 4 {
458 5 d=i*4+1;
459 5 }
460 4 else if(c==0X0E)
461 4 {
462 5 d=i*4;
463 5 }
464 4 break;
465 4 }
466 3 }
467 2 else
468 2 {
469 3 a = a<<1;
470 3 a = a+0x01;
471 3 if(a==0xFF)
472 3 {
473 4 // return 0x0f;
474 4 d = 0x0f+1;
475 4 break;
476 4 }
477 3 }
478 2 }
479 1 // d=d-1;
480 1 return d;
481 1
482 1
483 1
484 1 }
485
486
487 /*******************************************************************
488 起动总线函数
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 9
489 函数原型: void Start_I2c();
490 功能: 启动I2C总线,即发送I2C起始条件.
491
492 ********************************************************************/
493
494 void Start_I2c() //起动总线函数
495 {
496 1 SDA=1; //发送起始条件的数据信号
497 1 _Nop();
498 1 SCL=1;
499 1 _Nop(); //起始条件建立时间大于4.7us,延时
500 1 _Nop();
501 1 _Nop();
502 1 _Nop();
503 1 _Nop();
504 1 SDA=0; //发送起始信号
505 1 _Nop(); // 起始条件锁定时间大于4
506 1 _Nop();
507 1 _Nop();
508 1 _Nop();
509 1 _Nop();
510 1 SCL=0; //钳住I2C总线,准备发送或接收数据
511 1 _Nop();
512 1 _Nop();
513 1 }
514
515
516
517 /*******************************************************************
518 结束总线函数
519 函数原型: void Stop_I2c();
520 功能: 结束I2C总线,即发送I2C结束条件.
521
522 ********************************************************************/
523 void Stop_I2c() //结束总线函数
524 {
525 1 SDA=0; /*发送结束条件的数据信号*/
526 1 _Nop(); /*发送结束条件的时钟信号*/
527 1 SCL=1; /*结束条件建立时间大于4*/
528 1 _Nop();
529 1 _Nop();
530 1 _Nop();
531 1 _Nop();
532 1 _Nop();
533 1 SDA=1; /*发送I2C总线结束信号*/
534 1 _Nop();
535 1 _Nop();
536 1 _Nop();
537 1 _Nop();
538 1 }
539
540
541
542
543 /*******************************************************************
544 字节数据传送函数
545 函数原型: void SendByte(uchar c);
546 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
547 此状态位进行操作.(不应答或非应答都使ack=0 假)
548 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
549 ********************************************************************/
550 void SendByte(uchar c) //字节数据传送函数send
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 10
551 {
552 1 uchar BitCnt;
553 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
554 1 {
555 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
556 2 else SDA=0;
557 2 _Nop();
558 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
559 2 _Nop();
560 2 _Nop(); /*保证时钟高电平周期大于4*/
561 2 _Nop();
562 2 _Nop();
563 2 _Nop();
564 2 SCL=0;
565 2 }
566 1 _Nop();
567 1 _Nop();
568 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
569 1 _Nop();
570 1 _Nop();
571 1 SCL=1;
572 1 _Nop();
573 1 _Nop();
574 1 _Nop();
575 1 if(SDA==1)ack=0;
576 1 else ack=1; /*判断是否接收到应答信号*/
577 1 SCL=0;
578 1 _Nop();
579 1 _Nop();
580 1 }
581
582
583
584
585
586
587 /*******************************************************************
588 字节数据传送函数
589 函数原型: uchar RcvByte();
590 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
591 发完后请用应答函数。
592 ********************************************************************/
593 uchar RcvByte() //字节数据传送函数 receive
594 {
595 1 uchar retc;
596 1 uchar BitCnt;
597 1 retc=0;
598 1 SDA=1; /*置数据线为输入方式*/
599 1 for(BitCnt=0;BitCnt<8;BitCnt++)
600 1 {
601 2 _Nop();
602 2 SCL=0; /*置时钟线为低,准备接收数据位*/
603 2 _Nop();
604 2 _Nop(); /*时钟低电平周期大于4.7μs*/
605 2 _Nop();
606 2 _Nop();
607 2 _Nop();
608 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
609 2 _Nop();
610 2 _Nop();
611 2 retc=retc<<1;
612 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
C51 COMPILER V7.07 AD7109 02/27/2007 10:02:55 PAGE 11
613 2 _Nop();
614 2 _Nop();
615 2 }
616 1 SCL=0;
617 1 _Nop();
618 1 _Nop();
619 1 return(retc);
620 1 }
621
622
623
624
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -