//==========================頭文件加載===============================
#include <reg52.h> //加載52系列單片機頭文件
//===========================端口聲明================================
sbit CLK=P3^6; //74hc574時鍾信號線
sbit G=P2^4; //74hc574使能
sbit IIC_SDA=P2^6; //聲明IIC總線的數據線接在單片機的P2.5端口。
sbit IIC_SCL=P2^5; //聲明IIC總線的時鍾線接在單片機的P2.7端口。
unsigned char tabl[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0BF,0x8C};
//0,1,2,3,4,5,6,7,8,9,-,P
//===========================函數聲明================================
void display(unsigned char aa);
void delay(unsigned int t);
void delay_IIC(void);
void IIC_Init(void);
void IIC_start(void);
void IIC_stop(void);
bit IIC_Tack(void);
void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data);
unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr);
void IIC_write_byte(unsigned char Data);
unsigned char IIC_read_byte(void);
//============================主函數=================================
void main() //主函數
{
unsigned char Data=2,addr=0x01;
//---------------------------系統初始化--------------------------
IIC_Init();//初始化IIC總線。
//P1=0x7f;//LED8先亮。
while(1) //死循環
{
IIC_single_byte_write(0xa0,0x02,Data);//保存LED的狀態
delay(50000);//延時約0.5S
Data=IIC_single_byte_read(0xa0,0x02);//讀出LED的狀態
if(Data<10)
Data++;
else
Data=0;
display(Data);
delay(50000);//延時約0.5S
}
}
//==========================功能子函數===============================
void delay(unsigned int t)
{//延時函數
while(t){t--;}; //延時循環計數
}
//-------------------------------------------------------------------
void delay_IIC(void)
{//IIC總線限速延時函數。
//該函數是空函數,延時4個機器周期。
;;
}
//-------------------------------------------------------------------
void IIC_Init(void)
{//IIC總線初始化函數
IIC_SDA=1;//釋放IIC總線的數據線。
IIC_SCL=1;//釋放IIC總線的時鍾線。
}
//-------------------------------------------------------------------
void IIC_start(void)
{//IIC總線產生起始信號函數
IIC_SDA=1;//拉高數據線
IIC_SCL=1;//拉高時鍾線
delay_IIC();
IIC_SDA=0;//在時鍾線為高電平時,拉低數據線,產生起始信號。
delay_IIC();
IIC_SCL=0;//拉低時鍾線
}
//-------------------------------------------------------------------
void IIC_stop(void)
{//IIC總線產生停止信號函數
IIC_SDA=0;//拉低數據線
delay_IIC();
IIC_SCL=1;//拉高時鍾線。
delay_IIC();
IIC_SDA=1;//時鍾時線為高電平時,拉高數據線,產生停止信號。
delay_IIC();
}
//-------------------------------------------------------------------
bit IIC_Tack(void)
{//接收應答信號函數
bit ack;//定義一個位變量,來暫存應答狀態。
IIC_SDA=1;//釋放數據總線,准備接收應答信號。
delay_IIC();
IIC_SCL=1;//拉高時鍾線。
delay_IIC();
ack=IIC_SDA;//讀取應答信號的狀態。
delay_IIC();
IIC_SCL=0;//拉低時鍾線。
delay_IIC();
return ack;//返回應答信號的狀態,0表示應答,1表示非應答。
}
//-------------------------------------------------------------------
void IIC_write_byte(unsigned char Data)
{//向IIC總線寫入一個字節的數據函數
unsigned char i;
for(i=0;i<8;i++)//有8位數據
{
IIC_SDA=Data&0x80;//寫最高位的數據
delay_IIC();
IIC_SCL=1; //拉高時鍾線,將數寫入到設備中。
delay_IIC();
IIC_SCL=0;//拉低時鍾線,允許改變數據線的狀態
delay_IIC();
Data=Data<<1;//數據左移一位,把次高位放在最高位,為寫入次高位做准備
}
}
//-------------------------------------------------------------------
unsigned char IIC_read_byte()
{//從IIC總線讀取一個字節的數據函數
unsigned char i;
unsigned char Data; //定義一個緩沖寄存器。
for(i=0;i<8;i++)//有8位數據
{
IIC_SCL=1;//拉高時鍾線,為讀取下一位數據做准備。
delay_IIC();
Data=Data<<1;//將緩沖字節的數據左移一位,准備讀取數據。
delay_IIC();
if(IIC_SDA)//如果數據線為高平電平。
Data=Data|0x1;//則給緩沖字節的最低位寫1。
IIC_SCL=0;//拉低時鍾線,為讀取下一位數據做准備。
delay_IIC();
}
return Data;//返回讀取的一個字節數據。
}
//-------------------------------------------------------------------
void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data)
{//向任意地址寫入一個字節數據函數
IIC_start();//產生起始信號
IIC_write_byte(Daddr);//寫入設備地址(寫)
IIC_Tack();//等待設備的應答
IIC_write_byte(Waddr);//寫入要操作的單元地址。
IIC_Tack();//等待設備的應答。
IIC_write_byte(Data);//寫入數據。
IIC_Tack();//等待設備的應答。
IIC_stop();//產生停止符號。
}
//-------------------------------------------------------------------
unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr)
{//從任意地址讀取一個字節數據函數
unsigned char Data;//定義一個緩沖寄存器。
IIC_start();//產生起始信號
IIC_write_byte(Daddr);//寫入設備地址(寫)
IIC_Tack();//等待設備的應答
IIC_write_byte(Waddr);//寫入要操作的單元地址。
IIC_Tack();//等待設備的應答。
IIC_start();//產生起始信號
IIC_write_byte(Daddr+1);//寫入設備地址(讀)。
IIC_Tack();//等待設備的應答。
Data=IIC_read_byte();//寫入數據。
IIC_stop();//產生停止符號。
//-------------------返回讀取的數據--------------------
return Data;//返回讀取的一個字節數據。
}
//-------------------------------------------------------------------
void display(unsigned char aa){
P2=0xf0;
G=0; //74hc574使能
CLK=0; //n產生上升沿,數據寫入74hc574
P0=tabl[aa]; //n給數碼
CLK=1;
}
//===================================================================
