shtxx_self.lst
来自「这是单片机驱动温湿度传感器SHT11温湿度传感器的源代码」· LST 代码 · 共 1,493 行 · 第 1/5 页
LST
1,493 行
570 1 lcd_wrd(0x30+a);
571 1 dat =dat%10;
572 1 lcd_wrd(0x30+dat);
573 1 */
574 1 }
575
576 void lcd_dis_ch(uchar h,uchar l)
577 {
578 1 lcd_wrd(h);
579 1 lcd_wrd(l);
580 1 }
581
582 void lcd_add(uchar h,uchar l) //定位地址
583 {
584 1 l--;
585 1 switch(h)
586 1 {
587 2 case 1:
588 2 {
589 3 lcd_wrc(0x80+l);
590 3 break;
591 3 }
592 2 case 2:
593 2 {
594 3 lcd_wrc(0x90+l);
595 3 break;
596 3 }
597 2 case 3:
598 2 {
599 3 lcd_wrc(0x88+l);
600 3 break;
601 3 }
602 2 case 4:
603 2 {
604 3 lcd_wrc(0x98+l);
605 3 break;
606 3 }
607 2 }
608 1 }
609
610
611
C51 COMPILER V7.07 SHTXX_SELF 06/14/2007 21:21:35 PAGE 11
612 unsigned char key_data() //判断键值
613 {
614 1 uchar a=0,b=0,c=0,d=0,i=0;
615 1 a = 0xef;
616 1 for(i = 0;i<4;i++) //读行
617 1 {
618 2 P1 = a;
619 2 delay(10);
620 2 b = P1;
621 2 b = b&0x0f;
622 2 // b = b>>4;
623 2 if(b!=0x0F) //表示有键按下
624 2 {
625 3 delay(50); //软件延时 确认有键按下
626 3 b = P1&0X0F;
627 3 // b = b>>4;
628 3 if(b != 0x0F)
629 3 {
630 4 // return b;
631 4
632 4 c=b;
633 4 if(c==0X07)
634 4 {
635 5 d=i*4+3;
636 5 }
637 4 else if(c==0X0B)
638 4 {
639 5 d=i*4+2;
640 5 }
641 4 else if(c==0X0D)
642 4 {
643 5 d=i*4+1;
644 5 }
645 4 else if(c==0X0E)
646 4 {
647 5 d=i*4;
648 5 }
649 4 break;
650 4 }
651 3 }
652 2 else
653 2 {
654 3 a = a<<1;
655 3 a = a+0x01;
656 3 if(a==0xFF)
657 3 {
658 4 // return 0x0f;
659 4 d = 0x0f+1;
660 4 break;
661 4 }
662 3 }
663 2 }
664 1 return d;
665 1 }
666
667
668
669 void Start_I2c() //起动总线函数
670 {
671 1 SDA=1; //发送起始条件的数据信号
672 1 _Nop();
673 1 SCL=1;
C51 COMPILER V7.07 SHTXX_SELF 06/14/2007 21:21:35 PAGE 12
674 1 _Nop(); //起始条件建立时间大于4.7us,延时
675 1 _Nop();
676 1 _Nop();
677 1 _Nop();
678 1 _Nop();
679 1 SDA=0; //发送起始信号
680 1 _Nop(); // 起始条件锁定时间大于4
681 1 _Nop();
682 1 _Nop();
683 1 _Nop();
684 1 _Nop();
685 1 SCL=0; //钳住I2C总线,准备发送或接收数据
686 1 _Nop();
687 1 _Nop();
688 1 }
689
690 void Stop_I2c() //结束总线函数
691 {
692 1 SDA=0; /*发送结束条件的数据信号*/
693 1 _Nop(); /*发送结束条件的时钟信号*/
694 1 SCL=1; /*结束条件建立时间大于4*/
695 1 _Nop();
696 1 _Nop();
697 1 _Nop();
698 1 _Nop();
699 1 _Nop();
700 1 SDA=1; /*发送I2C总线结束信号*/
701 1 _Nop();
702 1 _Nop();
703 1 _Nop();
704 1 _Nop();
705 1 }
706
707
708
709 void SendByte(uchar c) //字节数据传送函数send
710 {
711 1 uchar BitCnt;
712 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
713 1 {
714 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
715 2 else SDA=0;
716 2 _Nop();
717 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
718 2 _Nop();
719 2 _Nop(); /*保证时钟高电平周期大于4*/
720 2 _Nop();
721 2 _Nop();
722 2 _Nop();
723 2 SCL=0;
724 2 }
725 1 _Nop();
726 1 _Nop();
727 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
728 1 _Nop();
729 1 _Nop();
730 1 SCL=1;
731 1 _Nop();
732 1 _Nop();
733 1 _Nop();
734 1 if(SDA==1)ack=0;
735 1 else ack=1; /*判断是否接收到应答信号*/
C51 COMPILER V7.07 SHTXX_SELF 06/14/2007 21:21:35 PAGE 13
736 1 SCL=0;
737 1 _Nop();
738 1 _Nop();
739 1 }
740
741
742 uchar RcvByte() //字节数据传送函数 receive
743 {
744 1 uchar retc;
745 1 uchar BitCnt;
746 1 retc=0;
747 1 SDA=1; /*置数据线为输入方式*/
748 1 for(BitCnt=0;BitCnt<8;BitCnt++)
749 1 {
750 2 _Nop();
751 2 SCL=0; /*置时钟线为低,准备接收数据位*/
752 2 _Nop();
753 2 _Nop(); /*时钟低电平周期大于4.7μs*/
754 2 _Nop();
755 2 _Nop();
756 2 _Nop();
757 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
758 2 _Nop();
759 2 _Nop();
760 2 retc=retc<<1;
761 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
762 2 _Nop();
763 2 _Nop();
764 2 }
765 1 SCL=0;
766 1 _Nop();
767 1 _Nop();
768 1 return(retc);
769 1 }
770
771
772 void Ack_I2c(bit a) //主控器进行应答信号
773 {
774 1
775 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
776 1 else SDA=1;
777 1 _Nop();
778 1 _Nop();
779 1 _Nop();
780 1 SCL=1;
781 1 _Nop();
782 1 _Nop(); //时钟低电平周期大于4μ
783 1 _Nop();
784 1 _Nop();
785 1 _Nop();
786 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
787 1 _Nop();
788 1 _Nop();
789 1 }
790 //bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件发送多字节数据函数
791 //子地址为8位的数据传送
792 bit ISendStr_8(uchar add,uchar son_add,uchar dat) //向子地址为8位的器件发送多字节数据函数
793 {
794 1 Start_I2c(); /*启动总线*/
795 1 SendByte(add); /*发送器件地址*/
796 1 if(ack==0)return(0);
797 1 SendByte(son_add); /*发送器件子地址*/
C51 COMPILER V7.07 SHTXX_SELF 06/14/2007 21:21:35 PAGE 14
798 1 if(ack==0)return(0);
799 1 SendByte(dat); /*发送数据*/
800 1 if(ack==0)return(0);
801 1 Stop_I2c(); /*结束总线*/
802 1 return(1);
803 1 }
804 //子地址为16位的数据传送
805 bit ISendStr_16(uchar add,uint son_add,uchar dat) //向子地址为16位的器件发送多字节数据函数
806 {
807 1 Start_I2c(); /*启动总线*/
808 1 SendByte(add); /*发送器件地址*/
809 1 if(ack==0)return(0);
810 1 SendByte(son_add/256); /*发送器件子地址*/
811 1 if(ack==0)return(0);
812 1 SendByte(son_add%256); /*发送器件子地址*/
813 1 if(ack==0)return(0);
814 1 SendByte(dat); /*发送数据*/
815 1 if(ack==0)return(0);
816 1 Stop_I2c(); /*结束总线*/
817 1 return(1);
818 1 }
819
820
821
822 //bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) //向有子地址器件读取多字节数据函数
823 //子地址为8位的数据传送
824 uchar IRcvStr_8(uchar add,uchar son_add) //向子地址为8位的器件读取多字节数据函数
825 {
826 1
827 1 uchar i;
828 1 Start_I2c(); /*启动总线*/
829 1 SendByte(add); /*发送器件地址*/
830 1 SendByte(son_add); /*发送器件子地址2*/
831 1 Start_I2c();
832 1 SendByte(add+0x01);
833 1 i=RcvByte();
834 1 Ack_I2c(1); /*发送非应位*/
835 1 Stop_I2c(); /*结束总线*/
836 1 return (i);
837 1 }
838 //子地址为16位的数据传送
839 uchar IRcvStr_16(uchar add,uint son_add) //向子地址为16位的器件读取多字节数据函数
840 {
841 1
842 1 uchar i;
843 1 Start_I2c(); /*启动总线*/
844 1 SendByte(add); /*发送器件地址*/
845 1 SendByte(son_add/256); /*发送器件子地址1*/
846 1 SendByte(son_add%256); /*发送器件子地址2*/
847 1 Start_I2c();
848 1 SendByte(add+0x01);
849 1 i=RcvByte();
850 1 Ack_I2c(1); /*发送非应位*/
851 1 Stop_I2c(); /*结束总线*/
852 1 return (i);
853 1 }
854
855 //----------------------------------------------------------------------------------
856 char s_write_byte(unsigned char value)
857 //----------------------------------------------------------------------------------
858 // writes a byte on the Sensibus and checks the acknowledge
859 {
C51 COMPILER V7.07 SHTXX_SELF 06/14/2007 21:21:35 PAGE 15
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?