📄 main.c
字号:
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/wdt.h>
#include <avr/iom48.h>
#include "IIC.h"
#include "Uart.h"
/***********************************/
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define byte unsigned char
#define word uint16_t
#define rd_device_add 0xa1
#define wr_device_add 0xa0
#define wr_8574_add 0x41
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define i2c_data (1<<4)
#define i2c_clk (1<<5)
#define ack 0x01
byte rx_buf[256];
byte Flagrx;
void SCIDeal(void);
void TxStr(char *buf,int len);
byte i2c_Write(byte Wdata,byte RomAddress);
byte P8574_Read(void);
void P8574_write(byte data);
void E2PROM_write(byte page,byte addr,byte value);
void delay_us(int time);
byte E2prom_Read(byte page,byte addr);
void TxBuf(byte ch);
byte E2prom_8574_Read(void);
byte E2PROM_Page_write(byte page,byte addr,byte *value,byte len);
void E2prom_Page_Read(byte Page,byte addr,byte *value);
byte flag2data=0;
int main(void)
{
byte temp;
//OSCCAL = 0x80;
DDRC=0xFF;
DDRD=0xFF;
PORTD=0x64;
SCIInit();
//IICInit();
sei();
PORTC=0xF8;
//temp=E2prom_8574_Read();
//TxBuf(temp);
for(;;)
{
if(Flagrx==2)
{
//TxBuf(0xbb);
SCIDeal();
Flagrx=0;
}
//TxBuf(0xbb);
/* temp=E2prom_8574_Read();
if((temp&3)!=3) PORTC|=1;else PORTC&=~1;
if((temp&12)!=12) PORTC|=2;else PORTC&=~2;
if((temp&48)!=48) PORTC|=4;else PORTC&=~4;
*/
}
}
void SCIInit(void)
{
/****************** UART接口初始化 ********************************/
UCSR0A=1<<U2X0;
//RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n
UCSR0B=(1<<RXCIE0)|(1<< RXEN0)|(1<< TXEN0);
//UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCSZn1 UCSZn0 UCPOLn UCSRnC
//UCSR0C=1<< UCSZ01 |1<<UCSZ00;
UBRR0=(u32)8000000/9600/8-1; //系统时钟选择8MHZ
}
void TxBuf(byte ch)
{
while ( !( UCSR0A & (1<<UDRE0)) );/* 将数据放入缓冲器,发送数据*/
UDR0 = ch;
UCSR0A |= (1<<TXC0);
}
void TxStr(char *buf,int len)
{
byte i;
for(i=0;i<len;i++)
TxBuf(*(buf+i));
}
//串口中断
SIGNAL(SIG_USART_RECV)
{
static byte lenth;
byte temp1;
temp1=UDR0;
if (Flagrx==1)
{
rx_buf[lenth+1]=temp1;
lenth++;
if((temp1==0xBB)&&(lenth==rx_buf[1]+1))
{
//TxBuf(lenth);
lenth=0;
Flagrx=2;
}
}else
{
if(temp1==0xAA)
{
Flagrx=1;
lenth=0;
rx_buf[0]=temp1;
}
}
}
void delay_us(int time)
{
do
{
time--;
}
while (time>1);
}
void delay_ms(word time)
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
void SCIDeal(void)
{
byte reLen=0;
byte i;
word addr0;
byte page,addr;
UCSR0B&=~(0<<RXCIE0);
switch(rx_buf[2])
{
case 1:
for(i=0;i<rx_buf[3];i++)
{
addr0=rx_buf[4]*256+rx_buf[5]+i;
page=(byte)(addr0>>8);
addr=(byte)(addr0&0xFF);
delay_us(3000);
E2PROM_write(page,addr,rx_buf[i+6]);
}
rx_buf[3]=0xFE;
reLen=1;
break;
case 2://读E2prom
for(i=7;i<rx_buf[4]+7;i++)
{
*(rx_buf+i)=E2prom_Read(rx_buf[5],rx_buf[6]+i-7);
}
reLen=rx_buf[4]+4;
break;
case 3://读8574
rx_buf[3]=E2prom_8574_Read();
rx_buf[4]=0xFE;
reLen=2;
if((rx_buf[3]&3)!=3) PORTC|=1;else PORTC&=~1;
if((rx_buf[3]&12)!=12) PORTC|=2;else PORTC&=~2;
if((rx_buf[3]&48)!=48) PORTC|=4;else PORTC&=~4;
break;
case 4://写数据
E2PROM_Page_write(rx_buf[4],rx_buf[5],rx_buf+6,rx_buf[3]);
rx_buf[3]=0xFE;
reLen=2;
break;
default:;
}
rx_buf[1]=reLen+2;
rx_buf[reLen+3]=0xBB;
TxStr(rx_buf,reLen+4);
UCSR0B!=1<<RXCIE0;
}
void i2cwait(void){
delay_us(30);
}
void i2cstart(void){
PORTD=0x20;
i2cwait();
PORTC|=i2c_data; //1
PORTC|=i2c_clk; //1
i2cwait();
PORTC&=~i2c_data;//0
i2cwait();
PORTC&=~i2c_clk; //0
}
void i2cstop(void){
PORTC&=~i2c_data; //0
i2cwait();
PORTC|=i2c_clk; //1
i2cwait();
PORTC|=i2c_data; //1
}
void i2csentbyte(byte temp12){
unsigned char i=8;
while (i--){
if (temp12&0x80){PORTC|=i2c_data;}else{PORTC&=~i2c_data;}
temp12<<=1;
i2cwait();
PORTC|=i2c_clk; //1
i2cwait();
PORTC&=~i2c_clk;//0
}
//PORTC|=i2c_data; //1
DDRC&=~i2c_data; //设置data为输入
PORTD=0x40;
i2cwait();
PORTC|=i2c_clk; //1
i2cwait();
//PORTD=0x44;
if (PINC&i2c_data){flag2data|=ack;}else{flag2data&=~ack;}
PORTC&=~i2c_clk; //0
PORTD=0x20;
DDRC|=i2c_data; //设置data为输出
PORTC&=~i2c_data;
}
uchar i2creceivebyte(void){
unsigned char i,temp12=0;
DDRC&=~i2c_data; //设置data为输入
//TxBuf(DDRC);
PORTD=0x44;
i2cwait();
PORTC|=i2c_data; //1
for(i=0;i<8;i++){
PORTC|=i2c_clk; //1
PORTC|=i2c_data; //1
i2cwait();
temp12<<=1;
if (PINC&i2c_data){temp12++;}
PORTC&=~i2c_clk; //0
i2cwait();
}
DDRC|=i2c_data; //设置data为输出
PORTD=0x20;
return temp12;
}
void sendacknowledge(uchar flagtemp){
if (flagtemp){PORTC|=i2c_data;}else{PORTC&=~i2c_data;}
PORTC|=i2c_clk; //1
i2cwait();
PORTD&=~i2c_clk;//0
}
/*
E2PROM_write(地址,数据),写一个字节数据
*/
void E2PROM_write(byte page,byte addr,byte value)
{
i2cstart();
i2csentbyte(wr_device_add|(page<<1));
if (flag2data&ack)
{
i2cstop();
return;
}
i2csentbyte(addr);
if (flag2data&ack)
{
i2cstop();
TxBuf(flag2data);
return;
}
i2csentbyte(value);
if (flag2data&ack)
{
i2cstop();
return;
}
i2cstop();
delay_ms(1);
}
byte E2PROM_Page_write(byte page,byte addr,byte *value,byte len)
{
byte e2paddr=wr_device_add;
byte i;
e2paddr|=(page<<1);
i2cstart();
i2csentbyte(e2paddr);
if (flag2data&ack)
{
i2cstop();
return 0;
}
i2csentbyte(addr&0xF0);
if (flag2data&ack)
{
i2cstop();
TxBuf(flag2data);
return 0;
}
for(i=0;i<len;i++)
{
i2csentbyte(*(value+i));
if (flag2data&ack)
{
i2cstop();
return 0;
}
}
i2cstop();
delay_ms(1);
return 1;
}
byte E2prom_Read(byte Page,byte addr)
{
byte value;
i2cstart();
i2csentbyte(wr_device_add|(Page<<1));
i2csentbyte(addr);
i2cstart();
i2csentbyte(rd_device_add|(Page<<1));
value=i2creceivebyte();
sendacknowledge(1);
i2cstop();
return value;
}
void E2prom_Page_Read(byte Page,byte addr,byte *value)
{
byte i;
i2cstart();
i2csentbyte(wr_device_add|(Page<<1));
i2csentbyte(addr&0xF0);
i2cstart();
i2csentbyte(rd_device_add|(Page<<1));
for(i=0;i<15;i++)
{
*(value+i)=i2creceivebyte();
sendacknowledge(0);
}
*(value+15)=i2creceivebyte();
sendacknowledge(1);
i2cstop();
}
byte E2prom_8574_Read(void)
{
byte value;
i2cstart();
i2csentbyte(wr_8574_add);
value=i2creceivebyte();
sendacknowledge(1);
i2cstop();
return value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -