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

📄 control.c.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
#include "reg51.h" 
#include "../include/c51.h"
#include "../include/control.h"

uchar   CursorEnable;//bit 0 enable bit
uchar   Cursor_x;
uchar   Cursor_y;
uchar   IsDoInit;
uchar   IsNeedBeep;
uchar   InputKey;
uchar   NowPage;
uchar   NowFocuse;
uchar   NowPerson;
uchar   NowSelectLine; //10
ucharx  *NowPoint;//22 23
uchar   NowSelectAccount;
uchar   NowControl;
uchar   WaitForKey;
uchar   PersonKind;
uchar   SetPersonKind;
uchar   SetPerson;
uchar   TimerType;
uchar   TimerVar;
uchar   IsQuickQF;//19

ucharx  start;
ucharx  LibStartAdd;    //程序中临时保存数据库中的位置
ucharx  SelectPhone;
ucharx  QuickBillNum;
ucharx  InquireMode;
ucharx  MMIsGet;
ucharx  ShowManName;
ucharx  IsAddNewPhone;
ucharx  CursorIsBlack;
ucharx  PreKeyMsg;
ucharx  ContinueKeyF;
ucharx  NowFirstLine;//10
ucharx  IsPersonUseCard;
ucharx  LastKind;
ucharx  LastPage; //13
uintx   RecordOffset;
uintx	  FrontHistoryNums;	//(不论是否复合条件的)从历史记录开始区到最新的那条之间的条数
uintx	  CtrlCurrline;
uintx   NowAdress;
uintx   AutoOffTime;//21
ucharx  PhoneKeepData[2];//23
ucharx  datatime[20];//43
ucharx  TurnIndex[81];//124
ucharx	TEMPSTART[300];//424
ucharx	CalBuffA[1000];//1424
ucharx  LCD_Bffer[4106];//5530   128*2*16+10
ucharx  LCD_Bffer2[4106];//5530   128*2*16+10
MMx     NowMM;//163
ucharx  safewrite;
ucharx  end;


//ucharx Debug_LCDBffer[4106];
//账号,凭证,种类,日期,金额,签代,签名,审代,审名,授代,授名,密码,无金额,帐号代码
ucharx	PhistoryOffset[14]={1,    17,  21,  22,  26,  34,  35,  45,  46,  56,  57,  67,  77,  78};//14项
ucharx	HistoryLen[14]=    {16 ,   4,   1,   4,   8,   1,  10,   1,  10,   1,10  ,   8,   1,   1};//ucharx	PNowmmOffset[14]=  {69 ,  90,  85,  86,  94,  65, 126,  66, 136,  67,146 , 118, 156,  68};
ucharx	PNowmmOffset[14]=  {70 ,  91,  86,  87,  95,  66, 133,  67, 143,  68,153 , 123, 163,  69};
//定义批量审核(页面8)中自上而下各个控件序列号 帐号,业务种类,日期,金额,支付密码,签发人,凭证号码
ucharx	CtrlNumSHTable[]={8,9,10,11,14,12,13};//对于批量记录明细仅前 6 项有效(第7项为凭证号码,为历史记录明细所有)
ucharx	CtrlNumSQTable[]={5,10,11,12,13,14};//定义记录明细中自上而下各个控件在NomMM结构中的指针偏移位置(凭证号码除外)//					 帐号,业务种类,日期,金额,支付密码,签发人,凭证号码
ucharx	CtrlPointOffset[]={69,85,33,49,102,65,41};//定义记录明细中中自上而下各个控件在NomMM结构中的长度//					 帐号,业务种类,日期,金额,支付密码,签发人,凭证号码
ucharx	CtrlLenTable[]={16,1,8,16,16,8,8};

ucharc 	qfy[]={"签发员"};					//正在通讯
ucharc 	shy[]={"审核员"};					//正在通讯
ucharc	sqy[]={"授权员"};					//机具编号

ucharc pos_color[45]=  
{
    0,0,0,
    1,0,0,
    2,0,0xff,
    3,0,0,
    4,0,0,

    0,1,0,
    1,1,0xff,
    2,1,0xff,
    3,1,0xff,
    4,1,0,

    0,2,0xff,
    1,2,0xff,
    2,2,0xff,
    3,2,0xff,
    4,2,0xff,
};

ucharc NoSavePage[]={1,2,3,4,5,13,15,17,19};

uchar GetPhoneTotalNum(void)
{
	uchar TotalNumbers=0,Counter,TempByte;
	
	for(Counter=0;Counter<PhoneCodeTotalLen;Counter++)
	{
		ZDHReadFlashToInterMem(PhoneBookPage,1,PhoneBookAddress+Counter*OneNumberLen,(ucharx *)(&TempByte));
		if(TempByte==0x55) TotalNumbers++;
		else if(TempByte==0xff) break;
	}
	return (TotalNumbers);
}

uchar	DelPhoneNum(uchar PhoneNumID)					//删除电话号码簿中的第PhoneNumID条记录,同时整理电话号码簿(1--50)
{
	ucharx TempBuffer[OneNumberLen*PhoneCodeTotalLen];
	uchar TempByte;
	uint Address;
	uint Counter;
	
	TempByte=GetPhoneTotalNum();
	if((TempByte==0)||(PhoneNumID>TempByte)) return(NoRecord);	//返回无此记录
	else if(TempByte==1)
	{
		FlashWriteEnable=Enable+safewrite;				//删除最后一条
		TempByte=EraseBlock(PhoneBookPage,(uchar)((uint)PhoneBookAddress>>12));
		return(TempByte);
	}
	YJHReadFlashToExterMem(PhoneBookPage,OneNumberLen*(PhoneNumID-1),(ucharx *)PhoneBookAddress,(ucharx *)(&TempBuffer[0]));//read in data
	Address=PhoneNumID*OneNumberLen;
	Address+=PhoneBookAddress;
	Counter=TempByte-PhoneNumID;
	Counter=Counter*OneNumberLen;
	if(Counter>0)
	{
		YJHReadFlashToExterMem(PhoneBookPage,Counter,
			(ucharx *)Address,(ucharx *)(&TempBuffer[(PhoneNumID-1)*OneNumberLen]));//read in data
	}
	for(Counter=((TempByte-1)*OneNumberLen);Counter<(PhoneCodeTotalLen*OneNumberLen);Counter++)
	{
		TempBuffer[Counter]=0xff;				//不使用区域清空
	}
	FlashWriteEnable=Enable+safewrite;
	TempByte=EraseBlock(PhoneBookPage,(uchar)((uint)PhoneBookAddress>>12));
	if(TempByte!=0) return(TempByte);
	Counter=OneNumberLen*PhoneCodeTotalLen;
	TempByte=YJHExternalWriteFlash(PhoneBookPage,Counter,(ucharx *)(&TempBuffer[0]),PhoneBookAddress);
	return(TempByte);
}

void WriteOnePhone()
{
    uchar  i,u;
    uchar  m,n,o;
    uchar  controlnum;
	  uint controladress;
    uint PhoneStartAdress;
    ucharx TempPhoneBuffer[OneNumberLen];
    ucharx   *DataPoint;
    TempPhoneBuffer[0]=0x55;
    controlnum=EXT_32KRAM[7];
		controladress=7;
		for(i=0;i<controlnum;i++)
		{
      DataPoint=&EXT_32KRAM[controladress+1];
      if(i==6)
      {
        m=8;
        u=1;
        o=1;
      }
      else if(i==7)
      {
        m=16;
        u=9;
        o=2;
      }
      else if(i==8)
      {
        m=16;
        u=17;
        o=2;
      }
      else if(i==9)
      {
        m=6;
        u=25;
        o=2;
      }
      else if(i==10)
      {
        m=20;
        u=28;
        o=1;
      }
      else
      {
        o=0;
      }
      if(o==2)
      {
        for(n=0;n<m;n++)
        {
          if(*(DataPoint+23+n)==0x20)TEMPSTART[n]=0x3f;
          else TEMPSTART[n]=*(DataPoint+23+n);
        }
        Xram_ASIIC_BCD(m,&TEMPSTART[0],&TempPhoneBuffer[u]);
      }
      else if(o==1)
      {
        for(n=0;n<m;n++)
        {
          if(*(DataPoint+23+n)==0x20)TempPhoneBuffer[n+u]=0xff;
          else TempPhoneBuffer[n+u]=*(DataPoint+23+n);
        }
      }
			controladress+=EXT_32KRAM[controladress+1];
		}
    for(i=0;i<13;i++)TempPhoneBuffer[48+i]=0xff;
    AddCheckSum((ucharx *)(&TempPhoneBuffer[0]),OneNumberLen-1);
    PhoneStartAdress=PhoneBookAddress+OneNumberLen*SelectPhone;
    ZDHWriteFlash(PhoneBookPage,OneNumberLen,(ucharx *)(&TempPhoneBuffer[0]),PhoneStartAdress);//新口令写入
}

uchar ChangePass(ucharx *InputPass,uchar Personkind,uchar Person)	//修改口令
{
	uchar TempByte;
	ucharx TempBuffer[OnePersonLength];
	ucharx TempBuffer1[PasswordLength*2];
	uint Address;
	
	Address=Personkind*PersonTotalNum+Person;
	Address=Address*OnePersonLength;
	Address+=FirstPersonAdd;
	YJHReadFlashToExterMem(ConfigFilePage,OnePersonLength,(ucharx *)Address,(ucharx *)&TempBuffer[0]);
	Xram_ASIIC_BCD(PasswordLength*2,InputPass,(ucharx *)(&TempBuffer1[0]));
	memcpy(&TempBuffer[11],&TempBuffer1[0],PasswordLength);
	AddCheckSum((ucharx *)(&TempBuffer[2]),OnePersonLength-3);
	TempByte=ZDHWriteFlash(ConfigFilePage,OnePersonLength,(ucharx *)(&TempBuffer[0]),Address);//新口令写入
	return(TempByte);
}

uchar UnlockPass(uchar Personkind,uchar Person)				//解锁口令
{
	ucharx TempByte;
	ucharx TempBuffer[OnePersonLength];
	uint Address;

	Address=Personkind*PersonTotalNum+Person;
	Address*=OnePersonLength;
	Address+=FirstPersonAdd;
	YJHReadFlashToExterMem(ConfigFilePage,OnePersonLength,(ucharx *)Address,(ucharx *)&TempBuffer[0]);
	TempBuffer[1]=0xff;
	TempBuffer[11]=0x11;
	TempBuffer[12]=0x11;
	TempBuffer[13]=0x11;
	TempBuffer[14]=0x11;
	AddCheckSum((ucharx *)(&TempBuffer[2]),OnePersonLength-3);
	TempByte=ZDHWriteFlash(ConfigFilePage,OnePersonLength,(ucharx *)(&TempBuffer[0]),Address);//复位口令
	return(TempByte);
}

void AddCheckSum(ucharx *Pointer,uint Length)
{
	uchar CheckSum=CheckSumIniValu;
	uint Counter;
	for (Counter = 0; Counter < Length; Counter++) {
		CheckSum ^= *(Pointer+Counter);
	}
	*(Pointer+Length) = CheckSum;
}

uchar	YJHExternalWriteFlash(uchar  Page,uint  Length,ucharx  *SourcePointer,uint  DestPointer)
{
#ifdef  WIN32      
  FlashWriteEnable=Enable+safewrite;
	WriteFlash(Page,Length,SourcePointer,DestPointer);
	return 0;
#else
	if(Length!=0)
	{
		FlashWriteEnable=Enable+safewrite;
		PublicVariable2=(uchar)(((uint)DestPointer)>>8);
		PublicVariable3=(uchar)((uint)DestPointer);
		return(ExternalWriteFlash(Page,Length,SourcePointer));
	}
	return(0);
#endif
}

uchar	ZDHWriteFlash(uchar Page,uint Length,ucharx *SourcePointer,uint DestPointer)
{
	ucharx	TempBuffer2[4*1024];					//wirte flash buffer
	ucharx *Pointer;
	uint TempLen;
	uintx TempLen2;
	uchar Result;
	
	if(Length==0) return(0);					//写入数据为空
	Pointer=&TempBuffer2[0];					//dest data
	YJHReadFlashToExterMem(Page,Length,(ucharx *)DestPointer,(ucharx *)&TempBuffer2[0]);//read in data
	for(TempLen=0;TempLen<Length;TempLen++)
	{
		if(((*(SourcePointer+TempLen))&(*(Pointer+TempLen)))!=*(SourcePointer+TempLen)) break;
	}
	
	if(TempLen<Length)						//read in 4k
	{
		TempLen2=(uint)DestPointer;
		TempLen2=TempLen2&0xf000;
		YJHReadFlashToExterMem(Page,4*1024,(ucharx *)(TempLen2),(ucharx *)(&TempBuffer2[0]));
		for(TempLen=0;TempLen<Length;TempLen++)
		{
			TempLen2=(uint)DestPointer;
			TempLen2=TempLen2&0x0fff;
			TempLen2=TempLen2+TempLen;
			TempBuffer2[TempLen2]=*(SourcePointer+TempLen);
		}
		FlashWriteEnable=Enable+safewrite;
		Result=EraseBlock(Page,(uchar)((uint)DestPointer>>12));
		if(Result!=0) return(Result);				//erase error
		TempLen=(uint)DestPointer;
		TempLen=TempLen&0xf000;
		Result=YJHExternalWriteFlash(Page,4*1024,(ucharx *)(&TempBuffer2[0]),TempLen);
	}
	else
	{
		Result=YJHExternalWriteFlash(Page,Length,SourcePointer,DestPointer);
	}
	return(Result);
}

uchar GetLastPersonID(uchar kind)
{
	uchar TempByte;
	uchar Counter;
	uchar Counter1;
	uint Address;
	ucharx TempBuffer[PersonTotalNum*OnePersonLength];

	Counter=GetOpenNum(kind);
	if(Counter==0)
	{
		Address=kind*PersonTotalNum*OnePersonLength;//指向当前人员的地址
		Address+=FirstPersonAdd;
		for(Counter1=0;Counter1<PersonTotalNum;Counter1++)
		{
			ZDHReadFlashToInterMem(ConfigFilePage,1,Address,(ucharx *)(&TempByte));
			if(TempByte==0xff) 
			{
				Counter=1;			//计算空地址
				break;
			}
			Address=Address+OnePersonLength;
		}
		if(Counter==0)
		{
			for(Address=0;Address<PersonTotalNum*OnePersonLength;Address++)
			{
				TempBuffer[Address]=0xff;	//无人员则重新格式化存储区
			}
		}
	}
	Address=kind*PersonTotalNum*OnePersonLength;	//指向当前人员的地址
	Address+=FirstPersonAdd;
	if(Counter==0) ZDHWriteFlash(ConfigFilePage,PersonTotalNum*OnePersonLength,(ucharx *)(&TempBuffer[0]),Address);
	Counter=(uchar)(GetLastRecord(ConfigFilePage,OnePersonLength,Address,PersonTotalNum,0));//查找可写入地址(标志为0xff的空地址)
	if(Counter==0) return(1);
	if(Counter<PersonTotalNum) return(Counter+1);
	Counter=(uchar)(GetLastRecord(ConfigFilePage,OnePersonLength,Address,PersonTotalNum,1));//查找可写入地址(标志不是0x55的空地址)
	return(Counter+1);
}

//返回:当前记录条数,0x15:人员满
uchar	WriteOneNewPerson(uchar Personkind,ucharx *PersonName,ucharx *Money,ucharx *Right)
{
	ucharx TempBuffer[OnePersonLength];
	uchar Counter,TempByte;
	uint Address;
	TempBuffer[0] = 0x55;						//标志
	TempBuffer[1] = 0xff;						//错误计数
	Address = Personkind*PersonTotalNum*OnePersonLength;		//指向当前人员的地址
	Address += FirstPersonAdd;
	TempBuffer[2] = (uchar)(GetLastRecord(ConfigFilePage,
	OnePersonLength, Address, PersonTotalNum, 0));//查找可写入地址(标志为0xff的空地址)
	if (TempBuffer[2] >= PersonTotalNum) {
		TempBuffer[2] = (uchar)(GetLastRecord(ConfigFilePage,
		OnePersonLength, Address, PersonTotalNum, 1));//查找可写入地址(标志不是0x55的纪录地址)
		if (TempBuffer[2] > PersonTotalNum) {
			return(PersonFull);	//返回人员满
		}
	}
	for (Counter = 0; Counter < 8; Counter++) {
		if (*(PersonName+Counter) == 0x20) {
			*(PersonName+Counter)=0xff;
		}
	}
	for (Counter = 3; Counter < 11; Counter++) {
		TempBuffer[Counter] = *PersonName++;			//人员姓名
	}
	for(Counter = 11; Counter<15; Counter++) {
		TempBuffer[Counter] = 0x11;				//口令
	}
	for(Counter = 15; Counter < (AccontNumber+15); Counter++) {
		TempBuffer[Counter] = *Right++;				//拷贝人员权限
	}
	AddCheckSum((ucharx *)(&TempBuffer[2]),OnePersonLength-3);	//加入校验和
	Address = Personkind*PersonTotalNum+TempBuffer[2];
	Address *= OnePersonLength;
	Address += FirstPersonAdd;
	TempByte = 
	ZDHWriteFlash(ConfigFilePage,OnePersonLength,
	(ucharx *)(&TempBuffer[0]),Address);
	if (TempByte != 0) {

⌨️ 快捷键说明

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