📄 0623_n.c.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 + -