📄 pcf8591-da-lcd1602-c51.lst
字号:
322 // 返回接收的数据
323 // 函数功能: 接收一字节子程序
324 //-------------------------------------------------------------------
325 uchar IICreceiveByte(void)
326 {
327 1 uchar idata n=8; // 从SDA线上读取一上数据字节,共八位
328 1 uchar tdata=0;
329 1 while(n--)
330 1 {
331 2 SDA = 1;
332 2 SCL = 1;
333 2 tdata =tdata<<1; //左移一位
334 2 if(SDA == 1)
335 2 tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
336 2 else
337 2 tdata = tdata&0xfe; // 否则数据的最后一位置0
338 2 SCL = 0;
339 2 }
340 1
341 1 return(tdata);
342 1 }
343 //-------------------------------------------------------------------
344 // 函数名称: DAC_PCF8591
345 // 入口参数: slave_add从机地址,n要发送的数据个数
346 // 函数功能: 发送n位数据子程序
347 //-------------------------------------------------------------------
348 void DAC_PCF8591(uchar controlbyte)
349 {
350 1
351 1 iic_start(); // 启动I2C
352 1 delayNOP();
353 1
354 1 IICSendByte(PCF8591_WRITE); // 发送地址位
355 1 check_ACK(); // 检查应答位
356 1 if(flag == 1)
357 1 {
358 2 SystemError = 1;
359 2 return; // 若非应答,置错误标志位
360 2 }
361 1 IICSendByte(controlbyte&0x77); //Control byte
362 1 check_ACK(); //检查应答位
363 1 if(flag == 1)
364 1 {
365 2 SystemError = 1;
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 7
366 2 return; // 若非应答,置错误标志位
367 2 }
368 1 }
369
370 //-------------------------------------------------------------------
371 // 函数名称: ADC_PCF8591
372 // 入口参数: controlbyte控制字
373 // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
374 //-------------------------------------------------------------------
375 /*
376 void ADC_PCF8591(uchar controlbyte)
377 {
378 uchar idata i; //,receive_da;
379
380 iic_start();
381
382 IICSendByte(PCF8591_WRITE); //控制字
383 check_ACK();
384 if(flag == 1)
385 {
386 SystemError = 1;
387 return;
388 }
389
390 IICSendByte(controlbyte); //控制字
391 check_ACK();
392 if(flag == 1)
393 {
394 SystemError = 1;
395 return;
396 }
397
398 iic_start(); //重新发送开始命令
399 IICSendByte(PCF8591_READ); //控制字
400 check_ACK();
401 if(flag == 1)
402 {
403 SystemError = 1;
404 return;
405 }
406
407 IICreceiveByte(); //空读一次,调整读顺序
408 slave_ACK(); //收到一个字节后发送一个应答位
409
410 // while(i<4)
411 for(i=0;i<4;i++)
412 {
413 // receive_da=IICreceiveByte();
414 // receivebuf[i]=receive_da;
415 receivebuf[i] = IICreceiveByte();
416 slave_ACK(); //收到一个字节后发送一个应答位
417 }
418 slave_NOACK(); //收到最后一个字节后发送一个非应答位
419 iic_stop();
420 }*/
421
422 /*********************************************************
423 输出三角波
424 *********************************************************/
425 void Triangle()
426 {
427 1 uchar l;
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 8
428 1 for(l=0;l<255;l++)
429 1 {
430 2 IICSendByte(l); //data byte
431 2 check_ACK(); //检查应答位
432 2 if(flag == 1)
433 2 {
434 3 SystemError = 1;
435 3 return; //置错误标志位SystemError
436 3 }
437 2 }
438 1
439 1 for(l=255;l>1;l--)
440 1 {
441 2 IICSendByte(l); //data byte
442 2 check_ACK(); //检查应答位
443 2 if(flag == 1)
444 2 {
445 3 SystemError = 1;
446 3 return; //置错误标志位SystemError
447 3 }
448 2 }
449 1 }
450
451 /*********************************************************
452 输出方波函数
453 *********************************************************/
454 void Square()
455 {
456 1 IICSendByte(N); //data byte
457 1 check_ACK(); //检查应答位
458 1 if(flag == 1)
459 1 {
460 2 SystemError = 1;
461 2 return; //置错误标志位SystemError
462 2 }
463 1 delay(15);
464 1 N=~N;
465 1 }
466
467 /*********************************************************
468 输出正弦波函数
469 *********************************************************/
470 void sin()
471 {
472 1 uint i;
473 1 for(i=0; i<256; i++)
474 1 {
475 2 IICSendByte(sin_tab[i]); //data byte
476 2 check_ACK(); //检查应答位
477 2 if(flag == 1)
478 2 {
479 3 SystemError = 1;
480 3 return; //置错误标志位SystemError
481 3 }
482 2 }
483 1
484 1 }
485
486 /*********************************************************
487 输出锯齿波函数
488 *********************************************************/
489 void Sawtooth()
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 9
490 {
491 1 uchar l;
492 1 for(l=0;l<255;l++)
493 1 {
494 2 IICSendByte(l); //data byte
495 2 check_ACK(); //检查应答位
496 2 if(flag == 1)
497 2 {
498 3 SystemError = 1;
499 3 return; //置错误标志位SystemError
500 3 }
501 2 }
502 1 }
503
504 /*********************************************************
505 功能健函数
506 *********************************************************/
507 void keyscan()
508 {
509 1 uchar m;
510 1 if((K2==0)&(!START)) //启动输出后,屏蔽K2健
511 1 {
512 2 k_count++;
513 2 beep();
514 2 switch (k_count)
515 2 {
516 3 case 1:
517 3 lcd_pos(0x00);
518 3 for(m=0;m<16;m++)
519 3 lcd_wdat(dis2[m]);
520 3
521 3 lcd_pos(0x40);
522 3 for(m=0;m<16;m++)
523 3 lcd_wdat(dis5[m]);
524 3 out1=1;
525 3 out4=0;
526 3 break;
527 3
528 3 case 2:
529 3 lcd_pos(0x40);
530 3 for(m=0;m<16;m++)
531 3 lcd_wdat(dis6[m]);
532 3 out1=0;
533 3 out2=1;
534 3 break;
535 3
536 3 case 3:
537 3 lcd_pos(0x40);
538 3 for(m=0;m<16;m++)
539 3 lcd_wdat(dis7[m]);
540 3 out2=0;
541 3 out3=1;
542 3
543 3 break;
544 3
545 3 case 4:
546 3 lcd_pos(0x40);
547 3 for(m=0;m<16;m++)
548 3 lcd_wdat(dis8[m]);
549 3 k_count=0;
550 3 out3=0;
551 3 out4=1;
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 10
552 3 break;
553 3
554 3 default:
555 3 out4=0; out3=0; out2=0; out1=0;
556 3 break;
557 3 }
558 2 }
559 1
560 1 if(K3==0) //启动输出
561 1 {
562 2 START=1;
563 2 beep();
564 2 }
565 1
566 1 if(K4==0) //停止输出
567 1 {
568 2 START=0;
569 2 beep();
570 2 }
571 1 }
572
573 /*******************************************************************/
574 /* */
575 /* 主函数 */
576 /* */
577 /*******************************************************************/
578 main()
579 {
580 1 uchar i;
581 1 delay(10); //延时
582 1 lcd_init(); //初始化LCD
583 1
584 1 lcd_pos(0); //设置显示位置为第一行
585 1 for(i=0;i<16;i++)
586 1 lcd_wdat(dis1[i]); //显示字符
587 1
588 1
589 1 lcd_pos(0x40); //设置显示位置为第二行
590 1 for(i=0;i<16;i++)
591 1 lcd_wdat(dis2[i]); //显示字符
592 1
593 1 delay(1500);
594 1
595 1 lcd_pos(0); //设置显示位置为第一行
596 1 for(i=0;i<16;i++)
597 1 lcd_wdat(dis3[i]); //显示字符
598 1
599 1 lcd_pos(0x40); //设置显示位置为第二行
600 1 for(i=0;i<16;i++)
601 1 lcd_wdat(dis4[i]); //显示字符
602 1
603 1 DAC_PCF8591(0x40);
604 1
605 1 while(1)
606 1 {
607 2 keyscan();
608 2
609 2 while(out1&START)
610 2 {
611 3 sin(); //输出正弦波
612 3 keyscan();
613 3 }
C51 COMPILER V8.18 PCF8591_DA_LCD1602_C51 01/04/2010 16:31:41 PAGE 11
614 2
615 2 while(out2&START)
616 2 {
617 3 Square(); //输出方波
618 3 keyscan();
619 3 }
620 2
621 2 while(out3&START)
622 2 {
623 3 Triangle(); //输出三角波
624 3 keyscan();
625 3 }
626 2
627 2 while(out4&START)
628 2 {
629 3 Sawtooth(); //输出锯齿波
630 3 keyscan();
631 3 }
632 2 }
633 1 }
634
635 //*********************************************************
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 882 ----
CONSTANT SIZE = 392 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 1
IDATA SIZE = 4 2
BIT SIZE = 7 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -