#include "System_config.h" // 配置各个头文件
void IIC_delay()
{
int i;
i=0xff;
while(i)
{
i--;
_NOP();
}
i=0xff;
while(i)
{
i--;
_NOP();
}
}
/***********************************
功能:往线上发一个字节
输入:要发的数据
条件:在进入此函数前,必须保证SCL为低
***********************************/
void SendToBus(BYTE m)
{
BYTE i;
for(i=0;i<8;i++)
{
if(m&0x80)
SDA_UP;
else
SDA_DOWN;
SCL_UP;
IIC_delay();
SCL_DOWN;
m<<=1;
}
return;
}
/******************************
检测线上的回答信号
******************************/
BYTE BackAns()
{
BYTE flag;
SDA_UP;
IIC_delay();
SCL_UP;
flag=0;
IIC_delay();
if((PORTIN & SDA))
{
flag=1;
}
SCL_DOWN;
return flag;
}
/******************************
发送一个起始信号
******************************/
void Start()
{
PORTOUT &= (~SCL)&(~SDA) ;
SCL_UP;
IIC_delay();
SDA_UP;
IIC_delay();
SDA_DOWN; //开始位
IIC_delay();
SCL_DOWN;
IIC_delay();
}
/******************************
发送一个终止信号
******************************/
void Stop()
{
SDA_DOWN;
IIC_delay();
SCL_UP; //停止位
IIC_delay();
SDA_UP;
IIC_delay();
SCL_DOWN;
IIC_delay();
}
void Write_IIC_Byte(BYTE data,BYTE startaddr)
{
do
{
Start();
SendToBus(CHIP); //选片地址
if(BackAns()) //从机的回答信息
continue;
SendToBus(startaddr); //选择芯片上的内在地址
if(BackAns())
continue;
SendToBus(data); //传输数据
if(!BackAns())
break;
}while(1);
Stop();
}
/********************************
函数功能:从线上读取一个字节数据
返回读取的数据
********************************/
BYTE ReadFromBus()
{
int i,temp;
temp = 0;
SDA_UP; //读取数据之前要把SDA拉高
IIC_delay();
for(i=0;i<8;i++)
{
SCL_UP;
IIC_delay();
temp<<=1;
if(PORTIN&SDA)
temp|=0x01;
else
temp&=0xfe;
SCL_DOWN;
IIC_delay();
}
return temp;
}
/********************************
函数功能:读数据到微控制器
* * * *
第一个参数:读数据的首地址
*********************************/
BYTE Read_IIC_Random(BYTE startaddr)
{
BYTE temp;
do
{
Start();
SendToBus(CHIP); //选片地址
if(BackAns()) //从机的回答信息
continue;
SendToBus(startaddr); //选择芯片上的内在地址
if(BackAns())
continue;
Start();
SendToBus(CHIP + 1);
if(!BackAns())
break;
}while(1);
temp = ReadFromBus(); //从线上读数据
NoAck();
Stop();
return temp;
}
/***************************
功能:向IIC发送一个回答信号
无输入输出
**************************/
void AckToBus()
{
SDA_DOWN;
IIC_delay();
SCL_UP;
IIC_delay();
SCL_DOWN;
IIC_delay();
}
void NoAck()
{
SDA_UP;
IIC_delay();
SCL_UP;
IIC_delay();
SCL_DOWN;
IIC_delay();
}
/************************************
---连续写len个数据到指定位置
输入:数据,存贮数据的地址,操作字节数
************************************/
void Write_IIC_Serious(char *data,BYTE startaddr,BYTE len)
{
do
{
Start();
SendToBus(CHIP); //选片地址
if(BackAns()) //从机的回答信息
continue;
SendToBus(startaddr); //选择芯片上的内在地址
if(BackAns())
continue;
SendToBus(data[0]); //传输数据
if(BackAns())
continue;
SendToBus(data[1]);
if(!BackAns())
break;
}while(1);
Stop();
}
/*************************
从当前位置连续读
*************************/
void Read_IIC_Curent(BYTE *data,BYTE len)
{
int i;
Start();
SendToBus(CHIP+1);
/*************************
发送读命令
*************************/
BackAns();
i=1;
do
{
i++;
data[i]=ReadFromBus();
if(i<len)
AckToBus();
else
break;
}while(1);
Stop();
}
void init_IIC()
{
;// PORTOUT=0;
}
/*************************************************
Function: zlg7290_cmd
Description: 周立功7290纯指令发送
*************************************************/
void zlg7290_cmd(unsigned char cmd)
{
Write_IIC_Byte(cmd,0x07);
return;
}
/*************************************************
Function: IsKeyDow
Description: 检查是否有键按下
Return: 1 有按键按下
0 无按键按下
*************************************************/
char IsKeyDown()
{
char temp;
temp=0;
temp=Read_IIC_Random(0x00);
if(temp&0x01)
{
return 1;
}
else
{
return 0;
}
}
/*************************************************
Function: ReadKey
Description: 读取键值
Return: Read_IIC_Random(0x01) 读到的键值
*************************************************/
char ReadKey()
{
return Read_IIC_Random(0x01);
}
/*************************************************
Function: ReadCnt
Description: 读取按键连击次数
Return: Read_IIC_Random(0x02) 连击的次数
*************************************************/
char ReadCnt()
{
return Read_IIC_Random(0x02);
}