⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlg7290.c

📁 C8051F226单片机的初始化
💻 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 + -