/* I2C 总线协议时序编程
--AT24C01---
COPYRIGHT (c) 2008 BY bill.
-- ALL RIGHTS RESERVED --
File Name: I2C.h
Author: bill
Created: 2007/12/12
Modified: NO
Revision: keil v3.0
fose=12M
*************************************************/
#ifndef _I2C_H_
#define _I2C_H_
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit Sda="P1"^0;
sbit Scl="P1"^1;
sbit Wp="P1"^2;
/************************** Start **********/
void Start(void)
{
Sda="1";
Scl="1";
_nop_();
_nop_();
_nop_();
_nop_();
Sda="0";
_nop_();
_nop_();
_nop_();
_nop_();
}
/**************** Stop *****************/
void Stop (void)
{
Sda="0";
Scl="1";
_nop_();
_nop_();
_nop_();
_nop_();
Sda="1";
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************** Ack **************************/
void Ack (void)
{
Sda="0";
_nop_();
_nop_();
_nop_();
_nop_();
Scl="1";
_nop_();
_nop_();
_nop_();
_nop_();
Scl="0";
}
/*************** No Ack ***************************/
void NoAck (void)
{
Sda="1";
_nop_();
_nop_();
_nop_();
_nop_();
Scl="1";
_nop_();
_nop_();
_nop_();
_nop_();
Scl="0";
}
/***************** Send a char ***************************/
void Send(uchar Data) //发送数据子程序 Data 为发送的字符
{
uchar BitCount="8"; //入口为要发送的字符 Data
uchar temp; //无返回值
do
{
temp="Data";
Scl="0";
_nop_();
_nop_();
_nop_();
_nop_();
if(temp&0x80)
Sda="1";
else
Sda="0";
Scl="1";
temp="Data"<<1;
Data="temp";
BitCount--;
}while(BitCount);
Scl="0";
}
/***************************** Read a char *********************/
uchar Read(void) //无入口
{ //出口为读出来的数据 temp
uchar temp="0";
uchar temp1=0;
uchar BitCount="8";
Sda="1";
do{
Scl="0";
_nop_();
_nop_();
_nop_();
_nop_();
Scl="1";
_nop_();
_nop_();
_nop_();
_nop_();
if(Sda)
temp="temp|0x01";
else
temp="temp"&0xfe;
if (BitCount-1)
{
temp1=temp<<1;
temp="temp1";
}
BitCount--;
}
while(BitCount);
return temp;
}
/*************************** Write a char to Rom ************************/
void WrRoROM (uchar Data[],uchar Address,uchar Num) //写多字节函数
{ //入口 为 要写的数组 Data[]
uchar i="0"; // 地址 Address
uchar *PData; // 字节数 Num
PData="Data";
Start();
Send(0xa0);
Ack();
Send (Address);
Ack();
for(i=0;i<Num;i++)
{
Send(*(PData)) ;
Ack();
}
Stop();
}
/********************************** Read a char from ROM *************/
void RdFromROM (uchar Data[],uchar Address,uchar Num) //读字符串
{ //入口 为要读出的数据 Data
uchar i="0"; //存放地址 Address
uchar *PData; //字节数 Num
PData="Data";
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl="0";
NoAck();
Stop();
}
}
#endif
/*************************例子**************************
void main(void)
{
uchar Number[4]={1,2,3,4};
Wp=1;
WrTOROM(Number,4,4);
mdelay(20);
while(1);
}
mdelay(uchar j)
{
uint i;
for(;j>0;j--)
{for(i=0;i<125;i--)
{;}
}
}
文章评论(0条评论)
登录后参与讨论