⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.txt

📁 I2c的读写程序,适合LCD的~但我有些地方不太明白
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                   ErrorBit=SDA;
                   SCL=0;
                   return(ErrorBit);
                  }
                  /***********************************************************************/
                  void I2C_write_byte(unsigned char input)
                  {
                       unsigned char temp;
                   for(temp=8;temp!=0;temp--)
                    {
                    SDA=(bit)(input&0x80);
                    SCL=1;
                    SCL=0;
                    input=input<<1;
                          }
                   }
                  /***********************************************************************/
                  unsigned char I2C_read_byte(void)
                  {
                    unsigned char temp,rbyte=0;
                   for(temp=8;temp!=0;temp--)
                    {
                       SCL=1;
                       rbyte=rbyte<<1;
                        rbyte=rbyte ((unsigned char)(SDA));
                        SCL=0;
                   }
                   return(rbyte);
                  }
                  /************************************************************************/
                  void AT24C02_write(unsigned char address,unsigned char 
                  *buf,unsigned char Nbyte)
                  {
                   
                      I2C_start();
                   I2C_write_byte(WRITE24C02);
                    TestAck();
                      I2C_write_byte(address);
                   TestAck();
                   for(;Nbyte!=0;Nbyte--)
                   {  
                   I2C_write_byte(*buf);
                      TestAck();
                      buf++;
                   
                    }
                   I2C_stop();              
                   delay_ms(10);//在每个函数之间加延时
                  } 
                  /************************************************************************/
                  void AT24C02_read(unsigned char address,unsigned char 
                  *buf,unsigned char Nbyte)
                  {
                   
                       I2C_start();
                    I2C_write_byte(WRITE24C02);
                     TestAck(); 
                    I2C_write_byte(address);
                     TestAck();
                     
                     I2C_start();
                    I2C_write_byte(READ24C02);
                         TestAck();  
                     while(Nbyte!=1)
                      {
                          *buf=I2C_read_byte();
                               I2C_send_ack();
                                buf++;
                                
                     Nbyte--;
                           }
                   *buf=I2C_read_byte();
                  I2C_send_noack();
                   I2C_stop();
                   

                   
                    
                  }
                  /**************LCD1602的初始化***************************/
                  void LCD_init(void)
                  {
                   LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
                   LCD_send_command(LCD_AC_AUTO_INCREMENT LCD_MOVE_DISENABLE);
                   LCD_send_command(LCD_DISPLAY_ON LCD_CURSOR_OFF);
                   LCD_send_command(LCD_CLEAR_SCREEN);
                  }
                  /***********************检测LCD状态*********************************/
                   
                  void LCD_check_busy(void)   
                  {
                   do
                    {
                     LCD_EN=0;
                     LCD_RS=0;
                     LCD_RW=1;
                     LCDIO=0xff;
                     LCD_EN=1;
                     }
                     while(LCD_BUSY==1);
                    
                      LCD_EN=0;
                  }
                  /************LCD1602写命令*******************************/
                  void LCD_send_command(uchar command)
                  {
                   LCD_check_busy();
                   LCD_RS=LOW;
                   LCD_RW=LOW;
                   LCD_EN=HIGH;
                   LCDIO=command;
                   LCD_EN=LOW;
                  }
                  /********************************************************/
                  /*****************LCD1602写数据**************************/
                  void LCD_send_data(uchar dat)
                  {
                   LCD_check_busy();
                   LCD_RS=HIGH;
                   LCD_RW=LOW;
                   LCD_EN=HIGH;
                   LCDIO=dat;
                   LCD_EN=LOW;
                  }
                  /***********************LCD1602显示字符*********************************/
                  void LCD_write_char(uchar x,uchar y,uchar dat)
                  {
                       unsigned char address;
                       if (y == LINE1) 
                           address = LINE1_HEAD + x;
                       else 
                          address = LINE2_HEAD + x;
                       LCD_send_command(address); 
                      LCD_send_data(dat);
                  }
                  /******************LCD1602显示字符串*********************/
                  void LCD_write_string(uchar x,uchar y,uchar *Data)
                  {
                   if(y==LINE1)
                   {
                    if(x<LINE_LENGTH)
                    {
                     LCD_send_command(LINE1_HEAD+x);
                     for(;x<LINE_LENGTH&&*Data!=''''\0'''';x++)
                     { 
                      LCD_send_data(*(Data++));
                     }
                     if(*Data!=''''\0'''')
                     {
                      x=0;
                      y=LINE2;
                     }
                    }
                   }
                   if(y==LINE2)
                   {
                    LCD_send_command(LINE2_HEAD+x);
                    for(;x<LINE_LENGTH&&*Data!=''''\0'''';x++)
                    {
                     LCD_send_data(*(Data++));
                    }
                   }
                  }
                  /****************************************************************/
                  /********************延时函数***********************************/
                    
                  /***************************************************************/
                  void delay_ms(uint n)
                  {
                   uint i,j;
                   for(i=n;i>0;i--)
                      for(j=0;j<1140;j++)
                      ;
                  }
                  /*********************************************************************/




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -