| ??? 06/08/11 14:38 Read: times Msg Score: -1 -1 Message Not Useful |
#182537 - See if this code is of any help! Responding to: ???'s previous message |
#ifndef IC2_h
#define IC2_h
/* DEFINATIONS FOR DS1307RTC */
#define sda P0_0 // Serial data pin
#define scl P0_1 // Serial clock pin
#define set_sda (P0_0=0x01) // Set Serial data pin
#define set_scl (P0_1=0x01) // Set Serial clock pin
#define clr_sda (P0_0=0x00) // Clear Serial data pin
#define clr_scl (P0_1=0x00) // Clear Serial clock pin
#define I2C_DELAY 0x0F // For delay i2c bus
/*------------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
//Function prototypes
/*-----------------------------------------------------------------*/
void I2C_delay(void);
void I2C_clock(void);
void I2C_start(void);
void I2C_stop(void);
bit I2C_write(unsigned char dat);
unsigned char I2C_read(void);
/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void I2C_delay(void)
{
unsigned char i;
for(i=0; i<I2C_DELAY; i++);
}
void I2C_clock(void)
{
I2C_delay();
set_scl; // Start clock
I2C_delay();
clr_scl; // Clear SCL
}
void I2C_start(void)
{
if(scl)
clr_scl; // Clear SCL
set_sda; // Set SDA
set_scl; // Set SCL
I2C_delay();
clr_sda; // Clear SDA
I2C_delay();
clr_scl; // Clear SCL
}
void I2C_stop(void)
{
if(scl)
clr_scl; // Clear SCL
clr_sda; // Clear SDA
I2C_delay();
set_scl; // Set SCL
I2C_delay();
set_sda; // Set SDA
}
bit I2C_write(unsigned char dat)
{
bit data_bit;
unsigned char i;
for(i=0;i<8;i++) //sending 8 bits of data
{
data_bit = dat & 0x80; // Filter MSB bit keep to data_bit
sda = data_bit; // Send data_bit to SDA
I2C_clock(); // Call for send data to i2c bus
dat = dat<<1;
}
set_sda;
I2C_delay();
set_scl;
I2C_delay();
data_bit = sda; // Check acknowledge
clr_scl;
I2C_delay();
return data_bit; // If send_bit = 0 i2c is valid
}
unsigned char I2C_read(void)
{
bit rd_bit;
unsigned char i, dat;
dat = 0x00;
for(i=0;i<8;i++) // read 8 bit data
{
I2C_delay();
set_scl;
I2C_delay();
rd_bit = sda; // Keep to check acknowledge
dat = dat<<1;
dat = dat | rd_bit; // Keep bit data in dat
clr_scl;
}
return dat;
}
#endif
|
| Topic | Author | Date |
| Help me ? 89C52 interfacing with EEPROM 24C02 | 01/01/70 00:00 | |
| Do *not* use 'for' loops for delays! | 01/01/70 00:00 | |
| 100k is the upper limit | 01/01/70 00:00 | |
| HLL delay loops - just don't do it! | 01/01/70 00:00 | |
| that may be difficult | 01/01/70 00:00 | |
| but there is a way | 01/01/70 00:00 | |
| See if this code is of any help! | 01/01/70 00:00 | |
| I doubt it very much | 01/01/70 00:00 | |
| No, it isn't | 01/01/70 00:00 | |
| doubts 1,2,3 | 01/01/70 00:00 | |
| code for 24c02 wih 89c52 | 01/01/70 00:00 | |
| Do *not* use 'for' loops for delays! | 01/01/70 00:00 | |
code? | 01/01/70 00:00 |



