?? 2402.c
字號:
/************************************************************************************/
/* 程序名:AT24C02的讀取操作 */
/* */
/* 晶振:12.0 M CPU型號:AT89S52 */
/* */
/* */
/* 功能描述: 對單個AT24C02進行讀和寫的操作 */
/* */
/* http://www.mculover.net */
/* http://www.mculover.net/bbs */
/* */
/* */
/* 湘靈電子工作室 版權所有 */
/* 2006-02-20 */
/************************************************************************************/
#include "ir_type.h"
//#include "24C02.h"
#define TRUE 1
#define FALSE 0
#define Delay_TIME 60 /*經實驗,不要小于50!否則可能造成時序混亂*/
//unsigned char seg_tab[] = {0x41, 0xf5, 0x29, 0x31, 0x95, 0x13, 0x03, 0x75, 0x01, 0x11};//0-9數字
//static unsigned char DC=0x00;
/********** Function Definition 函數定義 ************/
void Delay2(unsigned int t) /*延時函數*/
{
while(t!=0)
t--;
}
void I2C_Start(void)
{
/*啟動I2C總線的函數,當SCL為高電平時使SDA產生一個負跳變*/
SDA=1;
SCL=1;
Delay2(Delay_TIME);
SDA=0;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
void I2C_Stop(void)
{
/*終止I2C總線,當SCL為高電平時使SDA產生一個正跳變*/
SDA=0;
SCL=1;
Delay2(Delay_TIME);
SDA=1;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
void SEND_0(void) /* SEND ACK */
{
/*發送0,在SCL為高電平時使SDA信號為低*/
SDA=0;
SCL=1;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
void SEND_1(void)
{
/*發送1,在SCL為高電平時使SDA信號為高*/
SDA=1;
SCL=1;
Delay2(Delay_TIME);
SCL=0;
Delay2(Delay_TIME);
}
bit Check_Acknowledge(void)
{
/*發送完一個字節后檢驗設備的應答信號*/
SDA=1;
SCL=1;
Delay2(Delay_TIME/2);
F0=SDA;
Delay2(Delay_TIME/2);
SCL=0;
Delay2(Delay_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
void WriteI2CByte(unsigned char b)reentrant
{
/*向I2C總線寫一個字節*/
unsigned char i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
unsigned char ReadI2CByte(void)reentrant
{
/*從I2C總線讀一個字節*/
unsigned char b=0,i;
for(i=0;i<8;i++)
{
SDA=1; /*釋放總線*/
SCL=1; /*接受數據*/
Delay2(10);
F0=SDA;
Delay2(10);
SCL=0;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/**********以下為讀寫24c02的函數******************************/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
bit acktemp=1;
/*write a byte to mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr); /*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata); /*thedata*/
acktemp=Check_Acknowledge();
I2C_Stop();
}
/************************************************************/
unsigned char Read_One_Byte(unsigned char addr)
{
bit acktemp=1;
unsigned char mydata;
/*read a byte from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();
return mydata;
I2C_Stop();
}
//調用方式如下:
//Write_One_Byte(0x10,0x04);
//k=Read_One_Byte(0x10);
/*************************************************
void main(void)
{
unsigned char tmp;
LED= 0;//選擇數碼管的第一位顯示
while(1)
{
if(K2 == 0)//判斷K5是否被按下
{
Delay(500);//延時消抖
if(K2 == 0)
{
Write_One_Byte(DC,0x07);//往2402的0X04地址寫如數值0X07
}
}
if(K3 == 0)
{
Delay(500);
if(K3 == 0)
{
tmp = Read_One_Byte(DC);//將讀出來的數值給tmp
//P0 = seg_tab[tmp];
LED=tmp;
Delay(50000);
}
}
}
}
*****************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -