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

📄 0623_n.c.bak

📁 这是我在我们公司做的C51加油单片机程序
💻 BAK
字号:
/*2002/06/21 增加功能记录*/
/*对2块FLASH的不同操作*/
#include "d:\comm_d\0623_N.h"
#include "d:\comm_d\flash.h"
#include "D:\comm_d\flash_pub.h"
//#include "d:\comm_d\flash_pub.h"
/**/
typedef unsigned int uint;
typedef unsigned long ulong;
typedef unsigned char uchar;
typedef unsigned long nlong;
/**/
/*------------读写flash-------------------------*/
/*2.0*/
/*-----3.0查询黑名单,序列号是按升序排列------*/
/*输入:已知的卡序列号,三个长整型:noteH,noteM,noteL*/
extern unsigned char    idata          nlist[10];
extern unsigned long   idata           listNumber1;
extern unsigned int    idata           pageN1;
unsigned char seeAbout()
{
	uchar xdata flashTemp[4];         /*总记录条数*/
	uchar xdata flashTemp5[10]={0,0,0,0,0,0,0,0,0,0};//={0x33,0,0x36,0x22,0x90,0x45,0x56,0x45,0,0x22};	 /*一条记录*/
	ulong xdata listNumber;		 /*黑名单数量*/
	uchar xdata j,addressN,flag12,flag102;
        uint xdata pageN,bufferA,bufferB;

	at45d021_rd(flashTemp5,10,1028,17);/*读第一条记录*/
	flag12=check_10(nlist,flashTemp5);
	if(flag12==3)
	return(0);                /*序号小于第一条记录,不在黑名单内*/
	if(flag12==2)
	return(1);                /*只有一条,刚好是*/
	/*------------*/
	//at45d021_rd(flashTemp,4,1028,13);//(flashTemp,4,1028,12);
        //listNumber=(ulong)flashTemp[0];
	for(j=1;j<4;j++)
	{
		listNumber<<=8;
		//listNumber=listNumber+(ulong)flashTemp[j];
	}
	/*-----------*/
        if(listNumber<=24)
	{	pageN=0+1028;
		addressN=(listNumber-1)*10+17;
		listNumber1=listNumber;
	        pageN1=pageN;}				/*小于24条记录,页等于0*/
       	else 						/*需要计算页数*/
	{	bufferA=(listNumber-24)/25;		/*计算页数的整数部分*/
		bufferB=(listNumber-24)%25;             /*计算页数的余数部分*/
		if(bufferB==0)
		{pageN=1028+bufferA;addressN=250;}
		else
		{pageN=1028+bufferB+1;addressN=bufferB*10;}
		listNumber1=listNumber;
	        pageN1=pageN;
	}
	//at45d021_rd(flashTemp5,10,pageN,addressN);//(flagTemp1,10,pageN,addressN);	/*读最后一条记录*/
        flag12=check_10(nlist,flashTemp5);
	if(flag12==1)
	{return(0);}            /*序号大于最后一条记录,不在黑名单内*/

	/*----------*/
	/*---以下是有可能在,还要继续判断-------*/
	      	if(listNumber1<=24)
	      	return(seeAbout_page(pageN1));
	      	flag102=seeAbout_half(listNumber1,pageN1);
		return(flag102);
}

/*3.1 比较两个字符串的大小 返回1=大于,2=等于,3=小于*/
uchar check_10(uchar xdata *char1,uchar xdata *char2)
{


	 uchar xdata j;
	 uint xdata flag=0;
	uint xdata buffer;
	bit x;
	for(j=0;j<10;j++)
	{
                flag<<=1;
		if(char1[j]==char2[j])
		{x=1;}
	        else
	        {x=0;}
	        flag=flag|x;
	}
	buffer=flag;
	if(flag==0x03ff)
	return(2);/*等于*/
	flag=0;
	for(j=0;j<10;j++)
	{	flag<<=1;
		if(char1[j]>=char2[j])
		{x=1;}               //大于等于=1
		else
		{x=0;}               //小于    =0
	        flag=flag|x;
	}
	if(flag==0)                  //不等于,且全小于
	return(3);
	if(flag==0x03ff)
	return(1);                   //不等于,且全大于
	buffer<<=6;flag<<=6;//把数据左移6位,到最高位
	j=0;
	do{
	if((buffer&0x8000)==0x8000)
	x=0;
	else
	x=1;
	buffer<<=1;
	j++;
	}while(x==0);
	flag<<=j-1;
	if((flag&0x8000)==0x8000)
	return(1);
	else
	return(3);

}



/*已知要比较的数据和可能在数据组中,和数据的最大页数和最大记录的值*/
/*3.2 按页1/2算法*/
uchar seeAbout_half(ulong xdata listNumberx,uint xdata pageNx)
{
	 uchar xdata count1;		  /*1/2除法次数*/
	 uchar xdata currentlyPage;        /*当前页数*/
	 uchar xdata flag15,flag16,flag99;        /*标志*/
	 uint xdata bufferH,bufferL=1028; /*页码的备份*/
	uchar xdata flashTemp3[10];
	bufferH=pageNx;
	for(count1=0;count1<10;count1++)          //最多2的10次方1024
	{
		if((pageNx-bufferL)%2)
		{			/*奇数先读最后一页,变成偶数*/
			flag15=seeAbout_page(bufferH);
	        	if(flag15==1)
	        	{return(1);}
			else
			{pageNx=pageNx-1;}
		}
		bufferH=pageNx;                    //备份页数
		currentlyPage=(pageNx-1028)/2;            //取1/2处 页
		//at45d021_rd(flashTemp3,10,currentlyPage+bufferL,240);
		              		/*读1/2页的最后一条记录*/
		flag15=check_10(nlist,flashTemp3);
		switch(flag15)
		{case 2:return(1);break;	 /*等于*/
		 case 1:			 /*noteH,noteM,noteL大于M*/
		 {	if(currentlyPage==bufferH-1028)//是最高页吗?
		        {      	flag16=seeAbout_page(bufferH);
			        return(flag16);
		        }
		        else
		        {
		        	bufferL=currentlyPage+1028;
		        	pageNx=bufferH;
		        }
		 }break;
		 case 3:			/*小于*/
		 {	if(currentlyPage==bufferL-1028) //是最低页吗?
		        {	flag16=seeAbout_page(bufferL);
		        	return(flag16);
		        }
	                else
		        {
				bufferH=pageNx=currentlyPage+1028;
			}
		 }break;}
	}return(0);
}
/*3.3 按页查 输入:页数,输出:0=不在该页,1=在该页*/
uchar seeAbout_page(uint xdata pageNy)
{	//register uchar xdata  nlist[10]={0,0,0,0,0,0,0,0,0x01,0x56};
	uchar xdata j,addressNN,flag133;
	uchar xdata flashTemp2[10];
	if(pageNy==1028)
	{       			/*第一页*/
		for(j=0;j<24;j++)
		{
			addressNN=17+j*10;
			//at45d021_rd(flashTemp2,10,pageNy,addressNN);	//(flagTemp2,10,pageN,addressN);
			flag133=check_10(nlist,flashTemp2);
			if(flag133==2)
			return(1);	/*在第一页内*/
		}
		return(0);		/*不在第一页内*/
	}
	else
	{
		for(j=0;j<25;j++)
		{
			addressNN=j*10;
			//at45d021_rd(flashTemp2,10,pageNy,addressNN);
			flag133=check_10(nlist,flashTemp2);
			if(flag133==2)
			return(1);	/*在本页内*/
		}
		return(0);		/*不在本页内*/
	}
}

⌨️ 快捷键说明

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