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

📄 main.c

📁 利用51和1602液晶屏读写EEPROM的内容,可以查看,修改,也可以发给PC的超级终端作为文件保存下来.
💻 C
字号:
#include "externh.h"

#define ADDRSTART  20
U8 uc[5];
U8 AddrBuf[6];
U8 DataBuf[15];
U8 SecureBuf[10];
GOB g;
SERECTST Serect;
U16 us0,us1;
void UpLoad(void);
void WriteSerect(void);

U8 ReadSerect(void);
void DispMenu(void);
unsigned char StrEquLen(unsigned char *ptr1,unsigned char *ptr2);

void main(void)
{

	IntDis();
	SystemInit();
	Rs232Init();
	g.State=0;

	IntEn();
	LCDInit();
	string="Welcome!";
	DispStr(3,0);
	Delay(100);
	while(1){
		if(g.Flag.Timer32ms){
			g.Flag.Timer32ms=0;
			KeyScan();
		}
		switch(g.State){
			case 0:
				gSet(1);
				AddrBuf[0]=0;
				for(us0=1;us0<1001;us0++){
					us1=us0*MAXLENGTH+ADDRSTART;
					I2CReadStr(us1,DataBuf,2);
					if('A'!=DataBuf[0]) break;
				}
				Serect.Addr=us0;
				BinToStr(Serect.Addr,10,AddrBuf);
				DataBuf[0]=0;
				g.Pos=0;
				g.Flag.Secure=0;
				break;
			case 1:
				DispMenu();
				if(!Key.hz) break;
				if('#'==Key.hz)break;
				DataBuf[g.Pos++]=Key.hz;
				DataBuf[g.Pos]=0;
				if('*'==Key.hz){					//if is '*',then input serect status.
					g.Pos=0;
					DataBuf[g.Pos]=0;
					gSet(2);
					I2CReadStr(0,SecureBuf,10);
					if(('S'!=SecureBuf[0])||('E'!=SecureBuf[1])){
						uc[0]=0;
						SecureBuf[uc[0]++]='S';
						SecureBuf[uc[0]++]='E';
						SecureBuf[uc[0]++]='4';
						SecureBuf[uc[0]++]='1';
						SecureBuf[uc[0]++]='2';
						SecureBuf[uc[0]++]='3';
						SecureBuf[uc[0]++]='4';
						SecureBuf[uc[0]]=0;
						I2CWriteStr(0,SecureBuf,10);
					}
					else{
					}
					break;
				}
				gSet(20);
				g.Flag.First=1;
				break;
			case 2:
				DispMenu();
				if(!Key.hz) break;
				switch(Key.hz){
					case '#':
//						uc[0]=SecureBuf[2]-'0';
						uc[0]=5;
//						if((StrEquLen(DataBuf,(U8 *)&SecureBuf[3])==uc[0])){
						if((StrEquLen(DataBuf,"123456")==uc[0])){
							if('1'==DataBuf[uc[0]]){//UpLoad().
								UpLoad();
								g.Pos=0;
								DataBuf[0]=0;
							}
							if('2'==DataBuf[uc[0]]){//ModifyData.
								AddrBuf[0]=0;
								DataBuf[0]=0;
								g.Pos=0;
								g.Flag.Secure=1;
								gSet(10);
								break;
							}
//							if('3'==DataBuf[uc[0]]){//ModifySerect.
//								AddrBuf[0]=0;
//								gSet(3);
//								g.Pos=0;
//								DataBuf[g.Pos]=0;
//							}
							break;	
						}
						else{
							if((StrEquLen(DataBuf,"888888")==6)){
								I2CReadStr(0,DataBuf,10);
								for(uc[0]=0;uc[0]<10;uc[0]++) PutCh(DataBuf[uc[0]]);
							}
						}
						g.Pos=0;
						DataBuf[g.Pos]=0;
						g.Flag.Disp=1;
						break;
					default:
						if(g.Pos>9) break;
						DataBuf[g.Pos++]=Key.hz;
						DataBuf[g.Pos]=0;
						g.Flag.Disp=1;
						break;
				}
				break;
			case 3:
				DispMenu();
				if(!Key.hz) break;
				switch(Key.hz){
					case '*':
						break;
					case '#':
						uc[0]=0;
						SecureBuf[uc[0]++]='S';
						SecureBuf[uc[0]++]='E';
						SecureBuf[uc[0]++]=g.Pos+'0';
						for(uc[1]=0;uc[1]<g.Pos;uc[1]++){
							SecureBuf[uc[0]++]=DataBuf[uc[1]];
						}
						I2CWriteStr(0,SecureBuf,10);
						break;
					default:
						if(g.Pos>6) break;
						DataBuf[g.Pos++]=Key.hz;
						DataBuf[g.Pos]=0;
						g.Flag.Disp=1;						
						break;
				}
				break;
			case 10://Addr.
				DispMenu();
				if(!Key.hz) break;
				switch(Key.hz){
					case '*':
						break;
					case '#':
						if(0==g.Pos) break;
						if(ReadSerect()){
							gSet(20);
							break;
						}
						g.Pos=0;
						DataBuf[0]=0;
						g.Flag.Disp=1;
						break;
					default:
						if(Key.hz<'0') break;
						if(Key.hz>'9') break;
						if(g.Pos>4) break;
						AddrBuf[g.Pos++]=Key.hz;
						AddrBuf[g.Pos]=0;
						Serect.Addr=StrToBin(AddrBuf,0);
						if(Serect.Addr>1000){
							g.Pos--;
							AddrBuf[g.Pos]=0;
						}
						Serect.Addr=StrToBin(AddrBuf,0);
						g.Flag.Disp=1;
						break;
				}
				break;
			case 20://data.
				DispMenu();
				if(!Key.hz) break;
				switch(Key.hz){
					case '*':
						if(g.Flag.Secure){
							g.Pos=0;
							g.Flag.Modify=1;
							ReadSerect();
							gSet(20);
							break;
						}
						g.Pos=0;
						DataBuf[0]=0;
						gSet(20);
						break;
					case '#':
						WriteSerect();
						if(g.Flag.Secure){  //可修改状态.
							g.Pos=0;
							g.Flag.Modify=0;
							ReadSerect();
							gSet(10);
							break;
						}
						if(Serect.Addr>1000) break;
						Serect.Addr++;
						BinToStr(Serect.Addr,10,AddrBuf);
						g.Pos=0;
						DataBuf[0]=0;
						gSet(20);
						break;
					default:
						if(Key.hz<'0') break;
						if(Key.hz>'9') break;
						if(g.Flag.Modify){
							if(g.Pos>MAXLENGTH-2) break;
							DataBuf[g.Pos++]=Key.hz;
							DataBuf[g.Pos]=0;
							g.Flag.Disp=1;
							break;
						}
						if(g.Flag.First){//正常输入.
							if(g.Pos>MAXLENGTH-2) break;
							DataBuf[g.Pos++]=Key.hz;
							DataBuf[g.Pos]=0;
							g.Flag.Disp=1;
							break;
						}
						g.Pos=0;
						AddrBuf[g.Pos++]=Key.hz;
						AddrBuf[g.Pos]=0;
						Serect.Addr=StrToBin(AddrBuf,0);
						g.Flag.Modify=0;
						gSet(10);
						break;
				}
				break;
		}
	}
}
void WriteSerect(void)
{
	U16 us0;
	U8 uc0;
	uc0=0;
	while(DataBuf[uc0++]);
	while(uc0){
		DataBuf[uc0]=DataBuf[uc0-1];
		uc0--;
	}
	DataBuf[0]='A';
	us0=Serect.Addr*MAXLENGTH+ADDRSTART;
	I2CWriteStr(us0,DataBuf,MAXLENGTH);
}
U8 ReadSerect(void)
{
	U8 i,j;
	U16 us0;
	U8 tmp[15];
	us0=Serect.Addr*MAXLENGTH+ADDRSTART;
	I2CReadStr(us0,tmp,MAXLENGTH);
	if('A'!=tmp[0]) return(0);
	for(i=0;i<MAXLENGTH;i++){
		DataBuf[i]=tmp[i+1];
		j=DataBuf[i];
//		PutCh(j);
		if((j<'0')||(j>'9')){
			DataBuf[i]=0;
		}
	}
	DataBuf[MAXLENGTH]=0;
	g.Flag.Disp=1;
	return(1);
}
void UpLoad(void)
{
	U16  us0,us1;
	U8 *ptr;
	U8 ch,i;
	PutCh(0x0d);
	PutCh(0x0a);
	for(us0=1;us0<1001;us0++){
		BinToStr(us0,10,DataBuf);
		ptr=(U8 *)&DataBuf[0];
		for(i=0;i<5;i++){
			if(*ptr) PutCh(*ptr++);
			else break;
		}
		for(;i<5;i++) PutCh(' ');
		PutCh(':');
		us1 =us0*MAXLENGTH+ADDRSTART;
		I2CReadStr(us1,DataBuf,MAXLENGTH);
		if('A'==DataBuf[0]){
			for(i=1;i<MAXLENGTH;i++){
				ch =DataBuf[i];
				if(ch<'0') break;
				if(ch>'9') break;
				PutCh(ch);
			}
			if(1==i) PutCh('N');
		}
		else  PutCh('N');
		PutCh(0x0d);
		PutCh(0x0a);
	}
}
unsigned char * BinToStr(unsigned long d,unsigned int radix,unsigned char *ptr)
{//把二进制数d按进制数radix转换成字符串。
	unsigned char buf[10];
	unsigned char uc1, *q;
   	q=(unsigned char *)&buf[9];
   	*q=0;
   	do{
		uc1 = (d % radix) + '0';
		if( uc1 > '9' )
			uc1+='A'-'0'-10;
		*--q = uc1;
	} while( d /= radix );
	for(;(*ptr++ = *q++););
	ptr--;
	return (ptr);
}
unsigned int StrToBin(unsigned char *ptr,unsigned char ch)
{//把一字符串变为二进制.当指针遇见ch时退出.
	unsigned int us0;
	us0=0;
	while(*ptr!=ch){
		us0 *=10;
		us0+=(*ptr)-'0';
		ptr++;
	}
	return(us0);
}
void DispMenu(void)
{
	if(g.Flag.Disp){
		g.Flag.Disp=0;
		Cls();
		string="Addr:";
		DispStr(0,0);
		string=AddrBuf;
		DispStr(5,0);
		string="Data:";
		DispStr(0,1);
		string=DataBuf;
		DispStr(5,1);
	}
	GetKey();
}
unsigned char StrEquLen(unsigned char *ptr1,unsigned char *ptr2)
{//比较两个字符串相等的数目.
	unsigned char uc0;
	uc0=0;
	while(1){
		if(*ptr1==0) break;
		if(*ptr2==0) break;
		if(*ptr1 != *ptr2) break;
		uc0++;
		ptr1++;
		ptr2++;
	}
	return (uc0);
}

⌨️ 快捷键说明

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