?? 復件 iic.c
字號:
#include <REG51F.H>
#include<LED.h>
#include<intrins.h>
#define Uint unsigned int
#define Uchar unsigned char
#define ADDR_8SEG XBYTE[0x1000]
#define ADDR_SEL XBYTE[0x2000]
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit SCL=P1^4;
sbit SDA=P1^5;
#define WRITE 0xa0
#define READ 0xa1
Uchar Temp[6]={6,4,3,2,1,8};
Uint volatile clock;
#define DDD 500
void d5us(){
_nop_();_nop_();
_nop_();_nop_();
}
void I_ss(bit ss){ //ss=1:start;SS=0;stop//
SCL=0;
d5us();
SDA=ss;
d5us();
SCL=1;
d5us();
SDA=!ss;
d5us();
SCL=0;
}
void I_init(){
I_ss(0);
}
void I_sendB(Uchar ch){
Uchar chb;
for(chb=0;chb<8;chb++){
SCL=0;
d5us();
if(ch&0x80)SDA=1;
else SDA=0;
ch=ch<<1;
SCL=1;
d5us();
}
SCL=0;
}
void ACK(bit ack){
SDA=ack;
d5us();
SCL=1;
d5us();
SCL=0;
d5us();
}
void watch(){
SDA=1;
d5us();
SCL=1;
d5us();
SCL=0;
d5us();
//if(SDA==1){SCL=0;d5us();return 1;}
//else {SCL=0;d5us();return 0;}
}
void I_writeP(Uchar paddr,Uchar num,Uchar *pra){
Uchar i;
EA=0;
pra=Temp;
I_ss(1);
I_sendB(WRITE);
watch();
I_sendB(paddr);
watch();
for(i=0;i<num;i++)
{I_sendB(pra[i]);
watch();
}
I_ss(0);
d5us();d5us();
EA=1;
}
Uchar I_receiveB(){
Uchar read,i2;
read=0;
for(i2=0;i2<8;i2++){
SDA=1;
d5us();
SCL=1;
d5us();
read<<=1;
if(SDA)read++;
d5us();
SCL=0;
d5us();
}
return(read);
}
void I_readP(Uchar raddr,Uchar rnum,Uchar *sto){
Uchar i3;
EA=0;
sto=Temp;
I_ss(1);
I_sendB(WRITE);
watch();
I_sendB(raddr);
watch();
I_ss(1);
I_sendB(READ);
watch();
for(i3=0;i3<rnum;i3++){
sto[i3]=I_receiveB();
if(i3<rnum-1)ACK(0);
}
SDA=1;
d5us();
SCL=1;
d5us();
SCL=0;///////???????
d5us();
I_ss(0);
EA=1;
}
void Init_main(){
IE=0x82;
EA=1;ET0=1;
IP=0;
TMOD=0x01;
TR0=1;
TH0=0xb8;TL0=0; //timer0:5ms
P1=0xff;
}
void int1() interrupt 1
{ clock++;
TF0=0;
TH0=0xb8;
TL0=0;
}
void main(){
Uchar itemp;
Uint i;
I_init();
SCL=1;
d5us();
SDA=1;
Init_main();
while(1){
if(P1_0==0){Temp[0]++;Temp[0]=Temp[0]%10;}
if(P1_1==0){Temp[1]++;Temp[1]=Temp[1]%10;}
if(P1_2==0){Temp[0]=Temp[0]%10;Temp[1]=Temp[1]%10;Temp[2]=Temp[2]%10;Temp[3]=Temp[3]%10;
I_writeP(0x40,4,Temp);
clock=0;
while(clock<30);
}
if(P1_3==0){I_readP(0x40,4,Temp);
clock=0;while(clock<30);
}
for(itemp=0;itemp<4;itemp++){
LEDShutDown;
LEDSelDigi(itemp)
LEDSetVal(Temp[3-itemp]%10)
for(i=0;i<DDD;i++); }
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -