|
#include <mega88.h>
#include <stdio.h> // 使用CVAVR的标准 Input/Output 函数
#include <delay.h> // 使用CVAVR的延时函数
#define EEPROM_BUS_ADDRESS 0xa0
#asm // 将 2 个通用I/O口定义成SDA、SCL,
.equ __i2c_port=0x08 // 本例使用PORTC
.equ __sda_bit=4 // SDA使用PC4
.equ __scl_bit=5 // SCL使用PC5
#endasm
#include <i2c.h>
// read a byte from the 24C02
unsigned char eeprom_read_00(unsigned int address)
{
unsigned char data;
i2c_start(); // 发起始信号
i2c_write(EEPROM_BUS_ADDRESS); // 发写从机写寻址字节
i2c_write(address); // 发存储单元地址字节
i2c_start(); // 发起始信号
i2c_write(EEPROM_BUS_ADDRESS | 1); // 发从机读寻址字节
data=i2c_read(0); // 读一个字节数据,返回NO ACK
i2c_stop(); // 发停止信号
return data;
}
// write a byte to the 24C02
void Eeprom_write_00(unsigned int address, unsigned char data)
{
i2c_start(); // 发起始信号
i2c_write(EEPROM_BUS_ADDRESS); // 发写从机写寻址字节
i2c_write(address); // 发存储单元地址字节
i2c_write(data); // 写一个字节数据到24C256
i2c_stop(); // 发停止信号
delay_ms(10); // 等待10ms,保证24C256内部写操作完成再进行新操作
}
void main(void)
{
unsigned char i;
int i3;
DDRC = 0x2E;
PORTC = 0x2E;
DDRB = 0x2C;
PORTB = 0x3C;
DDRD = 0x00;
PORTD = 0x04;
i2c_init();
// initialize the I2C bus
while(1)
{
Eeprom_write_00(0x0f,0x09); //测试的这个命令不能执行。
//将上面的命令注解了,发现i2c_write(0xa0);不好用。
i = eeprom_read_00(0x0f);
PORTD=i;
delay_ms(1000);
}
}
马老师,帮我看看我用书上的程序改成了24C02的代码。怎么不好用呀! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|