📄 zlg7290.txt
字号:
ZLG7290的IIC驱动C语言程序
ZLG7290的IIC驱动C语言程序
作者:未知 AVR单片机来源:网络 点击数: 1336 更新时间:2007-10-1
//#####################---文件信息-----############################
//文 件 名 : 7290.c
//创 建 人 : ZXJ
//建 立 时 间 : 2004-2-17
//版 本 描 述 : V1.0
//功 能 描 述 : ZLG7290使用代码 ,使用模拟I2C
//备 注 : 调试环境为AVRGCC 3.3.1,MCU为Mega8 晶振为3.6864MHZ
// 由于ZLG7290的速度很慢,换晶振时注意延时程序的调整.实际测试中
// 死机现象比较严重,建议使用控制ZLG7290的复位
//最后修改时间 : 2004-2-19
//##################################################################
#include "7290.h"
//0到9
//const u08 LED_Font[10] =
{0xCF,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; //正
const u08 LED_Font[10] =
{0xfc,0x0c,0xda,0x9e,0x2e,0xb6,0xf6,0x1c,0xfe,0xbe}; //反
//----------------------------------------------------------------
void I2c_Send_Byte(u08 data);
u08 I2c_Rev_Byte(void);
//*****************************************************************
//函 数 名 : _Nop
//建 立 时 间 : 2004-2-17
//功 能 描 述 : 延时函数,最大值为0xff
//备 注 : 没有返回值
//最后修改时间 : 2004-2-18
//*****************************************************************
void _Nop(u08 dly)
{
u08 i;
for(i=0;i<dly;i++)
{
asm("nop");
}
}
//==============================================
//I2C通讯协议实现部分
//==============================================
//*****************************************************************
//函 数 名 : Start_I2c
//建 立 时 间 : 2004-2-17
//功 能 描 述 : 启动模拟I2C通讯
//备 注 : 没有返回值
//最后修改时间 : 2004-2-17
//*****************************************************************
void Start_I2c(void)
{
SDA_1; //发送起始条件的数据信号
_Nop(1);
SCL_1;
_Nop(5); //起始条件建立时间大于4.7us,延时
SDA_0; //发送起始信号
_Nop(5); // 起始条件锁定时间大于4μs
SCL_0; //钳住I2C总线,准备发送或接收数据
_Nop(5);
}
//*****************************************************************
//函 数 名 : Stop_I2c
//建 立 时 间 : 2004-2-17
//功 能 描 述 : 停止模拟I2C通讯
//备 注 : 没有返回值
//最后修改时间 : 2004-2-17
//*****************************************************************
void Stop_I2c(void)
{
SDA_0 //发送结束条件的数据信号
_Nop(1);
SCL_1 //结束条件建立时间大于4μs
_Nop(5);
SDA_1 //发送I2C总线结束信号
_Nop(5);
}
//*****************************************************************
//函 数 名 : I2c_Send_Byte
//建 立 时 间 : 2004-2-17
//功 能 描 述 : 向I2c总线发送1个字节的数据/命令
//备 注 : 没有返回值
//最后修改时间 : 2004-2-18
//*****************************************************************
void I2c_Send_Byte(u08 data)
{
u08 BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((data<<BitCnt)&0x80)
SDA_1 //判断发送位
else
SDA_0
_Nop(15);
SCL_1 //置时钟线为高,通知被控器开始接收数据位
_Nop(15);
SCL_0
}
_Nop(15);
SDA_1 //8位发送完后释放数据线,准备接收应答位
_Nop(15);
SCL_1
_Nop(15);
if(bit_is_set(I2C_PIN,SDA))ack=0;
else ack=1; //判断是否接收到应答信号
SCL_0
_Nop(15);
}
//*****************************************************************
//函 数 名 : Stop_I2c
//建 立 时 间 : 2004-2-17
//功 能 描 述 : 从I2c总线接收1个字节的数据/命令
//备 注 : 返回接收到的数据/命令
//最后修改时间 : 2004-2-18
//*****************************************************************
u08 I2c_Rev_Byte(void)
{
u08 retc;
u08 BitCnt;
retc=0;
SDA_1 //置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop(15);
SCL_0 //置时钟线为低,准备接收数据位
_Nop(20);
SCL_1 //置时钟线为高使数据线上数据有效
_Nop(20);
retc=retc<<1;
if(bit_is_set(I2C_PIN,SDA))retc=retc+1; //读数据位,接收的数据位放入retc中
_Nop(20);
}
SCL_0
_Nop(20);
return(retc);
}
//*****************************************************************
//函 数 名 : Ack_I2c
//建 立 时 间 : 2004-2-17
//功 能 描 述 : 主机的发送应答信号
//备 注 : 没有返回值
//最后修改时间 : 2004-2-17
//*****************************************************************
void Ack_I2c(u08 a)
{
if(a==0)SDA_0 //在此发出应答或非应答信号
else SDA_1
_Nop(5);
SCL_1
_Nop(5);
SCL_0 //清时钟线,钳住I2C总线以便继续接收
_Nop(5);
}
//*****************************************************************
//函 数 名 : I2c_Read
//建 立 时 间 : 2004-2-18
//功 能 描 述 : 从I2C总线上读取数据/命令,icadder是从器件地址,adder
// 是从器件的寄存器(如果有的话),count是一次读取的的数量
// *buff读取的数据存放地址
//备 注 : 没有返回值
//最后修改时间 : 2004-2-18
//*****************************************************************
void I2c_Read(u08 icadder, u08 adder, u08 count, u08 *buff)
{
u08 i;
Start_I2c();
_Nop(5);
I2c_Send_Byte(icadder); //写入IC的地址
_Nop(10);
I2c_Send_Byte(adder); //写入寄存器地址
_Nop(10);
Stop_I2c(); //可查看I2C标准
_Nop(5);
Start_I2c();
_Nop(5);
I2c_Send_Byte(icadder+1);
_Nop(10);
for (i=0;i<count;i++)
{
*buff=I2c_Rev_Byte();
if (i!=count-1) Ack_I2c(0);//除最后一个字节外,其他都要从MASTER发应答。
buff++;
}
//SendAck();//除最后一个字节外,其他都要从MASTER发应答。
Ack_I2c(1);
Stop_I2c();
}
//*****************************************************************
//函 数 名 : I2c_Send
//建 立 时 间 : 2004-2-18
//功 能 描 述 : 从I2C总线上读取数据/命令,icadder是从器件地址,adder
// 是从器件的寄存器(如果有的话),value要写入的值
//备 注 : 有返回值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -