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

📄 24cxx.c.bak

📁 单片机开发板源程序适合初学者 第一部分4*4矩阵式键盘
💻 BAK
字号:
/*实验名称:读写AT24C02实验
  功能:用串口发送指令读出或写入00-7FH单无的内容,显示结果在LCD上显示
  读出(16进制数):AA 地址
  写入(16进制数):BB 地址 内容
  作者:http://www.mcuprog.com
        05-02-01
*/
#include <reg51.h>
#include <intrins.h>
#define Uchar unsigned char
#define Uint  unsigned int
#define SomeNOP(); _nop_();_nop_();_nop_(); 
//定义变量
Uchar recip,recsum,recdata[2];	//接收指针,接收个数,用户标志,接收存放数组
Uchar bdata myflag;
sbit readbit = myflag^0;	//读EEPROM标志
sbit writebit = myflag^1;	//写EEPROM标志
sbit rs232okbit = myflag^2;	//接收完一拍完整的指令

/*I2C要用到的口线定意*/
sbit SDA = P2^7;
sbit SCL = P2^6;

/*控制的口线定意*/
sbit E=P2^2;
sbit RW=P2^1;
sbit RS=P2^0;
sbit LEDLOCK=P3^2;	
//LCD驱动要用到的一些子程序
//-------------------------------------
void Delay(unsigned int t)   // delay 40us
{
 for(;t!=0;t--) ;
}
//=============================================
void SendCommandByte(unsigned char ch)
{
   RS=0;
   RW=0;
   P0=ch;
   E=1;
    Delay(1);
   E=0;
   Delay(100);  //delay 40us
}
//-------------------------------------------------------
void SendDataByte(unsigned char ch)
{  RS=1;
   RW=0;
   P0=ch;
   E=1;
       Delay(1);
   E=0;
   Delay(100); //delay 40us
}
//-------------------------------------------------
void InitLcd()
{SendCommandByte(0x30);
 SendCommandByte(0x30);
 SendCommandByte(0x30);
 SendCommandByte(0x38);	//设置工作方式
 SendCommandByte(0x0c); //显示状态设置
 SendCommandByte(0x01); //清屏
 SendCommandByte(0x06); //输入方式设置
}



/*----------------------I2C要用到的一些子程序---------------------------------*/
/***********************以下为一些用到的子程序*********************************/
/*延时子程序*/
void Delay_1ms(Uchar time)
{
	Uchar j;
	while(time--)
	{
		for(j=163;j!=0;j--)
		{;}
	}
}

/*I2C的起动程序*/
void I2CStart(void)	
{
	SDA = 1;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SDA = 0;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

/*I2C的停止程序*/
void I2CStop(void)
{
	SDA = 0;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SDA = 1;
	SomeNOP();
}

void ACK(void)			//Acknowledge信号
{
	SDA = 0;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

void NACK(void)			//没有Acknowledge信号
{
	SDA = 1;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

void AutoACK(void)		//在一定的时间内自动确定ACK的信号//
{
	Uchar i = 0;
	SCL = 1;
	SomeNOP();
	while((SDA == 1)&&(i<255))i++;
	SCL = 0;
	SomeNOP();
}

	
/*I2C写数据程序(向数据线上写一个BYTE)*/
void Writex(Uchar j)
{
	Uchar i,temp;
	temp = j;
	for (i=0;i<8;i++)	//串行移位,先送高位,再送低位//
	{
		temp =temp<<1;
		SCL = 0;
		SomeNOP();
		SDA = CY;
		SomeNOP();
		SCL = 1;
		SomeNOP();
	}
	SCL = 0;
	SomeNOP();
	SDA = 1;
	SomeNOP();
}
/*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
Uchar Readx(void)
{
	Uchar i,j,k=0;
	SCL = 0;
	SomeNOP();
	SDA = 1;
	for (i=0;i<8;i++)	// 串行移位,先读出高位,后读出低位//
	{
		SomeNOP();
		SCL = 1;
		SomeNOP();
		if(SDA ==1) j=1;
		else	j=0;
		k =(k<<1)|j;
		SCL = 0;
	}
	SomeNOP();		
	return(k); 		//返回读出的值//
}

//******************以下为对24CXX系列的读写程序******************************//
//*************24CXX的device address 为写0A0H,读为0A1H*********************//
/*某个地址写数据*/
void X24_Write(Uchar Addresslow,Uchar Write_date)
{
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	Writex(Write_date);
	AutoACK();
	I2CStop();
	Delay_1ms(10);
}

/*对某个地址读操作,函数值为读出的数据*/
Uchar X24_Read(Uchar Addresslow)
{	
	Uchar i;
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	I2CStart();
	Writex(0xA1);
	AutoACK();
	i =Readx();
	//ACK();	//注意:这里不能有ACK应答信号//
	I2CStop();
	Delay_1ms(0);
	return(i);
}

//以下为串行口中断程序,用于接收串行数据
void rs232(void) interrupt 4
{
	if(RI==1)
	{
		RI=0;
		if(SBUF==0xaa)
		{
			recsum=0x01;
			readbit=1;
			recip=0x00;
		}
		else
		{
			if(SBUF==0xbb)
			{
				recsum=0x02;
				writebit=1;
				recip=0x00;
			}
			else
			{
				recdata[recip]=SBUF;
				recip++;
				recsum--;
				if(recsum==0x00){rs232okbit=1;}
			}
		}
		
	}
}

//以下为定时器中断程序,
void time0(void) interrupt 1
{
	Uchar 	temp,k;
	TH0=0xfc;
	TL0=0x67;
	if(rs232okbit==1)
	{
		rs232okbit=0;
		if(readbit==1)
		{
			readbit=0;
			temp=X24_Read(recdata[0]);
			SendCommandByte(0x87);
			k=(recdata[0]>>4)&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);
			k=recdata[0]&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);

			SendCommandByte(0xC7);
			k=(temp>>4)&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);
			k=temp&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);	
		}
		if(writebit==1)
		{
			writebit=0;
			SendCommandByte(0x87);
			
			k=(recdata[0]>>4)&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);
			k=recdata[0]&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);

			SendCommandByte(0xC7);
			k=(recdata[1]>>4)&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);
			k=recdata[1]&0x0f;
			if(k<0x0a){k=k+0x30;}
			else{k=k+0x37;}
			SendDataByte(k);	
			X24_Write(recdata[0],recdata[1]);
		}
		
	}
}

void main(void)
{
	
	InitLcd();
	SendCommandByte(0x80);
	Delay(2);
	SendDataByte('A');
	SendDataByte('D');
	SendDataByte('D');
	SendDataByte('R');
	SendDataByte('E');
	SendDataByte(':');
	SendCommandByte(0xC0);
	Delay(2);
	SendDataByte('M');
	SendDataByte('E');
	SendDataByte('M');
	SendDataByte('O');
	SendDataByte('R');
	SendDataByte('Y');
	SendDataByte(':');
	TH0=0xfc;
	TL0=0x67;
	TH1=0xfd;
	TL1=0xfd;
	TMOD=0x21;
	SCON=0x50;
	TR0=1;TR1=1;
	IE=0x92;
	REN=1;
	readbit=1;
	rs232okbit=1;
	while(1)
	{}
	
}

⌨️ 快捷键说明

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