?? 24c16.c.c
字號:
#include <msp430x43x.h>
#define iic_io_init P4OUT &= 0XFC //定義I/O口接線
#define iic_set_sda P4DIR &= 0XFD
#define iic_clr_sda P4DIR |= 0X02
#define iic_set_scl P4DIR &= 0XFE
#define iic_clr_scl P4DIR |= 0X01
#define iic_io_data P4IN & 0X02 //判斷接受的數(shù)據(jù)是1還是0
unsigned char ack_flag;
//延時函數(shù)
void iic_delay(void)
{
int i;
for(i=0;i<50;i++);
}
//啟動I2C
void start_iic(void)
{
iic_io_init;
iic_set_sda;
iic_delay();
iic_set_scl;
iic_delay();
iic_clr_sda;
iic_delay();
iic_clr_scl;
iic_delay();
}
// 停止IIC
void stop_iic(void)
{
iic_clr_sda;
iic_delay();
iic_set_scl;
iic_delay();
iic_set_sda;
iic_delay();
iic_clr_sda;
iic_delay();
iic_clr_scl;
}
//發(fā)送0
void send_zero(void)
{
iic_clr_sda;
iic_delay();
iic_set_scl;
iic_delay();
iic_clr_scl;
iic_delay();
}
//發(fā)送1
void send_one(void)
{
iic_set_sda;
iic_delay();
iic_set_scl;
iic_delay();
iic_clr_scl;
iic_delay();
iic_clr_sda;
iic_delay();
}
//發(fā)送1字節(jié)數(shù)據(jù)
void send_char(unsigned char sendtmp) //發(fā)送1字節(jié)程序,sendtemp是要發(fā)送的值
{
unsigned char cnt,tmp=0x80;
for(cnt=0; cnt<8; cnt++)
{
if((sendtmp & tmp)> 0)
{
send_one();
}else
{
send_zero();
}
tmp /= 2;
}
}
//讀1字節(jié)數(shù)據(jù)
unsigned char read_char(void)
{
unsigned char cnt,tmp=0x80,readtmp;
readtmp = 0x00;
for (cnt=0; cnt<8; cnt++)
{
iic_set_sda;
iic_delay();
iic_set_scl;
iic_delay();
if((iic_io_data) > 0x00)
{
readtmp |= tmp;
}
iic_clr_scl;
iic_delay();
tmp = tmp/2;
}
return readtmp; //返回讀出來的值
}
//應(yīng)答信號
void iic_ack(void)
{
ack_flag = 0x00;
iic_set_sda;
iic_delay();
iic_set_scl;
iic_delay();
if((iic_io_data) == 0x80 )
{
ack_flag = 0x01;
}
iic_clr_scl;
iic_delay();
}
//iic_nack
void iic_nack(void)
{
iic_set_sda;
iic_delay();
iic_clr_scl;
iic_delay();
iic_clr_scl;
iic_delay();
iic_clr_sda;
iic_delay();
}
//寫一個數(shù)據(jù)到EEPROM中
void write_eeprom(unsigned char ctrl_addres,unsigned char addres,unsigned char value)
//ctrl_addres是控制字段
//addres 是地址
//value 是值
{
unsigned char step_flag = 0x00;
while(step_flag < 0x03)
{
if(step_flag == 0x00)
{
start_iic();
send_char(ctrl_addres);
iic_ack();
if(ack_flag == 0) step_flag += 1;
}else if (step_flag == 1)
{
send_char(addres);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
}
else
{
step_flag = 0;
}
}else
{
send_char(value);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
}
else
{
step_flag = 0;
}
}
}
stop_iic();
}
//從EEPROM中讀數(shù)據(jù)
unsigned char read_eeprom(unsigned char ctrl_addres,unsigned char addres)
//ctrl_addres 是控制字段
//addres是地址
{
unsigned char step_flag=0,value;
while (step_flag <0x03)
{
if(step_flag == 0x00)
{
start_iic();
send_char(ctrl_addres);
iic_ack();
if(ack_flag == 0) step_flag += 1;
}
else if (step_flag == 1)
{
send_char(addres);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
}
else
{
step_flag = 0;
}
}
else
{
start_iic();
send_char(ctrl_addres+1);
iic_ack();
if(ack_flag == 0)
{
step_flag += 1;
value = read_char();
iic_nack();
}
else
{
step_flag = 0;
}
}
}
stop_iic();
return value;
}
void main( void )
{
unsigned char iic_value;
WDTCTL=WDTPW + WDTHOLD;
write_eeprom(0xa0,0x02,0x20);
iic_value = read_eeprom(0xa0,0x02);
iic_value = iic_value;
while(1);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -