?? zlg7290.txt
字號:
ZLG7290的IIC驅(qū)動C語言程序
ZLG7290的IIC驅(qū)動C語言程序
作者:未知 AVR單片機來源:網(wǎng)絡(luò) 點擊數(shù): 1336 更新時間:2007-10-1
//#####################---文件信息-----############################
//文 件 名 : 7290.c
//創(chuàng) 建 人 : ZXJ
//建 立 時 間 : 2004-2-17
//版 本 描 述 : V1.0
//功 能 描 述 : ZLG7290使用代碼 ,使用模擬I2C
//備 注 : 調(diào)試環(huán)境為AVRGCC 3.3.1,MCU為Mega8 晶振為3.6864MHZ
// 由于ZLG7290的速度很慢,換晶振時注意延時程序的調(diào)整.實際測試中
// 死機現(xiàn)象比較嚴重,建議使用控制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);
//*****************************************************************
//函 數(shù) 名 : _Nop
//建 立 時 間 : 2004-2-17
//功 能 描 述 : 延時函數(shù),最大值為0xff
//備 注 : 沒有返回值
//最后修改時間 : 2004-2-18
//*****************************************************************
void _Nop(u08 dly)
{
u08 i;
for(i=0;i<dly;i++)
{
asm("nop");
}
}
//==============================================
//I2C通訊協(xié)議實現(xiàn)部分
//==============================================
//*****************************************************************
//函 數(shù) 名 : Start_I2c
//建 立 時 間 : 2004-2-17
//功 能 描 述 : 啟動模擬I2C通訊
//備 注 : 沒有返回值
//最后修改時間 : 2004-2-17
//*****************************************************************
void Start_I2c(void)
{
SDA_1; //發(fā)送起始條件的數(shù)據(jù)信號
_Nop(1);
SCL_1;
_Nop(5); //起始條件建立時間大于4.7us,延時
SDA_0; //發(fā)送起始信號
_Nop(5); // 起始條件鎖定時間大于4μs
SCL_0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
_Nop(5);
}
//*****************************************************************
//函 數(shù) 名 : Stop_I2c
//建 立 時 間 : 2004-2-17
//功 能 描 述 : 停止模擬I2C通訊
//備 注 : 沒有返回值
//最后修改時間 : 2004-2-17
//*****************************************************************
void Stop_I2c(void)
{
SDA_0 //發(fā)送結(jié)束條件的數(shù)據(jù)信號
_Nop(1);
SCL_1 //結(jié)束條件建立時間大于4μs
_Nop(5);
SDA_1 //發(fā)送I2C總線結(jié)束信號
_Nop(5);
}
//*****************************************************************
//函 數(shù) 名 : I2c_Send_Byte
//建 立 時 間 : 2004-2-17
//功 能 描 述 : 向I2c總線發(fā)送1個字節(jié)的數(shù)據(jù)/命令
//備 注 : 沒有返回值
//最后修改時間 : 2004-2-18
//*****************************************************************
void I2c_Send_Byte(u08 data)
{
u08 BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
{
if((data<<BitCnt)&0x80)
SDA_1 //判斷發(fā)送位
else
SDA_0
_Nop(15);
SCL_1 //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
_Nop(15);
SCL_0
}
_Nop(15);
SDA_1 //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應(yīng)答位
_Nop(15);
SCL_1
_Nop(15);
if(bit_is_set(I2C_PIN,SDA))ack=0;
else ack=1; //判斷是否接收到應(yīng)答信號
SCL_0
_Nop(15);
}
//*****************************************************************
//函 數(shù) 名 : Stop_I2c
//建 立 時 間 : 2004-2-17
//功 能 描 述 : 從I2c總線接收1個字節(jié)的數(shù)據(jù)/命令
//備 注 : 返回接收到的數(shù)據(jù)/命令
//最后修改時間 : 2004-2-18
//*****************************************************************
u08 I2c_Rev_Byte(void)
{
u08 retc;
u08 BitCnt;
retc=0;
SDA_1 //置數(shù)據(jù)線為輸入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop(15);
SCL_0 //置時鐘線為低,準備接收數(shù)據(jù)位
_Nop(20);
SCL_1 //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
_Nop(20);
retc=retc<<1;
if(bit_is_set(I2C_PIN,SDA))retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
_Nop(20);
}
SCL_0
_Nop(20);
return(retc);
}
//*****************************************************************
//函 數(shù) 名 : Ack_I2c
//建 立 時 間 : 2004-2-17
//功 能 描 述 : 主機的發(fā)送應(yīng)答信號
//備 注 : 沒有返回值
//最后修改時間 : 2004-2-17
//*****************************************************************
void Ack_I2c(u08 a)
{
if(a==0)SDA_0 //在此發(fā)出應(yīng)答或非應(yīng)答信號
else SDA_1
_Nop(5);
SCL_1
_Nop(5);
SCL_0 //清時鐘線,鉗住I2C總線以便繼續(xù)接收
_Nop(5);
}
//*****************************************************************
//函 數(shù) 名 : I2c_Read
//建 立 時 間 : 2004-2-18
//功 能 描 述 : 從I2C總線上讀取數(shù)據(jù)/命令,icadder是從器件地址,adder
// 是從器件的寄存器(如果有的話),count是一次讀取的的數(shù)量
// *buff讀取的數(shù)據(jù)存放地址
//備 注 : 沒有返回值
//最后修改時間 : 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);//除最后一個字節(jié)外,其他都要從MASTER發(fā)應(yīng)答。
buff++;
}
//SendAck();//除最后一個字節(jié)外,其他都要從MASTER發(fā)應(yīng)答。
Ack_I2c(1);
Stop_I2c();
}
//*****************************************************************
//函 數(shù) 名 : I2c_Send
//建 立 時 間 : 2004-2-18
//功 能 描 述 : 從I2C總線上讀取數(shù)據(jù)/命令,icadder是從器件地址,adder
// 是從器件的寄存器(如果有的話),value要寫入的值
//備 注 : 有返回值
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -