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

📄 24c02的读写asm.txt

📁 串行IIc总线型EEPROM24c02的读写汇编源程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	uint j;
	for(i;i>0;i--)
	{
		for(j=164;j>0;j--)
		;
	}
}
//**********************************************************
//延时
void delay(uint delay)
{
	while(delay>0)
	delay--;
}
//**********************************************************
//检测按键是否释放
void waitkey(void)
{
	temp=P2;
	temp=temp&0x0f;
	while(temp!=0x0f)
	{
		temp=P2;
		temp=temp&0x0f;
	}
}
//**********************************************************
//按测键盘,查出键号
void keyscan(void)
{
	uchar key;
	P2=0xff;
	P24=0;
	temp=P2;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delaynms(20);
		temp=P2;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P2;
			temp=temp&0x0f;
			switch(temp)
			{
				case 0x0e:
					key=0x00;
					break;
				case 0x0d:
					key=0x01;	
					break;
				case 0x0b:
					key=0x02;
					break;
				case 0x07:
					key=0x03;
					break;
			}
		}
	}
	waitkey();
	keyvalue=key;
	P2=0xff;
	P25=0;
	temp=P2;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delaynms(20);
		temp=P2;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P2;
			temp=temp&0x0f;
			switch(temp)
			{
				case 0x0e:
					key=0x04;
					break;
				case 0x0d:
					key=0x05;	
					break;
				case 0x0b:
					key=0x06;
					break;
				case 0x07:
					key=0x07;
					break;
			}
		}
	}
	waitkey();
	keyvalue=key;
	P2=0xff;
	P26=0;
	temp=P2;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delaynms(20);
		temp=P2;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P2;
			temp=temp&0x0f;
			switch(temp)
			{
				case 0x0e:
					key=0x08;
					break;
				case 0x0d:
					key=0x09;	
					break;
				case 0x0b:
					key=0x0a;
					break;
				case 0x07:
					key=0x0b;
					break;
			}
		}
	}
	waitkey();
	keyvalue=key;
	P2=0xff;
	P27=0;
	temp=P2;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delaynms(20);
		temp=P2;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P2;
			temp=temp&0x0f;
			switch(temp)
			{
				case 0x0e:
					key=0x0c;
					break;
				case 0x0d:
					key=0x0d;	
					break;
				case 0x0b:
					key=0x0e;
					break;
				case 0x07:
					key=0x0f;
					break;
			}
		}
	}
	waitkey();
	keyvalue=key;
}
//////////////////////////////////////////////////
//74138译码器,输出数码管位选信号
//////////////////////////////////////////////////
void sel74_138(uchar input)
{
  switch(input)
  {
    case 7:
      P04=1;
      P05=1;
      P06=1;
      break;
    case 6:
      P04=0;
      P05=1;
      P06=1;
      break;
    case 5:
      P04=1;
      P05=0;
      P06=1;
      break;
    case 4:
      P04=0;
      P05=0;
      P06=1;
      break;
    case 3:
      P04=1;
      P05=1;
      P06=0;
      break;
    case 2:
      P04=0;
      P05=1;
      P06=0;
      break;
    case 1:
      P04=1;
      P05=0;
      P06=0;
      break;
    case 0:
      P04=0;
      P05=0;
      P06=0;
      break;
    default:
      break;
  }
}
//***********************************************************
//显示函数
void display()
{	
	P0=disbuff[0];
	sel74_138(0);
	delaynms(3);
	P0=disbuff[1];
	sel74_138(1);
	delaynms(3);
	P0=disbuff[2];
	sel74_138(2);
	delaynms(3);
	P0=disbuff[3];
	sel74_138(3);
	delaynms(3);
	P0=disbuff[4];
	sel74_138(4);
	delaynms(3);
	P0=disbuff[5];
	sel74_138(5);
	delaynms(3);
	P0=disbuff[6];
	sel74_138(6);
	delaynms(3);
	P0=disbuff[7];
	sel74_138(7);
	delaynms(3);
}
//***********************************************************
//启动总线信号	
void start(void)
{
	scl=0;
	sda=1;
	_nop_();
	scl=1;
	delay(4);
	sda=0;
	delay(4);
	scl=0;
}
//***********************************************************
//停止总线信号
void stop(void)
{
	scl=0;
	sda=0;
	_nop_();
	scl=1;
	delay(4);
	sda=1;
	delay(4);
}
//***********************************************************
//发送应答信号,发送或接收完8BIT(8T)后在第9个脉冲周期开始(低电平)
//期间由主机将SDA置低
void sendack(void)
{
	sda=0;
	_nop_();
	scl=1;
	delay(4);
	scl=0;
	delay(4);
}
//*************************************************************
//发送非应答信号,和应答信号刚好相反
void sendnack(void)
{
	sda=1;
	_nop_();
	scl=0;
	delay(4);
	scl=1;
	delay(4);
}
//*************************************************************
//检测应答信号
bit checkack(void)
{	
	bit flag;
	sda=1;
	scl=1;
	delay(4);
	flag=sda;//检测SDA状态,看是否接收到应答信号
	scl=0;//将SCL拉低,以备对SDA状态进行改变
	if(flag==1)
		return(FLASE);
	else
		return(TRUE);
}
//**************************************************************
//发送一个BIT "1"
void send1(void)
{
	sda=1;
	scl=1;
	delay(4);
	scl=0;
	delay(4);
	sda=0;
}
//**************************************************************
//发送一个BIT"0"
void send0(void)
{
	sda=0;
	scl=1;
	delay(4);
	scl=0;
	delay(4);
}
//**************************************************************
//向IIC总线上写入一个字节数据
void writeonebyte(uchar b)
{
	uchar k;
	for(k=0;k<8;k++)
	{
		if((b<<k)&0x80)
			send1();
		else 
			send0();
	}

}
//**************************************************************
//从IIC总线上读取一个字节数据
uchar readonebyte(void)
{
	uchar m,receiveonebyte=0;
	for(m=0;m<8;m++)
	{	
		sda=1;
		scl=1;
		delay(4);	
		receiveonebyte=receiveonebyte<<1;
		receiveonebyte=receiveonebyte|((uchar)(sda));
		scl=0;
	}

	return(receiveonebyte);
}
//***************************************************************
//向IIC总线上写入N个字节数据
//入口参数:divesadrw--器件地址,romadr--器件内部寻址字节地址
//*p--指向待发送的数据缓冲区首址,y--待发送的数据字节数
void writenbyte(uchar *p,uchar divesadrw,uchar romadr,uchar y)
{
	bit ack;
	do
	{
		start();			//启动IIC总线
		writeonebyte(divesadrw);//发送器件地址
		ack=checkack();
	}while(ack==0);
	do	
	{
		writeonebyte(romadr);//发送器件内部寻址字节地址
		ack=checkack();
	}while(ack==0);
	for(;y!=0;y--)		//发送数据
	{
	again:writeonebyte(*p);
		 ack=checkack();		//检测应答
		 if(ack==0)
		    	goto again;	//如果错误,则再发一次
		 else
			p++; 
			continue;
	}
	stop();
	P1=0x55;
}
//****************************************************************
//从IIC总线上读N个字节数据
//入口参数:divesadrw--器件地址,romadr--器件内部寻址字节地址
//divecadrr--器件地址,p--待接收的数据字节数
void readnbyte(uchar divesadrw,uchar romadr,uchar divesadrr,uchar p)
{
	uchar t;
	bit ack1;
	start();
	do
	{
		writeonebyte(divesadrw);//发送器件地址
		ack1=checkack();
	}while(ack1==0);
	do	
	{
		writeonebyte(romadr);//发送器件内部寻址字节地址
		ack1=checkack();
	}while(ack1==0);	
	do
	{
		writeonebyte(divesadrr);
		ack1=checkack();
	}while(ack1==0);
	for(t=0;t<p;t++)
	{
		receivebuff[t]=readonebyte();
		sendack();	//向发送器件发送应答信号
	}
	sendnack();//发送非应答信号
	stop();
	P1=0xaa;
}
//***********************************************************
//键功能操作
void keydone(void)
{
	if(keyvalue<0x0a)
	{
		disbuff[0]=keyvalue;
		sendbuff[0]=keyvalue;
		display();
	}
	else 
	{
		switch(keyvalue)
		{
			case 0x0a:		//"存入"键
				writenbyte(sendbuff,0xa0,0x00,0x01);
				display();
				break;
			case 0x0b:		//"调出"键
				readnbyte(0xa0,0x00,0xa1,0x01);
				disbuff[7]=receivebuff[0];
				display();
				break;
			case 0x0c:		//"清0"键
				sendbuff[0]=0;
				writenbyte(sendbuff,0xa0,0x00,0x01);
				display();
				break;
			default:
				break;
		}
	}
}
//********************************************************************
//主函数
void main()
{
	P0=0x00;
	P1=0x00;
	P2=0x0f;
	P3=0x00;
	while(1)
	{
		keyscan();
		keydone();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -