⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 iic.c

📁 51的GPIO模拟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 + -