📄 control.c.svn-base
字号:
#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 + -