📄 复件 pt2314.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 + -