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

📄 复件 pt2314.c

📁 PT2314 驱动程序,已经通过测试,含子程序,i2c
💻 C
字号:

*/
#include <reg51.h>
#include "type.h"
#include "gpio.h"
#include <intrins.h>  //_nop_();
#include "pt2314.h"

#define  uchar unsigned char 
sbit  PTDAT = P1^4;
sbit  PTSCL = P1^5;

#define DELAY_TIME 500
 
void SomeNOP() 
{
   unsigned char i=0;
   for(i=0;i<100;i++)
   {
     _nop_();
   }
}

void I2C_start(void)
{
   	EA=0;
    PTDAT=1; PTSCL=1; SomeNOP();
    PTDAT=0; SomeNOP(); 
	PTSCL=0;	
}

static void I2C_stop(void)
{
	PTSCL=0; PTDAT=0; SomeNOP(); 
	PTSCL=1; SomeNOP(); PTDAT=1; 
}



static char I2C_ack(void)
{
	unsigned int  errtime=2550;//因故障接收方无ACK,超时值为255。
	PTDAT=1;SomeNOP();
    PTSCL=1;SomeNOP();
   
 	while(PTDAT) 
	{ errtime--; 
  			if (!errtime) 
  			{ 
               I2C_stop();
  			   return 0;
            }
    }
    PTSCL=0;
    return 1;
}



static char I2C_send_byte(unsigned char ch)
{
	uchar i=8;

	while (i--)
	{
	    PTSCL=0;_nop_();
       _nop_();_nop_();_nop_();_nop_();_nop_();
	   if(ch&0x80)
         PTDAT=1; 
	   else
         PTDAT=0;
       ch<<=1; SomeNOP();
       PTSCL=1; SomeNOP();
       
    }
     PTSCL=0;
	return I2C_ack();
}
char pt2314_send_data(unsigned char *dat, unsigned char n)
{
	unsigned char i;
	I2C_start();
	if (!I2C_send_byte(0x88))
	{
		return 0;
	}
	for (i = 0; i < n; ++i)
	{
		if (!I2C_send_byte(dat[i]))
		{
			return 0;
		}
	}
	I2C_stop();
	return 1;
}
/*

*/
    void DELAY(unsigned int t) 
    {
        while(t!=0)
            t--;
    }

    void I2CSTART(void)
    {
       
        PTDAT=1;
        PTSCL=1;
        DELAY(DELAY_TIME);
        PTDAT=0;
        DELAY(DELAY_TIME);
        PTSCL=0;
        DELAY(DELAY_TIME);
    }

    void I2CSTOP(void)
    {
        PTDAT=0;
        PTSCL=1;
        DELAY(DELAY_TIME);
        PTDAT=1;
        DELAY(DELAY_TIME);
        PTSCL=0;
        DELAY(DELAY_TIME);
    }

    void SEND_0(void)   
    {
        
        PTDAT=0;
        PTSCL=1;
        DELAY(DELAY_TIME);
        PTSCL=0;
        DELAY(DELAY_TIME);
    }

    void SEND_1(void)
    {
        
        PTDAT=1;
        PTSCL=1;
        DELAY(DELAY_TIME);
        PTSCL=0;
        DELAY(DELAY_TIME);
    }

   bit Check_Acknowledge(void)
    {
        bit dat;
        PTDAT=1;
        PTSCL=1;
        DELAY(DELAY_TIME/2);
        dat=PTDAT;
        DELAY(DELAY_TIME/2);
        PTSCL=0;
        DELAY(DELAY_TIME);
        if(dat)
            return FALSE;
        return TRUE;
    }

   void WriteI2CByte(char b)
    {
        
        char i;
        for(i=0;i<8;i++)
            if((b<<i)&0x80)
                SEND_1();
            else
                SEND_0();
    }

 

    char ReadI2CByte(void)
    {
        
        char b=0,i;
		bit dat;
        for(i=0;i<8;i++)
        {
            PTDAT=1;    
            PTSCL=1;    
            DELAY(10);
            dat=PTDAT;
            DELAY(10);
            PTSCL=0;
            if(dat)
                {
                    b=b<<1;
                    b=b|0x01;
                }
            else
                b=b<<1;
        }
        return b;
    }



void Write_One_Byte(char addr,char thedata)
{
          bit acktemp=1;
          
          I2CSTART();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);
          acktemp=Check_Acknowledge();
          WriteI2CByte(thedata);
          acktemp=Check_Acknowledge();
          I2CSTOP();

}

void Write_A_Page(char *buffer,char addr)
{
          bit acktemp=1;
          int i;
          
          I2CSTART();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);
          acktemp=Check_Acknowledge();
          for(i=0;i<8;i++)
          {
            WriteI2CByte(buffer[i]);
            if(!Check_Acknowledge())
                {
                    I2CSTOP();

                }
           }


          I2CSTOP();

 


}

char Read_One_Byte(char addr)
{         bit acktemp=1;
          char mydata;
           
          I2CSTART();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);
          acktemp=Check_Acknowledge();
          I2CSTART();
          WriteI2CByte(0xa1);
          acktemp=Check_Acknowledge();


          mydata=ReadI2CByte();
          acktemp=Check_Acknowledge();

          return mydata;
          I2CSTOP();
}

void Read_N_Bytes(char *buffer,char n,char addr)
{
          bit acktemp=1;

          int i=0;
           
          I2CSTART();
          WriteI2CByte(0xa0);
          acktemp=Check_Acknowledge();
          WriteI2CByte(addr);
          acktemp=Check_Acknowledge();
          I2CSTART();
          WriteI2CByte(0xa1);

          acktemp=Check_Acknowledge();

 


          for(i=0;i<n;i++)
          {
                buffer[i]=ReadI2CByte();
                if(i!=n-1)
                    SEND_0();    
                else
                    SEND_1();    
          }

         I2CSTOP();

}

⌨️ 快捷键说明

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