/*
//管脚定义
#define I2C_SCL RB6
#define I2C_SDA RB7
volatile bit I2C_SCL_IO @((unsigned)&TRISB*8)+6; //IB口方向设置
volatile bit I2C_SDA_IO @((unsigned)&TRISB*8)+7; //IB口方向设置
unsigned char I2C_Read1bYTE(unsigned char ack);//用于触摸仿真工具
unsigned char I2C_Write1bYTE(unsigned char data);
//—————————————————————————–
//函数声明
void DataPro(void);
extern unsigned int TKDATA0; //按键旧值
unsigned char I2C_Read1bYTE(unsigned char ack);
unsigned char I2C_Write1bYTE(unsigned char data);
void I2C_WaitMoment();
void I2C_WriteStop();
void I2C_WriteStart();
uint TKdata[16];
void DataPro(void)
{
uchar checksum = 5;
asm(“clrwdt”);
//Key_Test(); //检测按键值
checksum *= 3; //在此之前的checksum表示按键个数
checksum += 2; //在此之后的checksum表示校验和
//—————–与软件通讯规则为 0xA0+数据个数+数据+检验和——————
I2C_WriteStart();
I2C_Write1bYTE(0xa0); //建立连接的命令
I2C_Write1bYTE(checksum); //数据个数为 X*2+2 X表示按键个数
//KEY7
I2C_Write1bYTE(0x07);
I2C_Write1bYTE(TKdata[6] & 0xff); //键值数据低位
I2C_Write1bYTE((TKdata[6]>>8) & 0xff); //键值数据高位
checksum += 7;
checksum += (TKdata[6] & 0xff); //检验和= 数据个数+键值数据的总和
checksum += ((TKdata[6]>>8) & 0xff);
//KEY8
I2C_Write1bYTE(0x08);
I2C_Write1bYTE(TKdata[7] & 0xff); //键值数据低位
I2C_Write1bYTE((TKdata[7]>>8) & 0xff); //键值数据高位
checksum += 8;
checksum += (TKdata[7] & 0xff); //检验和= 数据个数+键值数据的总和
checksum += ((TKdata[7]>>8) & 0xff);
//KEY12
I2C_Write1bYTE(0x0C);
I2C_Write1bYTE(TKdata[11] & 0xff); //键值数据低位
I2C_Write1bYTE((TKdata[11]>>8) & 0xff); //键值数据高位
checksum += 0x0C;
checksum += (TKdata[11] & 0xff); //检验和= 数据个数+键值数据的总和
checksum += ((TKdata[11]>>8) & 0xff);
//KEY13
I2C_Write1bYTE(0x0D);
I2C_Write1bYTE(TKdata[12] & 0xff); //键值数据低位
I2C_Write1bYTE((TKdata[12]>>8) & 0xff); //键值数据高位
checksum += 0x0D;
checksum += (TKdata[12] & 0xff); //检验和= 数据个数+键值数据的总和
checksum += ((TKdata[12]>>8) & 0xff);
//KEY14
I2C_Write1bYTE(0x0E);
I2C_Write1bYTE(TKdata[13] & 0xff); //键值数据低位
I2C_Write1bYTE((TKdata[13]>>8) & 0xff); //键值数据高位
checksum += 0x0E;
checksum += (TKdata[13] & 0xff); //检验和= 数据个数+键值数据的总和
checksum += ((TKdata[13]>>8) & 0xff);
I2C_Write1bYTE(checksum); //发校验和
I2C_WriteStop(); //结束
}
//IIC函数
//起始信 -在SCL为高电平时,SDA线上发生从高到低的电平变化
void I2C_WriteStart()
{
I2C_SDA_IO = 0;
I2C_SCL_IO = 0;
I2C_WaitMoment();
I2C_SDA = 1; //先将SDA=1,以准备在SCL=1时,将SDA=0
I2C_SCL = 1; //时钟总线拉高
I2C_WaitMoment();
I2C_SDA = 0; //SCL=1时,将SDA拉低即产生启动信
I2C_WaitMoment();
I2C_SCL = 0; //将SCL=0,完成启动信 操作
I2C_WaitMoment();
}
//结束信 -在SCL为高电平时,SDA线上发生从低到高的电平变化
void I2C_WriteStop()
{
I2C_SDA_IO = 0;
I2C_SCL_IO = 0;
I2C_WaitMoment();
I2C_SDA = 0; //先将SDA=0,以准备在SCL=1时,将SDA=1
I2C_SCL = 1; //时钟总线拉高
I2C_WaitMoment();
I2C_SDA = 1; //SCL=1时,将SDA拉高即产生停止信
I2C_WaitMoment();
I2C_SCL = 0; //将SCL=0,完成启动信 操作
I2C_WaitMoment();
}
//
//函数功能:模拟IIC主机发送8位数据
//入口参数:data-待发送数据
//函数返回:返回ack应答信
//备 注:IIC协议ack应答信 为低有效
unsigned char I2C_Write1bYTE(unsigned char data)
{
unsigned char i = 8;
I2C_SDA_IO = 0;
I2C_SCL_IO = 0;
do
{
I2C_SCL = 0;
if(data&0x80)
I2C_SDA = 1;
else
I2C_SDA = 0;
I2C_SCL = 1; //时钟线做一个上升沿,将一位数据写入
data <<= 1;
}
while(–i);
I2C_SCL = 0;
I2C_SDA_IO = 1; //置为输入口接收应答信
I2C_WaitMoment();
I2C_SCL = 1; //做个上升沿准备读应答信
I2C_WaitMoment();
i = I2C_SDA;
I2C_SCL = 0;
I2C_SDA_IO = 0;
return i;
}
//函数功能:模拟IIC主机接收8位数据
//入口参数:ack-应答信
//函数返回:接收到的数据
//备 注:IIC协议ack应答信 为低有效
unsigned char I2C_Read1bYTE(unsigned char ack)
{
unsigned char i,data;
I2C_SDA_IO = 1;
I2C_SCL_IO = 1;
I2C_WaitMoment();
while(!I2C_SCL); //等待从机准备好数据释放时钟
I2C_SCL_IO = 0;
I2C_SCL = 0;
I2C_WaitMoment();
data <<= 1;
if(I2C_SDA) data |= 0x1;
for(i = 0; i < 7; i++)
{
I2C_SCL = 1;
data <<= 1;
if(I2C_SDA) data |= 0x1;
I2C_SCL = 0;
}
I2C_SDA_IO = 0;
if(ack)I2C_SDA = 1; //是否需要更多的数据
else I2C_SDA = 0;
I2C_WaitMoment();
I2C_SCL = 1;
I2C_WaitMoment();
I2C_SCL = 0;
return data;
}
void I2C_WaitMoment()
{
asm(“nop”);
asm(“nop”);
}
*/
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!