📄 zlg7290.c
字号:
//********************************************************************
//文件名:ZLG7290.c
//创建人: ZFZ
//建立时间: 2008-6-6
//版本描 述: STIV8.0.0
//功能描述:键盘管理芯片ZLG7290的标准80C51驱动程序C文件
//备注:
//******************************************************************
#include <C8051F340.h>
#include "ZLG7290.h"
/*---------------------------------------------
函数名:ZLG7290_Delay
功 能:延时
参 数:uint x
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_Delay(unsigned int x)
{
//unsigned int i;
//for(i=0;i<x;i++);
while ( --x != 0 );
}
void I2C_Init(void)
{
SCL_SET();
ZLG7290_Delay(200);
SDA_SET();
ZLG7290_Delay(200);
}
/*---------------------------------------------
函数名:ZLG7290_Start
功 能:起始条件
参 数:无
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_Start(void)
{
SDA_SET(); //SCL为高时,SDA的下降延开始
ZLG7290_Delay(200);
//_nop_();
SCL_SET();
//while((P4 & ZLG7290_SCL)==0)
while(ZLG7290_SCL == 0)
{;}
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
SDA_CLR();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
SCL_CLR();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
}
/*---------------------------------------------
函数名:ZLG7290_Stop
功 能:停止条件
参 数:无
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_Stop(void)
{
SDA_CLR(); //SCL为高时,SDA的上升延停止
ZLG7290_Delay(200);
SCL_SET();
//while((P4 & ZLG7290_SCL)==0)
while(ZLG7290_SCL == 0)
{;}
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
SDA_SET();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
}
/*---------------------------------------------
函数名:ZLG7290_Wrbyt
功 能:写一个字节函数
参 数:unsigned char shu
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_Wrbyt(unsigned char shu)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((shu & 0x80)>0)
{
SDA_SET();
}
else
{
SDA_CLR();
}
//ZLG7290_Delay(200);
//_nop_();
SCL_SET();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
SCL_CLR(); //SDA上的数据只有在SCL为低时才能改变
ZLG7290_Delay(200);
//_nop_();
shu <<= 1; //数据左移一位
}
}
/*---------------------------------------------
函数名:ZLG7290_Rdbyt
功 能:读一个字节
参 数:无
返回值:unsigned char nn
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
unsigned char ZLG7290_Rdbyt(void)
{
unsigned char nn=0xff;
unsigned char j;
SDA_SET(); //置数据线为输入方式
for(j=0;j<8;j++)
{
//SCL_CLR();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//ZLG7290_Delay(200);
SCL_SET();
ZLG7290_Delay(200);
//if((P4 & ZLG7290_SDA)==0)
if(ZLG7290_SDA == 0)
{
nn<<=1;
nn=(nn&0xfe);
SCL_CLR();
ZLG7290_Delay(200);
}
else
{
nn<<=1;
nn=(nn|0x01);
SCL_CLR();
ZLG7290_Delay(200);
}
}
//SCL_CLR();
//ZLG7290_Delay(200);
return(nn);
}
/*---------------------------------------------
函数名:ZLG7290_ACK
功 能:产生应答信号
参 数:无
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_ACK(void)
{
SDA_CLR();
ZLG7290_Delay(200);
SCL_SET();
ZLG7290_Delay(200);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
SCL_CLR();
ZLG7290_Delay(200);
SDA_SET();
}
/*---------------------------------------------
函数名:ZLG7290_NACK
功 能:产生非应答信号
参 数:无
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_NACK(void)
{
SDA_SET();
ZLG7290_Delay(200);
SCL_SET();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
SCL_CLR();
ZLG7290_Delay(200);
SDA_CLR();
}
/*---------------------------------------------
函数名:Check_ACK
功 能:检查返回应答信号
参 数:无
返回值:F0(0或1)
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
bit Check_ACK(void)
{
bit F0;
//_nop_();
//_nop_();
//_nop_();
//ZLG7290_Delay(200);
SDA_SET();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
SCL_SET();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
//F0 = (P4 & ZLG7290_SDA) >> 4;
F0 = ZLG7290_SDA;
SCL_CLR();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
ZLG7290_Delay(200);
return(F0);
}
/*---------------------------------------------
函数名:ZLG7290_ReadReg
功 能:读7290寄存器
参 数:unsigned char SubAddr
返回值:寄存器值
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
unsigned char ZLG7290_ReadReg(unsigned char SubAddr)
{
unsigned char regvalue = 0;
bit cflag=0;
ZLG7290_Start();
ZLG7290_Wrbyt(ZLG7290_I2C_ADDR);
cflag = Check_ACK();
ZLG7290_Wrbyt(SubAddr);
cflag = Check_ACK();
ZLG7290_Start();
ZLG7290_Wrbyt(ZLG7290_I2C_ADDR + 1);
cflag = Check_ACK();
regvalue = ZLG7290_Rdbyt();
ZLG7290_NACK();
//ZLG7290_Delay(100);
ZLG7290_Stop();
ZLG7290_Delay(2000);
return(regvalue);
}
/*---------------------------------------------
函数名:ZLG7290_WriteReg
功 能:写7290寄存器
参 数:unsigned char SubAddr,unsigned char value
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_WriteReg(unsigned char SubAddr,unsigned char value)
{
bit cflag=0;
ZLG7290_Start(); //开始
ZLG7290_Wrbyt(ZLG7290_I2C_ADDR);
cflag=Check_ACK();
ZLG7290_Wrbyt(SubAddr);
cflag=Check_ACK();
ZLG7290_Wrbyt(value);
cflag=Check_ACK(); //接收应答信号
//ZLG7290_Delay(200); //延时
ZLG7290_Stop(); //停止
ZLG7290_Delay(2000); //延时
}
/*---------------------------------------------
函数名:ZLG7290_WriteCmd
功 能:写7290控制寄存器
参 数:unsigned char SubAddr,unsigned char value
返回值:无
修改记录
----------------------------------------------
日期 作者 内容
---------------------------------------------*/
void ZLG7290_WriteCmd(unsigned char cmd0,unsigned char cmd1)
{
bit cflag=0;
ZLG7290_Start(); //开始
ZLG7290_Wrbyt(ZLG7290_I2C_ADDR);
cflag=Check_ACK();
ZLG7290_Wrbyt(ZLG7290_CmdBuf);
cflag=Check_ACK();
ZLG7290_Wrbyt(cmd0);
cflag=Check_ACK(); //接收应答信号
ZLG7290_Wrbyt(cmd1);
cflag=Check_ACK(); //接收应答信号
//ZLG7290_Delay(200); //延时
ZLG7290_Stop(); //停止
ZLG7290_Delay(2000); //延时
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -