📄 twi.c
字号:
#include <iom88v.h>
#include <macros.h>
#pragma interrupt_handler twi_tov:25
void i2cbytewrite(unsigned int ,unsigned char );//写24C16
unsigned char i2cbyteread(unsigned int );//读24C16
void Cwrite_EEPROM(unsigned int ,unsigned char );
unsigned int addat(unsigned char );//读AD转换 第2路为压力
void disph(unsigned int); //显示
void dispra(unsigned char);
void delay1(unsigned int); //延时
unsigned char temp=0,sw=0,sw1=0;
unsigned int addat2=0,addat1;
//extern signed char temeeprom;
extern signed int tem_press;
extern signed int rate_ser[4];
extern unsigned char TWI_AR;
signed char angle_temp(unsigned char);
void autotwi(void)
{
unsigned char rdata;
TWBR=0x14; //波特率设置,须不小于10
TWAR=(TWI_AR<<1); //设置该机的地址
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE); //开TWI控制寄存器设置从机接收模式 基于中断
delay1(400);
if(sw==0) //temp未被寻址标识
{
TWCR=0; //关闭TWI 跳出自动校正...
return;
}
tem_press=angle_temp((addat(6)+rate_ser[2])/4);
//tem_in=addat(7); //内温
//tem_in*=5;
//tem_in=angle_temp(addat(7)/4)+rate_ser[2];
//tem_in=253-((tem_in*61)/100);
Cwrite_EEPROM(20,tem_press); //存储校正时的基准温度值
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
while(1)
{
WDR();
}
/*while((TWCR&0x80)==0){
{
WDR();
temp++;
if(temp>100)
break;
}*/
//TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN); //TWI控制寄存器设置 从机接收
//write(0x01,88);
//rdata=read(0x01);
//disph(rdata);
}
void twi_tov(void)
{
WDR();
switch(TWSR) //TWI状态寄存器,该程序只工作于主机发送与接收模式
{
case 0x60:sw=0xff;disph(101);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0x68:disph(102);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0x70:disph(103);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break; //被广播寻址,反回ACK
case 0x78:disph(104);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0x80:temp++; //数据已接收,返回ACK
if(temp==1)
{
addat1=TWDR;
}
if(temp==2)
{
temp=0;
addat1=(addat1<<8)+TWDR;
//dispra(tem_in);
addat2=addat(2);
disph(addat1);
addat1=addat1-addat2;
i2cbytewrite(addat2,addat1);
//i2cbytewrite(addat2-100,addat1>>8);//存高位
}
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
break;
case 0x88:disph(106);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0x90:disph(107);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0x98:disph(108);TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0xa0:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0xf8:break;
//case 0x00:TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWSTO);break;
/*case 0xa8://该行以下为发送 自已被寻址
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
break;
case 0xb0:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;
case 0xb8:{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);
}
break;
case 0xc0:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE); break;
case 0xc8:TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;*/
default:disph(109);/*TWSR=0xf8;*/TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);break;//停止指令
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -