📄 demo_16_4__.c
字号:
/*****************************************************
File name : demo_16_4.c
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
#include <stdio.h> // 使用CVAVR的标准 Input/Output 函数
#include <delay.h> // 使用CVAVR的延时函数
#define EEPROM_BUS_ADDRESS 0xa0
// TWSR values (not bits)
#define TWPS0 0
#define TWPS1 1
#define TWEN 2
#define TWIE 0
#define TWEA 6
#define TWINT 7
#define TWSTA 5
#define TWSTO 4
#define TW_START 0x08 // Master
#define TW_REP_START 0x10
#define TW_MT_SLA_ACK 0x18 // Master Transmitter
#define TW_MT_SLA_NACK 0x20
#define TW_MT_DATA_ACK 0x28
#define TW_MT_DATA_NACK 0x30
#define TW_MT_ARB_LOST 0x38
#define TW_MR_ARB_LOST 0x38 // Master Receiver
#define TW_MR_SLA_ACK 0x40
#define TW_MR_SLA_NACK 0x48
#define TW_MR_DATA_ACK 0x50
#define TW_MR_DATA_NACK 0x58
#define Page_size 64 // 24C256页字节数
#define Page_mask Page_size-1 // 取页内地址屏蔽码
void I2C_init(void)
{
TWSR=0x00; // 2 Wire Bus initialization
TWBR=0x00; // Generate Acknowledge Pulse:On
TWAR=0x00; // 2 Wire Bus Slave Address:0h
TWCR=0x44; // General Call Recognition:Off,Bit Rate: 250.000 kHz
}
unsigned char I2C_start(void) //产生启动信号
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))){};
return 1;
}
void I2C_stop(void) //产生停止信号
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
unsigned char I2C_write(unsigned char c) //向总线写一字节,并返回有无应答
{
unsigned char ack=1;
TWDR = c;
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))){};
if((TWSR & 0xF8) != TW_MT_SLA_ACK)
ack = 0;
return ack;
}
unsigned char I2C_read(unsigned char ack) //读一字节 ack: 1时应答,0时不应答
{
if (ack)
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
else
TWCR = (1<<TWINT)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))){};
return(TWDR);
}
void EEprom_Page_write(unsigned int Addr,unsigned char n, unsigned char* arr)
{
unsigned char i;
I2C_start(); // 发起始信号
I2C_write(EEPROM_BUS_ADDRESS); // 发写从机写寻址字节
I2C_write(Addr>>8); // 发存储单元地址高字节
I2C_write(Addr); // 发存储单元地址低字节
for (i=1;i<=n;i++)
{
I2C_write(*arr); // 写一个字节数据到24C256
arr++;
}
I2C_stop(); // 发停止信号
delay_ms(10); // 等待10ms,保证24C256内部写操作完成再进行新操作
}
void EEprom_Write(unsigned int Addr,unsigned char n, unsigned char* arr)
{
unsigned char n_tmp;
n_tmp=Page_size-(unsigned char)(Addr&Page_mask);
if ((n>n_tmp)&&(n_tmp!=0))
{
EEprom_Page_write(Addr,n_tmp,arr);
Addr += n_tmp;
n -= n_tmp;
arr += n_tmp;
}
while (n >= Page_size)
{
EEprom_Page_write(Addr,Page_size, arr);
Addr += Page_size;
n -= Page_size;
arr += Page_size;
}
if (n!=0)
EEprom_Page_write(Addr,n,arr);
}
void EEprom_read(unsigned int Addr,unsigned char n, unsigned char* arr)
{
unsigned char i;
I2C_start(); // 发起始信号
I2C_write(EEPROM_BUS_ADDRESS); // 发写从机写寻址字节
I2C_write(Addr>>8); // 发存储单元地址高字节
I2C_write(Addr); // 发存储单元地址低字节
I2C_start(); // 发起始信号
I2C_write(EEPROM_BUS_ADDRESS | 1); // 发从机读寻址字节
for (i=1;i<=n-1;i++)
{
*arr = I2C_read(1); // 读一个字节数据,返回ACK
arr++;
}
*arr=I2C_read(0); // 读最后一个字节数据,返回NO ACK
I2C_stop(); // 发停止信号
}
void main(void)
{
unsigned char i,data[200];
UCSRA=0x00; // USART initialization
UCSRB=0x18; // Communication Parameters: 8 Data, 1 Stop, No Parity
UCSRC=0x86; // USART Receiver: On,USART Transmitter: On
UBRRH=0x00; // USART Mode: Asynchronous ,USART Baud Rate: 9600
UBRRL=0x19;
// ================================================
I2C_init(); // initialize the I2C bus
for (i=0;i<200;i++) {data[i]=i;} // 数组赋值
EEprom_Write(0x0aa,200,data); // 从0x00aa起写200个字节
for (i=0;i<200;i++) {data[i]=0;} // 数组清零
EEprom_read(0x0aa,200,data); // 从0x00aa起读200个字节
for (i=0;i<200;i++) {putchar(data[i]);} // 送PC检验
while (1){};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -