找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3252|回复: 7
收起左侧

怎样使用IIC协议控制传感器上的内容在1602显示屏上显示出来

[复制链接]
ID:389122 发表于 2018-8-24 16:21 | 显示全部楼层 |阅读模式
   刚开始接触这方面内容,看了几遍IIC协议的内容,还是处于一种似懂非懂的状态,想请教一下有没有大神能给我一个使用IIC协议控制1602显示屏显示传感器中的内容     传感器是温湿度传感器  谢谢啦
回复

使用道具 举报

ID:339112 发表于 2018-8-24 19:31 | 显示全部楼层
我有个PCF加LCD显示的,PCF是IIC通信的AD转换芯片
回复

使用道具 举报

ID:164602 发表于 2018-8-25 07:58 | 显示全部楼层
温湿度传感器的程序网上很多啊。
这里共享一个DHT11的程序,它是用串口传数据的,你自己改改,让1602显示好了。
//****************************************************************//
//           DHT21使用范例
//单片机 AT89S52 或 STC89C52RC
//功能   串口发送温湿度数据 晶振 11.0592M 波特率 9600
//硬件   P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑
//公司  雁凌电子   
//****************************************************************//

#include <reg51.h>
#include <intrins.h>
//
typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */
typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           无符号16位整型变量 */
typedef signed   int   S16;      /* defined for signed 16-bits integer variable           有符号16位整型变量 */
typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable           无符号32位整型变量 */
typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符号32位整型变量 */
typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define   Data_0_time    4

//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit  P2_0  = P2^0 ;

//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8  U8FLAG,k;
U8  U8count,U8temp;
U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8  U8comdata;
U8  outdata[5];  //定义发送的字节数          
U8  indata[5];
U8  count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
{
        outdata[0] = a[0];
        outdata[1] = a[1];
        outdata[2] = a[2];
        outdata[3] = a[3];
        outdata[4] = a[4];
        count = 1;
        SBUF=outdata[0];
}

       void Delay(U16 j)
    {      U8 i;
            for(;j>0;j--)
          {        
                for(i=0;i<27;i++);

          }
    }
      void  Delay_10us(void)
      {
        U8 i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;

       }
       
        void  COM(void)
      {
     
                U8 i;
         
       for(i=0;i<8;i++)          
            {
               
                       U8FLAG=2;       
                   while((!P2_0)&&U8FLAG++);
                        Delay_10us();
            Delay_10us();                               
            Delay_10us();
                          U8temp=0;
             if(P2_0)U8temp=1;
                    U8FLAG=2;
                 while((P2_0)&&U8FLAG++);
                   //超时则跳出for循环                  
                    if(U8FLAG==1)break;
                   //判断数据位是0还是1         
                     
                // 如果高电平高过预定0高电平值则数据位为 1
                    
                   U8comdata<<=1;
                      U8comdata|=U8temp;        //0
             }//rof
          
        }

        //--------------------------------
        //-----湿度读取子程序 ------------
        //--------------------------------
        //----以下变量均为全局变量--------
        //----温度高8位== U8T_data_H------
        //----温度低8位== U8T_data_L------
        //----湿度高8位== U8RH_data_H-----
        //----湿度低8位== U8RH_data_L-----
        //----校验 8位 == U8checkdata-----
        //----调用相关子程序如下----------
        //---- Delay();, Delay_10us();,COM();
        //--------------------------------

        void RH(void)
        {
          //主机拉低18ms
       P2_0=0;
           Delay(180);
           P2_0=1;
         //总线由上拉电阻拉高 主机延时20us
           Delay_10us();
           Delay_10us();
       Delay_10us();
           Delay_10us();            
         //主机设为输入 判断从机响应信号
           P2_0=1;
         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
           if(!P2_0)                 //T !          
           {
           U8FLAG=2;
         //判断从机是否发出 80us 的低电平响应信号是否结束         
           while((!P2_0)&&U8FLAG++);
           U8FLAG=2;
         //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
           while((P2_0)&&U8FLAG++);
         //数据接收状态                 
           COM();
           U8RH_data_H_temp=U8comdata;
           COM();
           U8RH_data_L_temp=U8comdata;
           COM();
           U8T_data_H_temp=U8comdata;
           COM();
           U8T_data_L_temp=U8comdata;
           COM();
           U8checkdata_temp=U8comdata;
           P2_0=1;
         //数据校验
         
           U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
           if(U8temp==U8checkdata_temp)
           {
                     U8RH_data_H=U8RH_data_H_temp;
                     U8RH_data_L=U8RH_data_L_temp;
                  U8T_data_H=U8T_data_H_temp;
                     U8T_data_L=U8T_data_L_temp;
                     U8checkdata=U8checkdata_temp;
           }//fi
           }//fi

        }
       
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz         串口发
//送温湿度数据,波特率 9600
//----------------------------------------------
void main()
{       
        //uchar str[6]={"RS232"};
        /* 系统初始化 */
        TMOD = 0x20;          //定时器T1使用工作方式2
        TH1 = 253;        // 设置初值
        TL1 = 253;
        TR1 = 1;          // 开始计时
        SCON = 0x50;          //工作方式1,波特率9600bps,允许接收   
        ES = 1;
        EA = 1;           // 打开所以中断   
        TI = 0;
        RI = 0;
        SendData(str) ;   //发送到串口
        Delay(10);         //延时100US(12M晶振)
        while(1)
        {  

           //------------------------
           //调用温湿度读取子程序
           RH();
           //串口显示程序
           //--------------------------

           str[0]=U8RH_data_H;
           str[1]=U8RH_data_L;
           str[2]=U8T_data_H;
           str[3]=U8T_data_L;
           str[4]=U8checkdata;
      
       SendData(str) ;  //发送到串口  
           //读取模块数据周期不宜小于 2S
           Delay(20000);
        }//elihw
       
}// main

void RSINTR() interrupt 4 using 2
{
        U8 InPut3;
        if(TI==1) //发送中断          
        {
                TI=0;
                if(count!=5) //发送完5位数据         
                {
                        SBUF= outdata[count];
                        count++;
                }
        }

        if(RI==1)         //接收中断                  
        {       
                InPut3=SBUF;
                indata[count_r]=InPut3;
                count_r++;
                RI=0;                                                                 
                if (count_r==5)//接收完4位数据
                {
                //数据接收完毕处理。
                        count_r=0;
                str[0]=indata[0];
                 str[1]=indata[1];
                   str[2]=indata[2];
                         str[3]=indata[3];
                                 str[4]=indata[4];
                                 P0=0;
                }
        }
}

回复

使用道具 举报

ID:389122 发表于 2018-8-25 18:28 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-8-25 07:58
温湿度传感器的程序网上很多啊。
这里共享一个DHT11的程序,它是用串口传数据的,你自己改改,让1602显示 ...

好的 谢谢
回复

使用道具 举报

ID:389122 发表于 2018-8-25 18:29 | 显示全部楼层
DRKVIN 发表于 2018-8-24 19:31
我有个PCF加LCD显示的,PCF是IIC通信的AD转换芯片

emmmmm  我没学AD
回复

使用道具 举报

ID:155507 发表于 2018-8-25 21:04 | 显示全部楼层
是在LCD1602之外再加入一个PCF8574,利用8574的串并转换功能模拟操作1602。
这样连接的1602必须采用4位收发的工作模式。
连接方式是,
RS -> D0
R/W -> D1
E(CS) -> D2
背光 -> D3
D4-D7同名端连接。

驱动程序,我写的是把4位数据传输3遍,第一遍和第三遍让E为低电平,第二遍E为高电平,就模仿了写入数据。
还没有写出读BF信号的部分,想先写入一个0XF7,把D7拉高,反正E没升高就不会有信息窜到1602里面。然后再把R/W拉高写一遍那个读BF的指令,再读8574的端口。过程有点麻烦。试试看吧。

回复

使用道具 举报

ID:155507 发表于 2018-8-25 21:12 | 显示全部楼层
  1. /*
  2. STC15单片机驱动iic注意事项
  3. 最近一个月在开发项目,用到的MCU是stc15,发现驱动iic的时候需要将io口设置成开漏输出才能稳定读取iic数据,如果设置成弱上拉就会掉数据。
  4. 于是我查了查开漏输出是怎么一回事,因为以前用AVR芯片的时候都是设置成弱上拉模式,但是STC15的单片机有点不一样。

  5. 在写字节函数里面需要加这么一句
  6.          
  7.                                  while(scl==0);

  8. 原因是主机发时钟给从机的时候,需要判断从机是否接受到这个信号,所以就要等
  9. */

  10. #include <reg52.h>
  11. #include <intrins.h>
  12. sbit SCL = P3^0;
  13. sbit SDA = P3^1;
  14. bit ack;
  15.   // P0 P1 P2 P3 P4 P5 P6 P7  PCF8574
  16.   // RS RW E  <> D4 D5 D6 D7
  17.   //  6  5  4  7  0  1  2  3  
  18.   
  19. //sbit RS=P2^0;
  20. //sbit Rw=P2^1;
  21. //sbit E =P2^2;
  22. sbit button1 =P1^0;

  23. unsigned char LCD_data;
  24. unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
  25. /*
  26. bt0=date&0x01;
  27. bt1=date&0x02;
  28. bt2=date&0x04;
  29. bt3=date&0x08;
  30. bt4=date&0x10;
  31. bt5=date&0x20;
  32. bt6=date&0x40;
  33. bt7=date&0x80;
  34. */
  35. //*****************延时************************
  36. void delay_nus(unsigned int n) //N us延时函数
  37. {
  38.   unsigned int i=0;
  39.   for (i=0;i<n;i++)
  40.   _nop_();
  41. }
  42. void delay_nms(unsigned int n) //N ms延时函数
  43. {
  44.   unsigned int i,j;
  45.   for (i=0;i<n;i++)
  46.   for (j=0;j<1140;j++);
  47. }

  48. void nop4()
  49. {
  50.   _nop_();     //等待一个机器周期
  51.   _nop_();     //等待一个机器周期
  52.   _nop_();     //等待一个机器周期
  53.   _nop_();     //等待一个机器周期
  54. }
  55. //***************************************88
  56. void Start()
  57. {
  58.   SDA=1;
  59.   _nop_();
  60.   SCL=1;
  61.   nop4();
  62.   SDA=0;
  63.   nop4();
  64.   SCL=0;
  65.   _nop_();
  66.   _nop_();
  67. }

  68. void Stop()
  69. {
  70.   SDA=0;
  71.   _nop_();       

  72.   SCL=0;
  73.   nop4();//>4us后SCL跳变
  74.   SCL=1;
  75.   nop4();
  76.   SDA=1;
  77.   _nop_();
  78.   _nop_();
  79. }
  80. //******************************************
  81. void  Write_A_Byte(unsigned char c)
  82. {
  83.   unsigned char BitCnt;
  84.   for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
  85.   {
  86.     if((c<<BitCnt)&0x80)  SDA=1;   //判断发送位
  87.     else  SDA=0;               
  88.     _nop_();
  89.     SCL=1;               //置时钟线为高,通知被控器开始接收数据位
  90.     nop4();
  91.     _nop_();      
  92.     SCL=0;
  93.   }  
  94.   _nop_();
  95.   _nop_();
  96.   SDA=1;               //8位发送完后释放数据线,准备接收应答位
  97.   _nop_();
  98.   _nop_();  
  99.   SCL=1;
  100.   _nop_();
  101.   _nop_();
  102.   _nop_();
  103.   if(SDA==1)ack=0;     
  104.   else ack=1;        //判断是否接收到应答信号
  105.   SCL=0;
  106.   _nop_();
  107.   _nop_();
  108. }

  109. bit Write_Random_Address_Byte(unsigned char add,unsigned char dat)
  110. {
  111.   Start();    //启动总线
  112.   Write_A_Byte(add); //发送器件地址
  113.   if(ack==0)return(0);
  114.   Write_A_Byte(dat);   //发送数据
  115.   if(ack==0)return(0);
  116.   Stop(); //结束总线
  117.   return(1);
  118. }
  119. //********************液晶屏使能*********************
  120. void Enable_LCD_write()
  121. {
  122.   LCD_data|=(1<<(3-1));//E=1;
  123.   Write_Random_Address_Byte(0x40,LCD_data);
  124.   delay_nus(2);
  125.   LCD_data&=~(1<<(3-1));//E=0;
  126.   Write_Random_Address_Byte(0x40,LCD_data);
  127. }

  128. //*************写命令****************************
  129. void LCD_write_command(unsigned char command)
  130. {
  131.   delay_nus(16);
  132.   LCD_data&=~(1<<(1-1));//RS=0;
  133.   LCD_data&=~(1<<(2-1));//RW=0;
  134.   Write_Random_Address_Byte(0x40,LCD_data); // PCF8574 40H, PCF8574A 70H
  135.                                             // 0x27, 0x20, 0x3F
  136.   LCD_data&=0x0f; //清高四位
  137.   LCD_data|=command & 0xf0; //写高四位
  138.   Write_Random_Address_Byte(0x40,LCD_data);
  139.   Enable_LCD_write();

  140.   command=command<<4; //低四位移到高四位
  141.   LCD_data&=0x0f; //清高四位
  142.   LCD_data|=command&0xf0; //写低四位
  143.   Write_Random_Address_Byte(0x40,LCD_data);
  144.   Enable_LCD_write();
  145. }
  146. //*************写数据****************************
  147. void LCD_write_data(unsigned char value)
  148. {
  149.   delay_nus(16);
  150.   LCD_data|=(1<<(1-1));//RS=1;
  151.   LCD_data&=~(1<<(2-1));//RW=0;
  152.   Write_Random_Address_Byte(0x40,LCD_data);

  153.   LCD_data&=0X0f; //清高四位
  154.   LCD_data|=value&0xf0; //写高四位
  155.   Write_Random_Address_Byte(0x40,LCD_data);
  156.   Enable_LCD_write();

  157.   value=value<<4; //低四位移到高四位
  158.   LCD_data&=0x0f; //清高四位
  159.   LCD_data|=value&0xf0; //写低四位
  160.   Write_Random_Address_Byte(0x40,LCD_data);
  161.   Enable_LCD_write();
  162. }

  163. //**********************设置显示位置*********************************
  164. void set_position(unsigned char x,unsigned char y)
  165. {
  166.   unsigned char position;
  167.   if (y == 0)
  168.     position = 0x80 + x;
  169.   else
  170.     position = 0xc0 + x;
  171.   LCD_write_command(position);
  172. }
  173. //**********************显示字符串*****************************

  174. void display_string(unsigned char x,unsigned char y,unsigned char *s)
  175. {
  176.   set_position(x,y);
  177.   while (*s)
  178.   {     
  179.     LCD_write_data(*s);     
  180.     s++;     
  181.   }
  182. }
  183. //********************显示数字*******************************xs
  184. void display_num(unsigned char x,unsigned char y,unsigned int num)
  185. {
  186.   unsigned char i,j,k,m,n;
  187.   set_position(x,y);
  188.   i=num/10000;
  189.   j=num/1000%10;
  190.   k=num/100%10;
  191.   m=num/10%10;
  192.   n=num%10;
  193.   LCD_write_data(digit[i]);    //将万位数字的字符常量写入LCD
  194.   LCD_write_data(digit[j]);    //将千位数字的字符常量写入LCD
  195.   LCD_write_data(digit[k]);
  196.   LCD_write_data(digit[m]);
  197.   LCD_write_data('.');
  198.   LCD_write_data(digit[n]);
  199. }
  200. //*************液晶初始化****************************
  201. void LCD_init(void)
  202. {
  203.   LCD_write_command(0x28);
  204.   delay_nus(40);
  205.   LCD_write_command(0x28);
  206.   delay_nus(40);
  207.   Enable_LCD_write();
  208.   delay_nus(40);
  209.   LCD_write_command(0x28); //4位显示!!!!!!!!!!!!!!!!!!
  210.   LCD_write_command(0x0c); //显示开
  211.   LCD_write_command(0x01); //清屏
  212.   delay_nms(2);
  213. }
  214. //
  215. //********************按键*********************
  216. void button()
  217. {
  218.   if(button1==0)
  219.   {
  220.     LCD_data|=(1<<(4-1));//E=1;
  221.     Write_Random_Address_Byte(0x40,LCD_data);
  222.   }
  223.   if(button1==1)
  224.   {
  225.     LCD_data&=~(1<<(4-1));//E=0;
  226.     Write_Random_Address_Byte(0x40,LCD_data);
  227.   }
  228. }

  229. void main(void)
  230. {
  231.   int i;
  232.   LCD_init();
  233.   display_string(0,0,"Hello Today!"); //显示一段文字
  234.   while(1)
  235.   {
  236.     button();
  237.     display_num(0,1,i);
  238.     delay_nms(50);
  239.     i++;
  240.   }
  241. }

复制代码
  1. //The basic concept of bit-bang i2c is same either you implement it in C or Assembly language.

  2. #define SDA P0_0
  3. #define SCL P0_1

  4. void I2CInit()
  5. {
  6.         SDA = 1;
  7.         SCL = 1;
  8. }

  9. void I2CStart()
  10. {
  11.         SDA = 0;
  12.         SCL = 0;
  13. }

  14. void I2CRestart()
  15. {
  16.         SDA = 1;
  17.         SCL = 1;
  18.         SDA = 0;
  19.         SCL = 0;
  20. }

  21. void I2CStop()
  22. {
  23.         SCL = 0;
  24.         SDA = 0;
  25.         SCL = 1;
  26.         SDA = 1;
  27. }

  28. void I2CAck()
  29. {
  30.         SDA = 0;
  31.         SCL = 1;
  32.         SCL = 0;
  33.         SDA = 1;
  34. }

  35. void I2CNak()
  36. {
  37.         SDA = 1;
  38.         SCL = 1;
  39.         SCL = 0;
  40.         SDA = 1;
  41. }

  42. unsigned char I2CSend(unsigned char Data)
  43. {
  44.         unsigned char i, ack_bit;
  45.         for (i = 0; i < 8; i++) {
  46.                 if ((Data & 0x80) == 0)
  47.                 SDA = 0;
  48.                 else
  49.                 SDA = 1;
  50.                 SCL = 1;
  51.                 SCL = 0;
  52.                 Data<<=1;
  53.         }
  54.         SDA = 1;
  55.         SCL = 1;
  56.         ack_bit = SDA;
  57.         SCL = 0;
  58.         return ack_bit;
  59. }

  60. unsigned char I2CRead()
  61. {
  62.         unsigned char i, Data=0;
  63.         for (i = 0; i < 8; i++) {
  64.                 SCL = 1;
  65.                 if(SDA)
  66.                 Data |=1;
  67.                 if(i<7)
  68.                 Data<<=1;
  69.                 SCL = 0;
  70.         }
  71.         return Data;
  72. }

  73. /*****************************************
  74. * Write to slave device with
  75. * slave address e.g. say 0x20
  76. *****************************************/
  77. /* Init i2c ports first */
  78. I2CInit();
  79. /* Send start condition */
  80. I2CStart();
  81. /* Send slave address */
  82. ack = I2CSend(0x20);
  83. /*
  84.         * ack == 1 => NAK
  85.         * ack == 0 => ACK
  86.         */
  87. ack = I2CSend(0x07);
  88. /* Send another data */
  89. ack = I2CSend(0x10);
  90. /* Send stop condition */
  91. I2CStop();

  92. /*****************************************
  93. * Read from slave device with
  94. * slave address e.g. say 0x20
  95. *****************************************/
  96. /* Init i2c ports first - Should be done once in main */
  97. I2CInit();
  98. /* Send start condition */
  99. I2CStart();
  100. /*
  101.         * Send slave address with Read bit set
  102.         * So address is 0x20 | 1 = 0x21
  103.         */
  104. I2CSend(0x21);
  105. data = I2CRead();
  106. /* Send ack */
  107. I2CAck();
  108. /* Read last byte */
  109. data = I2CRead();
  110. /*
  111.         * Send nak for last byte to indicate
  112.         * End of transmission
  113.         */
  114. I2CNak();
  115. /* Send stop condition */
  116. I2CStop();


  117. /*****************************************************************/
  118. //I am considering same scenario as in assembly sample, DS1307 connected to 8051 microcontroller. Here is a sample code for reading DS1307 registers in C

  119. I2CStart();                /* start condition */
  120. I2CSend(0xD0);        /* Slave address + Write */
  121. I2CSend(0x00);        /* Starting address of RTC */
  122. I2CRestart();        /* Repeated start condition */
  123. I2CSend(0xD1);        /* Slave address + Read */
  124. /* Read 8 registers from RTC */
  125. for (i = 0; i < 8; i++) {
  126.         /* Read and store in array */
  127.         /* This is much simpler than in Assembly :) */
  128.         a[i] = I2CRead();

  129.         /* check for last byte */
  130.         if(i == 7)
  131.                 I2CNak();        /* NAK if last byte */
  132.         else
  133.                 I2CAck();        /* ACK for all read bytes */
  134. }
  135. /* Reading finished send stop condition */
  136. I2CStop();

  137. //Following code example uses the C code provided in I2C Implementation on PIC written for PIC16F877A microcontroller MSSP module.

  138. void main()
  139. {
  140.         /* Buffer where we will read/write our data */
  141.         unsigned char I2CData[] = {0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x09, 0x00};
  142.         unsigned char i;
  143.         /* Initialize I2C Port */
  144.         I2CInit();
  145.         /* Send Start condition */
  146.         I2CStart();
  147.         /* Send DS1307 slave address with write operation */
  148.         I2CSend(0xD0);
  149.         /* Send subaddress 0x00, we are writing to this location */
  150.         I2CSend(0x00);

  151.         /* Loop to write 8 bytes */
  152.         for (i = 0; i < 8; i++) {
  153.                 /* send I2C data one by one */
  154.                 I2CSend(I2CInitval[i]);
  155.         }

  156.         /* Send a stop condition - as transfer finishes */
  157.         I2CStop();

  158.         /* We will now read data from DS1307 */
  159.         /* Reading for a memory based device always starts with a dummy write */
  160.         /* Send a start condition */
  161.         I2CStart();
  162.         /* Send slave address with write */
  163.         I2CSend(0xD0);
  164.         /* Send address for dummy write operation */
  165.         /* this address is actually where we are going to read from */
  166.         I2CSend(0x00);

  167.         /* Send a repeated start, after a dummy write to start reading */
  168.         I2CRestart();
  169.         /* send slave address with read bit set */
  170.         I2CSend(0xD1);
  171.         /* Loop to read 8 bytes from I2C slave */
  172.         for (i = 8; i > 0; i--) {
  173.                 /* read a byte */
  174.                 I2CData[i] = I2CRead();
  175.                 /* ACK if its not the last byte to read */
  176.                 /* if its the last byte then send a NAK */
  177.                 if (i - 1)
  178.                         I2CAck();
  179.                 else
  180.                         I2CNak();
  181.         }
  182.         /* Send stop */
  183.         I2CStop();
  184.         /* end of program */
  185.         while(1);
  186. }

复制代码



IIC驱动1602.zip

53.6 KB, 下载次数: 10

回复

使用道具 举报

ID:389122 发表于 2018-8-26 08:57 | 显示全部楼层
angmall 发表于 2018-8-25 21:04
是在LCD1602之外再加入一个PCF8574,利用8574的串并转换功能模拟操作1602。
这样连接的1602必须采用4位收 ...

谢谢 非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表