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

📄 writeidmain.c

📁 WriteIDmain
💻 C
字号:
#include	"msp430x13x.h"
#include	"wzsx.h"

void	fnPortInit(void);			//端口状态初始化
void	fnDelayX10ms(int iTimes);	//10ms的整数倍延时

void	fnBeep();					//蜂鸣器响一声
unsigned char *fnConvLongToChar(long int lConvLongData,int iConLen);
unsigned long int fnCharConToLong(unsigned char cCharConLonBuf[4]);
unsigned int fnCharConvToInt(unsigned char cCharConLonBuf[2]);
	//E2PROM
unsigned long int	ProReadE2ROMID(unsigned char cAddress);	//读出E2PROM内的终端ID
unsigned int	*ProReadE2ROM(int iStartAddress, int iReadBITNum);
void	ProWriteE2ROM(int iStartAddress, int iWriteBITNum, unsigned char cWriteData[4]);

void	fnE2ROMStart(void);				//E2PROM开始
void	fnE2ROMStop(void);				//E2PROM停止
void	fnE2ROMRespond(void);			//E2PROM读写后的应答
unsigned char	fnDataRxE2ROM(void);	//从E2PROM读出一个字节数据
void	fnDataTxE2ROM(unsigned char cBuffer);	//一个字节数据数据写入E2PROM


unsigned long int liTerminalID;
unsigned long int liHandID;
unsigned long int li905ID;
unsigned long int iReadID;
void	main( void )
{	
	int iTime;
	WDTCTL = WDTPW + WDTHOLD;
//	FLL_CTL0 |= XCAP14PF;
	_DINT();
	fnPortInit();
/*	fnBeep(); */
	fnDelayX10ms(25);
	fnBeep();
	fnBeep();
	_EINT();
	for(iTime=0; iTime<1; iTime++)
	{
		unsigned char cTemp[4];
		unsigned char *p;
		int i;

	//写入终端ID
		liTerminalID = 2005080012;
		p = fnConvLongToChar(liTerminalID, 4);
		for(i=0; i<4; i++)
		{
			cTemp[i] = *p;
			p++;
		}	
		ProWriteE2ROM(0x00, 4, cTemp);
		iReadID = ProReadE2ROMID(0x00);

	//写入手持机ID
		
		liHandID = 2005111111;
		p = fnConvLongToChar(liHandID, 4);
		for(i=0; i<4; i++)
		{
			cTemp[i] = *p;
			p++;
		}
		ProWriteE2ROM(0x04, 4, cTemp);
		iReadID = ProReadE2ROMID(0x00);

	//写入905ID
		
		li905ID = 2005000001;
		p = fnConvLongToChar(li905ID, 4);
		for(i=0; i<4; i++)
		{
			cTemp[i] = *p;
			p++;
		}
		ProWriteE2ROM(E2905ID, 4, cTemp);
//		iReadID = ProReadE2ROMID(E2905ID);
		iReadID = ProReadE2ROMID(0x00);
		
		fnBeep();
		fnDelayX10ms(25);
	}
}

//******子函数**************************

void	fnPortInit(void)	//端口状态初始化
{
	
	P1DIR = 0xff;
	P1OUT = 0;
	P2DIR = 0xff;
	P2OUT = 0x02;	//PCSN=1;
	P3DIR = 0xff;
	P3OUT = 0x04;	//PE2ROMPower=1;
	P4DIR = 0xff;
	P4OUT = 0;
	P5DIR = 0xff;
	P5OUT = 0;
	P6DIR = 0xff;
	P6OUT = 0;
/*
	P1DIR = 0;
	P2DIR = 0;
	P3DIR = 0;
	P4DIR = 0;
	P5DIR = 0;
	P6DIR = 0;
*/	
	P2DIR |= PSCK + PCSN;
	P2OUT &= ~PSCK;
	P2OUT |= PCSN;
}

//******时间函数************************
/***************************************
	名称:	fnDelayX10ms()
	功能:	延迟时间
	入参:	要延时的倍数
	出参:	无
***************************************/
void fnDelayX10ms(int iTimes)
{
	
	int i,j;
	for(i=0; i<=iTimes; i++)
	{
		j=0;
		do
		{
			j++;
		}
		while(j<=2000);
	}
}

//	蜂鸣器响一声
void	fnBeep(void)
{
	P6DIR |= PFMQ;
	P6OUT |= PFMQ;
	fnDelayX10ms(25);
	P6OUT &= ~PFMQ;
	P6DIR &= ~PFMQ;
}
//******E2PROM函数**********************
/***************************************
	名称:	ProReadE2ROMID(unsigned char cAddress)
	功能:	读E2ROM内的终端ID
	入参:	要读出的终端或手持机的ID地址
	出参:	iReadOutData:读出的数据
***************************************/
unsigned long int	ProReadE2ROMID(unsigned char cAddress)
{
	int i;
	unsigned char cTemp[4];
	unsigned long int liTemp;

	P3DIR |= PE2ROMPower;			//E2PROM上电
	P3OUT &= ~PE2ROMPower;
	fnDelayX10ms(1);
	_DINT();
	
	fnE2ROMStart();					//开始
	fnDataTxE2ROM(E2WRITE);			//设备地址
//	P3OUT &= ~PE2ROMSCL;
	fnDataTxE2ROM(cAddress);		//字节地址
//	P3OUT &= ~PE2ROMSCL;
	fnE2ROMStart();
	fnDataTxE2ROM(E2READ);			//读设备地址
//	P3OUT &= ~PE2ROMSCL;
	
	for(i=0; i<4; i++)
	{
		
		cTemp[i] = fnDataRxE2ROM();
		if(i==4)
		{	break;	}
		P3OUT &= ~PE2ROMSCL;
		P3DIR |= PE2ROMSDA;
		P3OUT &= ~PE2ROMSDA;
		P3OUT |= PE2ROMSCL;
	}

//	P3OUT |= PE2ROMSCL;
	fnE2ROMStop();
	_EINT();
	P3OUT |= PE2ROMPower;			//E2PROM掉电
	P3DIR &= ~PE2ROMPower;

	liTemp = fnCharConToLong(cTemp);
	return liTemp;
}
		
	
/***************************************
	名称:	ProReadE2ROM()
	功能:	读E2ROM函数
	入参:	iStartAddress:读开始地址;iReadBITNum:读字节数
	出参:	iReadOutData:读出的数据
**************************************
unsigned int	*ProReadE2ROM(int iStartAddress, int iReadBITNum)
{
	unsigned long int iReadOutData;
	unsigned char cTemp[4];
	int i;
	
	P3DIR |= PE2ROMPower;			//E2PROM上电
	P3OUT &= ~PE2ROMPower;
	fnDelayX10ms(1);
	_DINT();
	
	fnE2ROMStart();					//开始
	fnDataTxE2ROM(E2WRITE);		//读之前,先空写入
//	P3OUT &= ~PE2ROMSCL;
	fnDataTxE2ROM(iStartAddress);
//	P3OUT &= ~PE2ROMSCL;
	fnE2ROMStart();
	fnDataTxE2ROM(E2READ);
//	P3OUT &= ~PE2ROMSCL;
	
	for(i=0; i<iReadBITNum; i++)
	{
		cTemp[i] = fnDataRxE2ROM();
//		P3OUT &= ~PE2ROMSCL;
	}
	iReadOutData = fnCharConToLong(cTemp);
	P3OUT |= PE2ROMSCL;
	fnE2ROMStop();
	_EINT();
	P3OUT |= PE2ROMPower;			//E2PROM掉电
	P3DIR &= ~PE2ROMPower;
	
	return iReadOutData;
}
*/
/***************************************
	名称:	ProWriteE2ROM()
	功能:	写E2ROM函数
	入参:	iStartAddress:写开始地址;iTotalNum:写字节数;
			cWriteData[4]:写入的数据;
	出参:	无
***************************************/
void	ProWriteE2ROM(int iStartAddress, int iWriteBITNum, unsigned char cWriteData[4])
{
	int i;
//	unsigned char cTemp[4];
//	for(i=0; i<4; i++)
//	{
//		cTemp[i] = cWriteData[i];
//	}
//	unsigned char cTx;
	P3DIR |= PE2ROMPower;			//E2PROM上电
	P3OUT &= ~PE2ROMPower;
	fnDelayX10ms(1);
	_DINT();

	fnE2ROMStart();					//开始
	fnDataTxE2ROM(E2WRITE);			//写Device Address
//	P3OUT &= ~PE2ROMSCL;
	fnDataTxE2ROM(0x00);	//写Word Address
//	P3OUT &= ~PE2ROMSCL;
//	fnDataTxE2ROM(0x01);
	for(i=0; i<iWriteBITNum; i++)
	{
//		P3OUT |= PE2ROMSCL;
		fnDataTxE2ROM(cWriteData[i]);
		
		P3OUT |= PE2ROMSDA;
//		fnDataTxE2ROM(cWriteData[i]);
		
	}
//	P3OUT |= PE2ROMSCL;
	fnE2ROMStop();
	_EINT();
	P3OUT |= PE2ROMPower;			//E2PROM掉电
	P3DIR &= ~PE2ROMPower;
}

void	fnE2ROMStart(void)			//E2PROM开始
{
	P3DIR |= PE2ROMSDA + PE2ROMSCL;
	P3OUT &= ~PE2ROMSCL;			//SCL=0
	P3OUT |= PE2ROMSDA;				//SDA=1
	P3OUT |= PE2ROMSCL;				//SCL=1
	P3OUT &= ~PE2ROMSDA;			//SDA=0
}

void	fnE2ROMStop(void)			//E2PROM停止
{
	P3DIR |= PE2ROMSDA + PE2ROMSCL;
	P3OUT &= ~PE2ROMSCL;			//SCL=0
	P3OUT &= ~PE2ROMSDA;			//SDA=0
	P3OUT |= PE2ROMSCL;				//SCL=1
	P3OUT |= PE2ROMSDA;				//SDA=1
}

void	fnE2ROMRespond(void)		//E2PROM读写后的应答
{
	P3DIR |= PE2ROMSCL;
	P3DIR &= ~PE2ROMSDA; 
	P3OUT |= PE2ROMSCL;
	
//	if( P3IN & PE2ROMSDA )
//	{	InfoError |= E2ROMRWrError;	}
}

/***************************************
	名称:	fnDataRxE2ROM()
	功能:	读E2ROM的一字节数据
	入参:	无
	出参:	cDataTemp接收到的数据
***************************************/
unsigned char	fnDataRxE2ROM(void)		//读出E2PROM数据
{
	int iTemp;
	unsigned char cTemp=0;  
	for(iTemp=8; iTemp>=1; iTemp--)
	{
		cTemp <<= 0x1;
		P3OUT &= ~PE2ROMSCL;
		P3DIR &= ~PE2ROMSDA;
		P3OUT |= PE2ROMSCL;
		if(PE2ROMSDA&P3IN)
		{	cTemp |= 0x01;	}
		else 
		{	cTemp &= ~0x01;	}
	}
	return cTemp;
}

/***************************************
	名称:	fnDataTxE2ROM()
	功能:	写一字节数据到E2ROM
	入参:	cBuffer要发送的数据
	出参:	无
***************************************/
void	fnDataTxE2ROM(unsigned char cBuffer)		//数据写入E2PROM
{
	int iTemp;
	
//	P3OUT &= ~PE2ROMSCL;
	P3OUT |= PE2ROMSCL;
	P3DIR |= PE2ROMSDA;
	for(iTemp=8; iTemp>=1; iTemp--)
	{
		P3OUT &= ~PE2ROMSCL;
		if(cBuffer & 0x80)
		{	P3OUT |= PE2ROMSDA;	}
		else
		{	P3OUT &= ~PE2ROMSDA;	}		
		P3OUT |= PE2ROMSCL;
		cBuffer <<= 0x01;    
	}
//	P3OUT &= ~PE2ROMSCL;
//	P3OUT &= ~PE2ROMSDA; 
//	P3DIR &= ~PE2ROMSDA;
//	P3OUT |= PE2ROMSCL;	
//	P3OUT |= PE2ROMSDA;	
//	P3OUT &= ~PE2ROMSCL;
}

/***************************************************
名称:fnConvLongToChar();
功能:长整形转换字符型函数
入口参数:lConvLongData:要转换的长整形数据;iConLen转换字节数
出口参数:PcDataLongToChar:转换后的字符
***************************************************/
unsigned char *fnConvLongToChar(long int lConvLongData,int iConLen)
{
  unsigned char cDataLongToChar[4];
  unsigned char *PcDataLongToChar;
  int itemp;
  for(itemp=0;itemp<iConLen;itemp++)
  {
    cDataLongToChar[itemp]=(char)lConvLongData;   
    lConvLongData=lConvLongData>>8;
  }
  PcDataLongToChar=&cDataLongToChar[0];
  return PcDataLongToChar;
}

/***************************************************
	名称:fnCharConToLong();
	功能:字符转换长整形函数
	入口参数:cCharConLonBuf:要转换的字符数据
	出口参数:lCharConToLong:转换后的长整形数据
***************************************************/
unsigned long int fnCharConToLong(unsigned char cCharConLonBuf[4])
{
	long int lCharConToLong,lTemp1,lTemp2,lTemp3;
	lTemp1 = (long int)cCharConLonBuf[1]<<8;
	lTemp2 = (long int)cCharConLonBuf[2]<<16;
	lTemp3 = (long int)cCharConLonBuf[3]<<24;
	lCharConToLong = lTemp1 + lTemp2 + lTemp3 + cCharConLonBuf[0];
	return lCharConToLong;
} 
/***************************************************
	名称:fnCharConvToInt();
	功能:字符转换整形函数
	入口参数:cCharConLonBuf:要转换的字符数据
	出口参数:iCharConToInt:转换后的整形数据
***************************************************/
unsigned int fnCharConvToInt(unsigned char cCharConLonBuf[2])
{
	unsigned int iCharConToInt, iTemp;
	iTemp = (unsigned int)cCharConLonBuf[1]<<8;

	iCharConToInt = iTemp + cCharConLonBuf[0];
  return iCharConToInt;
}

⌨️ 快捷键说明

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