#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define _BV(bit) (1 << (bit))#ifndef cbi#define cbi(reg,bit) reg &= ~_BV(bit)#endif#ifndef sbi#define sbi(reg,bit) reg |= _BV(bit)#endifextern uchar dog;/*void delay_1ms(uchar xtal){uchar i;for(i=0;i<(uint)(143*xtal-2);i++){;}}//2 延时nmsvoid delay_ms(uchar m, uchar fosc){uchar i;i=0;while(i<m){delay_1ms(fosc);i++;}}*///-----------------------------IIC操作子程序-------------------------------//IIC写操作//address_device为器件地址,0xa0为24C64//address_reg1为寄存器地址1,address_reg2为寄存器地址2//data_package为写的数据void twi_write(uchar address_reg1,uchar address_reg2, uchar data_package) {//TWI预分频为4分频//CLI();sbi(TWSR,TWPS0);cbi(TWSR,TWPS1);TWBR=0x20;//SCL频率0x20=29khz ,begin:dog=1;TWCR=_BV(TWEN)|_BV(TWSTA)|_BV(TWINT);while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示开始信号发送完毕dog=1;if(((TWSR&0xF8)!=0x08)&((TWSR&0xF8)!=0x10))//检查状态寄存器,如果状态字不是START或RESTART,重新发送开始信号goto begin;TWDR=0xa0;//将器件地址写入到TWDR寄存器,TWINT位清零,启动发送地址// TWDR="0xa0";//%%%%%%%%%%%%%%%TWCR=_BV(TWEN)|_BV(TWINT);while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x18)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号goto begin;//---发送寄存器地址TWDR=address_reg1;//写寄存器地址//TWDR=address_reg1;//%%%%%%%%%%%%%%%TWCR=_BV(TWEN)|_BV(TWINT);while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号goto begin;//---发送EEPROM的第二个地址TWDR=address_reg2;//写寄存器地址//TWDR=address_reg2;//%%%%%%%%%%%%%%%TWCR=_BV(TWEN)|_BV(TWINT);while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号goto begin;//---写入数据TWDR=data_package;//将数据载入到TWDR寄存器,TWINT位清零,启动发送地址//TWDR=data_package;//%%%%%%%%%%%%%%%TWCR=_BV(TWINT)|_BV(TWEN);while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线数据已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是数据ACK,重新发送开始信号goto begin;TWCR=_BV(TWINT)|_BV(TWSTO)|_BV(TWEN);//发送STOP信号//delay_ms(2,8);//delay_ms(2,8);//SEI();//delay_ms(2,8);//PORTC&=~(1<<6);}//-------------------------------------------//IIC读操作//address_reg1为寄存器地址,address_reg2为寄存器地址2/////////////////////////////////uchar twi_read(uchar address_reg1,uchar address_reg2){uchar result1=0;sbi(TWSR,TWPS0);//TWI预分频为4分频cbi(TWSR,TWPS1);TWBR=0x20;//SCL频率92160HZbegin://delay_ms(2,8);dog=1;TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//发送开始信号while(!(TWCR&(1<<TWINT)))//等待开始信号发送完毕dog=1;if(((TWSR&0xF8)!=0x08)&((TWSR&0xF8)!=0x10))//检查TWI状态寄存器,如果状态字不是START或RESTART,重新发送开始信号goto begin;//---发送器件地址TWDR=0xa0;//发器件写地址,TWINT位清零,启动发送%%%%%%%%%%%%%% TWCR=(1<<TWINT)|(1<<TWEN);while(!(TWCR&(1<<TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x18)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号goto begin;//---发送寄存器地址TWDR=address_reg1;//写寄存器地址,TWINT位清零,启动发送%%%%%%%%%%%%%%%%%%TWCR=(1<<TWINT)|(1<<TWEN);while(!(TWCR&(1<<TWINT)))//等待TWINT置位,TWINT置位表示总线数据已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是数据ACK,重新发送开始信号goto begin;//---发送EEPROM的第二个地址TWDR=address_reg2;//写寄存器地址//TWDR=address_reg2;//%%%%%%%%%%%%%%%TWCR=_BV(TWEN)|_BV(TWINT);while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号goto begin;//---发送起始信号TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//发送开始信号while(!(TWCR&(1<<TWINT)))//等待TWINT置位,TWINT置位表示开始信号发送完毕dog=1;if(((TWSR&0xF8)!=0x08)&((TWSR&0xF8)!=0x10))//检查TWI状态寄存器,如果状态字不是START或RESTART,重新发送开始信号goto begin;//---发送读命令TWDR=0xa0+1;//读器件地址写入到TWDR寄存器,TWINT位清零,启动发送TWCR=(1<<TWINT)|(1<<TWEN);while(!(TWCR&(1<<TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACKdog=1;if((TWSR&0xF8)!=0x40)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号goto begin;TWCR=(1<<TWINT)|(1<<TWEN);//发送NACK信号while(!(TWCR&(1<<TWINT)))dog=1;if((TWSR&0xF8)!=0x58)goto begin;TWCR=(1<<TWSTO)|(1<<TWEN);//发送STOP信号result1=TWDR;//将TWDR寄存器的数据读入//delay_ms(2,8);//delay_ms(2,8);//delay_ms(2,8);return result1;}void SETPA(uchar b,uchar v){if(v==0) PORTA&=~(1<<b);else if(v==1) PORTA|=(1<<b);}void SETPB(uchar b,uchar v){if(v==0) PORTB&=~(1<<b);else if(v==1) PORTB|=(1<<b);}void SETPC(uchar b,uchar v){if(v==0) PORTC&=~(1<<b);else if(v==1) PORTC|=(1<<b);}void SETPD(uchar b,uchar v){if(v==0) PORTD&=~(1<<b);else if(v==1) PORTD|=(1<<b);}void SETPE(uchar b,uchar v){if(v==0) PORTE&=~(1<<b);else if(v==1) PORTE|=(1<<b);}void SETPF(uchar b,uchar v){if(v==0) PORTF&=~(1<<b);else if(v==1) PORTF|=(1<<b); }void SETPG(uchar b,uchar v) {if(v==0) PORTG&=~(1<<b); else if(v==1) PORTG|=(1<<b); }。