2402读写函数 ///////////////////////////////// #include<reg52.h> #define uchar unsigned char #define uint unsigned int #define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0xa1 sbit WP=P1^5; sbit SCL=P1^6; sbit SDA=P1^7; void DelayMs(uint number); extern void Watchdog();//喂狗 void Start_2402()//启动2402 { SDA=1;SDA=1; SCL=1;SCL=1;//延迟 SDA=0;SDA=0;//延迟 SCL=0;SCL=0; } void Stop_2402()//关闭2402 { SCL=0;SCL=0; SDA=0;SDA=0;//延迟 SCL=1;SCL=1;//延迟 SDA=1;SDA=1; } bit TestACK()//测试ACK { bit ErrorBit; SDA=1;SDA=1;//延迟 SCL=1;SCL=1;//延迟 ErrorBit=SDA; SCL=0;SCL=0; return(ErrorBit); } void NoACK() { SDA=1;SDA=1; SDA=1;SDA=1; SCL=1;SCL=1; SCL=1;SCL=1; SCL=0; } void Write8Bit(uchar input)//写8bit { uchar temp; for(temp=8;temp!=0;temp--) { SDA=(bit)(input&0x80); SCL=1;SCL=1;//延迟 SCL=0;SCL=0;//延迟 input=input<<1; } } void Write2402(uchar ch,uchar address)//写一个字节 { Start_2402(); Write8Bit(WriteDeviceAddress);//写器件地址 TestACK(); Write8Bit(address);//写操作地址 TestACK(); Write8Bit(ch); TestACK(); Stop_2402(); DelayMs(10); } uchar Read8bit()//读8bit { uchar temp; uchar rbyte=0; for(temp=8;temp!=0;temp--) { SCL=1;SCL=1; rbyte=rbyte<<1; rbyte=rbyte|((uchar)(SDA)); SCL=0; } return(rbyte); } uchar Read2402(uchar address)//读一个字节 { uchar ch; Start_2402(); Write8Bit(WriteDeviceAddress);//写器件地址 TestACK(); Write8Bit(address); TestACK();
Start_2402(); Write8Bit(ReadDeviceAddress);//写操作地址 TestACK(); ch=Read8bit();//读数 NoACK(); Stop_2402(); return (ch); } void DelayMs(uint number) { uchar temp; for(;number!=0;number--) { for(temp=224;temp!=0;temp--); } } //////////////////////////////////////////////////////// 主函数中的调用部分
写操作
//////////////////////////////////// if(!(VT100&&VT300&&VT500&&VT700&&VT900)) { if(VT100==0)//写入VT=100 { if(!UP) { Write2402(VT,0x00);//写低字节 DelayMs(20); Write2402(VT>>8,0x01);//右移写高字节 DelayMs(20); DISPLAY_VT=100; } } if(VT300==0)//写入VT=300 { if(!UP) { Write2402(VT,0x02);//写低字节 DelayMs(20); Write2402(VT>>8,0x03);//右移写高字节 DelayMs(20); DISPLAY_VT=300; } } if(VT500==0)//写入VT=500 { if(!UP) { Write2402(VT,0x04);//写低字节 DelayMs(20); Write2402(VT>>8,0x05);//右移写高字节 DelayMs(20); DISPLAY_VT=500; } } if(VT700==0) { if(!UP) { Write2402(VT,0x06);//写低字节 DelayMs(20); Write2402(VT>>8,0x07);//右移写高字节 DelayMs(20); DISPLAY_VT=700; } } if(VT900==0) { if(!UP) { Write2402(VT,0x08);//写低字节 DelayMs(20); Write2402(VT>>8,0x09);//右移写高字节 DelayMs(20); DISPLAY_VT=900; } } }
读操作
FLOW_1_LOW=Read2402(0x00);//读出低字节 DelayMs(20); FLOW_1_HIGH=Read2402(0x01);//读出高字节 DelayMs(20); FLOW_1=((FLOW_1_HIGH<<8)+FLOW_1_LOW);//读出VT=100
FLOW_2_LOW=Read2402(0x02);//读出低字节 DelayMs(20); FLOW_2_HIGH=Read2402(0x03);//读出高字节 DelayMs(20); FLOW_2=((FLOW_2_HIGH<<8)+FLOW_2_LOW);//读出VT=300
FLOW_3_LOW=Read2402(0x04);//读出低字节读出 DelayMs(20); FLOW_3_HIGH=Read2402(0x05);//读出高字节 DelayMs(20); FLOW_3=((FLOW_3_HIGH<<8)+FLOW_3_LOW);//VT=500
FLOW_4_LOW=Read2402(0x06);//读出低字节 DelayMs(20); FLOW_4_HIGH=Read2402(0x07);//读出高字节 DelayMs(20); FLOW_4=((FLOW_4_HIGH<<8)+FLOW_4_LOW);//读出VT=700
FLOW_5_LOW=Read2402(0x08);//读出低字节 DelayMs(20); FLOW_5_HIGH=Read2402(0x09);//读出高字节 DelayMs(20); FLOW_5=((FLOW_5_HIGH<<8)+FLOW_5_LOW);//读出VT=900
这时写和读的地址是从0X00--0X09的 用编程器读出来的时候也是从0X00开始的
但是在把地址改成0X6000--0X6009的时候,写到的位置还和地址为0X00时一样
后又把地址改成6000==6009,写的位置就不一样了时从70开始的 如下如图 有点不明白,望大虾们提示
|