📄 at24c64.c
字号:
//IAR+24系列读写。支持24C01到24C512,直接粘贴即可以用。
#include<iom169p.h>
#include<ioavr.h>
#include<comp_a90.h>
#include<intrinsics.h>
//#include"oil_include.h"
#define uchar unsigned char
#define uint unsigned int
#define SYSTEM_CLOCK 11059200
#define _NOP_nop(i) __delay_cycles(i)
#define _NOP_us(i) __delay_cycles((i*(unsigned long long)SYSTEM_CLOCK)/1000000)
#define _NOP_ms(i) __delay_cycles((i*(unsigned long long)SYSTEM_CLOCK)/1000)
#define _NOP_s(i) __delay_cycles((i*(unsigned long long)SYSTEM_CLOCK)/1)
#define SET_BIT(sfr,bit) (sfr|=(1<<bit)) //置位
#define CLEAR_BIT(sfr,bit) (sfr&=~(1<<bit)) //清零
#define REVERSE_BIT(sfr,bit) (sfr^|=(1<<bit))//反向
#define VALUE_BIT(sfr,bit) ((sfr>>bit)&1)//取值
unsigned char iic_data[32] =
{
0x00,0x80,0x00,0x80,0xFC,0x80,0x05,0xFE,0x85,0x04,0x4A,0x48,0x28,0x40,0x10,0x40,
0x18,0x40,0x18,0x60,0x24,0xAf,0x24,0x90,0xff,0x18,0x86,0x0E,0x38,0x04,0x00,0xff
};
unsigned char iic_read_data[32];
volatile uchar temp_iic;
#define SDA 6
#define SCL 7
#define DDRIIC DDRE
#define PORTIIC PORTE
#define PINIIC PINE
#define IIC_ADDRESS 0xA0
//设置IIC的延时时间
void delay_iic(void)
{
_NOP_us(5);
}
//IIC初始化SCL SDA均为输出 "1"
void iic_init(void)
{
SET_BIT(PORTIIC,SCL);
SET_BIT(DDRIIC,SCL);
SET_BIT(PORTIIC,SCL);
SET_BIT(PORTIIC,SDA);
SET_BIT(DDRIIC,SDA);
SET_BIT(PORTIIC,SDA);
}
//IIC起始
uchar iic_start(void)
{
SET_BIT(PORTIIC,SCL);
_NOP_us(5);
SET_BIT(PORTIIC,SDA);
SET_BIT(DDRIIC,SDA);
CLEAR_BIT(PORTIIC,SDA);
_NOP_us(5);
CLEAR_BIT(PORTIIC,SCL);
return(0);
}
//IIC结束
uchar iic_stop(void)
{
SET_BIT(DDRIIC,SDA);
CLEAR_BIT(PORTIIC,SDA);
CLEAR_BIT(PORTIIC,SCL);
SET_BIT(PORTIIC,SCL);
_NOP_us(5);
SET_BIT(PORTIIC,SDA);
_NOP_us(5);
return(0);
}
//IIC写一个字节
uchar iic_write_byte(uchar write_byte)
{
uchar i;
for(i=0;i<8;i++)
{
CLEAR_BIT(PORTIIC,SCL);
if(((write_byte<<i) & 0x80) == 0)CLEAR_BIT(PORTIIC,SDA);
else SET_BIT(PORTIIC,SDA);
SET_BIT(PORTIIC,SCL);
}
CLEAR_BIT(PORTIIC,SCL);
SET_BIT(PORTIIC,SDA);
CLEAR_BIT(DDRIIC,SDA);
SET_BIT(PORTIIC,SDA);
SET_BIT(PORTIIC,SCL);
_NOP_us(5);
i=VALUE_BIT(PINIIC,SDA);
CLEAR_BIT(PORTIIC,SCL);
SET_BIT(DDRIIC,SDA);
return(i);
}
//IIC写N个字节
uchar iic_write_nbyte(uint data_address,uchar write_nbyte)
{
uchar chip_address=IIC_ADDRESS;
uchar data_addressh,data_addressl;
uchar iic_dpr=0x00;
data_addressl=data_address;
data_addressh=data_address>>8;
iic_start();
temp_iic=iic_write_byte(chip_address);
temp_iic=iic_write_byte(data_addressh);
temp_iic=iic_write_byte(data_addressl);
while(write_nbyte--)
{
temp_iic=iic_write_byte(iic_data[iic_dpr++]);
}
iic_stop();
return(temp_iic);
}
//IIC读一个字节
uchar iic_read_byte(void)
{
uchar i;
CLEAR_BIT(PORTIIC,SCL);
CLEAR_BIT(DDRIIC,SDA);
SET_BIT(PORTIIC,SDA);
temp_iic=0x00;
for(i=0;i<8;i++)
{
SET_BIT(PORTIIC,SCL);
if(VALUE_BIT(PINIIC,SDA))
{
SET_BIT(temp_iic,(7-i));
}
else
{
CLEAR_BIT(temp_iic,(7-i));
}
CLEAR_BIT(PORTIIC,SCL);
}
SET_BIT(DDRIIC,SDA);
return(temp_iic);
}
//IIC读N个字节
uchar iic_read_nbyte(uint data_address,uchar read_nbyte)
{
uchar chip_address=IIC_ADDRESS;
uchar data_addressh,data_addressl;
uchar iic_dpr=0x00;
data_addressl=data_address;
data_addressh=data_address>>8;
iic_start();
temp_iic=iic_write_byte(chip_address);
temp_iic=iic_write_byte(data_addressh);
temp_iic=iic_write_byte(data_addressl);
iic_start();
temp_iic=iic_write_byte(chip_address | 0x01);
while(read_nbyte--)
{
iic_read_data[iic_dpr++]=iic_read_byte();
if(read_nbyte != 0x00)
{
CLEAR_BIT(PORTIIC,SDA);
_NOP_nop(4);
SET_BIT(PORTIIC,SCL);
}
}
iic_stop();
return(temp_iic);
}
//IIC写命令
uchar iic_write_command(uchar write_byte)
{
return(0);
}
void USART_Init( unsigned int baud )
{
/* 设置波特率*/
UBRR0H=(unsigned char)((0x0fff&(SYSTEM_CLOCK/(16*(unsigned long)baud)-1))>>8);
UBRR0L=(unsigned char)(0x0fff&(SYSTEM_CLOCK/(16*(unsigned long)baud)-1));
/* 接收器与发送器使能*/
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* 设置帧格式: 异步 无校验 8 个数据位, 1 个停止位*/
UCSR0C = (0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
}
void USART_Transmit( unsigned char data )
{
/* W 等待发送缓冲器为空 */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* 将数据放入缓冲器,发送数据 */
UDR0 = data;
}
void main()
{
USART_Init(9600);
iic_init();
iic_write_nbyte(0,32);
_NOP_s(1);
iic_read_nbyte(0,32);
for(unsigned char i=0; i<32; ++i)
USART_Transmit(iic_read_data[i]);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -