📄 manage.bak
字号:
/*
* Copyright (c) 2004,成都港顺科技发展有限公司
* All rights reserved.
*
* 编 译 器:Keil:C Compiler:7.20;Assembler:7.10
* 工程名称:POS-Test.UV2
* 文件名称:Manage.C
* 摘 要:商品信息管理
*
* 单 片 机:uPSD3254
* 当前版本:0.4
* 作 者:李凯,雍继兵
* 完成日期:2004-12-7 14:45
*/
#include "Main.h"
#include "Report.h"
#define write 1 // write = 1 no write = 0
#define Erasetest 1 // Erase = 1 no Erase = 0
#define Debug 1
#define LinkER 0x50
#define Overtime 0x52
#define CrCEr 0x51
#define ComandEr 0x53
#define ReceiveOver 0x54
#define SPDown 0x30
#define XMDown 0x31
#define DSPDown 0x32
#define DXMDown 0x33
#define ZKXW 0x34
#define ZKZW 0x35
#define DownTC 0x36
#define BaudrateSet 0x37
#define Com0 0x1b
#define Com1 0x10
#define Bps9600 1
#define Bps19200 2
#define SPlen 39
#define XMlen 33
#define xWStartadr 0
#define zWStartadr 0x10000
uchar BautRateFg;
uchar StartDown(uchar type,ulong address,uchar *EraseFlag,uchar len);
uchar InputTime(uchar row,uchar col,uchar *dat,uchar mode)
{
uchar i,val,count,tp[3];
uint cnt,time=0;
uchar const str[]={K_0,K_1,K_2,K_3,K_4,K_5,K_6,K_7,K_8,K_9,
K_RIGHT,K_DOWN,K_UP,K_LEFT,K_HJ,K_TC,K_QC};
cnt=CursorTime;
while(1)
{
if(mode)
{//输入两位数
tp[0]=(*dat>>4)+'0';
tp[1]=(*dat&0x0F)+'0';
tp[2]=0;
}
else
{//输入一位数
tp[0]=*dat+'0';
tp[1]=0;
}
i=0xF0;
val=0xFF;
count=0;
while(val==0xFF)
{
val = GetKey();
if(val!=0xFF)break;
time++;
if(time>cnt)
{
time = 0;
LcdDisplay(row,col,tp,i);
if(i==0)i=0xF0;
else i=0;
}
}
for(i=0;i<10;i++)
{
if(val==str[i])
{
if(mode)
{
*dat<<=4;
*dat|=i;
}
else *dat=i;
}
}
if(val==K_QC)
{
*dat=0;
continue;
}
for(i=10;i<16;i++)
{
if(val==str[i])
{
LcdDisplay(row,col,tp,0);
return val;
}
}
}
}
uchar ShowTime(uchar mode)
{
uchar str1[7]={"2000年"};
uchar str2[17]={"00月00日 星期0"};
uchar str3[13]={"00时00分00秒"};
uchar k;
uint time,cnt;
cnt=CursorTime;
if(mode==0)
LcdDisplay(0,56,"当 前 时 间",3);
else
LcdDisplay(0,56,"时 间 设 置",3);
while(1)
{
ReadDate();
str1[2]=(InvoDate[1]>>4)+'0';
str1[3]=(InvoDate[1]&0x0F)+'0'; //年
LcdDisplay(16,72,str1,1);
str2[0]=(InvoDate[2]>>4)+'0';
str2[1]=(InvoDate[2]&0x0F)+'0'; //月
str2[4]=(InvoDate[3]>>4)+'0';
str2[5]=(InvoDate[3]&0x0F)+'0'; //日
str2[13]=(InvoDate[4]&0x0F)+'0';//星期
LcdDisplay(32,40,str2,1);
str3[0]=(InvoDate[5]>>4)+'0';
str3[1]=(InvoDate[5]&0x0F)+'0'; //时
str3[4]=(InvoDate[6]>>4)+'0';
str3[5]=(InvoDate[6]&0x0F)+'0'; //分
str3[8]=(InvoDate[7]>>4)+'0';
str3[9]=(InvoDate[7]&0x0F)+'0'; //秒
LcdDisplay(48,48,str3,1);
if(mode!=0)return 1;
else
{
k=0xFF;
time=0;
while(k==0xFF)
{
time++;
if(time>cnt)break;
k = GetKey();
if(k==K_HJ || k==K_TC)
return 0;
}
}
}
}
void TimeSetup(uchar mode)
{//mode=2:只能修改时.分.秒;mode=1: 修改全部;mode=0: 只显示时间不修改时间
uchar i,j,k,f,m;
struct coordinate
{
uchar row;
uchar col;
};
struct coordinate tp[7]={{16,88},{32,40},{32,72},{32,144},{48,48},{48,80},{48,112}};
while(1)
{
if(ShowTime(mode)==0)return;
if(mode==1)
m=0;
// if(mode==2)
else
m=4;
i=m;
while(1)
{
if(i!=3)j=1;
else j=0;
k=InputTime(tp[i].row,tp[i].col,&InvoDate[i+1],j);
if(k==K_TC)return;
if(k==K_HJ)
{
f=1;
InvoDate[0]=0x20;
if(Verdict(InvoDate)==0)f=0;
if(InvoDate[4]>7 || InvoDate[4]==0)f=0;
if(InvoDate[5]>0x23 || InvoDate[6]>0x59 || InvoDate[7]>0x59)f=0;
if(f==1)break;
else
{
Hint(16,16,"时间格式错误!",3);
f=0;
break;
}
}
if(k==K_DOWN || k==K_RIGHT)
{
if(i<6)i++;
else i=m;
}
if(k==K_UP || k==K_LEFT)
{
if(i>m)i--;
else i=6;
}
}
if(f==1)break;
}
SetTime(&InvoDate[1]);
}
void StrToBar(uchar *str,uchar *bar)
{
gyt2 *xp;
gyt4 *tp;
ulong n;
uint m;
uchar i;
for(m=0,i=0;i<4;i++)
m=m*10+str[i]-'0';
for(n=0,i=4;i<13;i++)
n=n*10+str[i]-'0';
xp = bar;
xp->dat = m;
tp = &bar[2];
tp->dat = n;
}
void BcdToBar(uchar *bcd,uchar *bar)
{
uchar str[15],i,j,k;
k=bcd[0]&0x0F;
str[0]='0'+k; //条形码是13位10进制数,存储为BCD格式时最高位是0
i=1,j=1; //转换为字符串时应该将最高位的0去掉
while(i<7)
{
k=bcd[i]>>4;
str[j]=k+'0';
j++;
k=bcd[i]&0x0F;
str[j]=k+'0';
j++;
i++;
}
str[j]=0;
StrToBar(str,bar);
}
void BarToBcd(uchar *bar,uchar *bcd)
{
gyt2 *xp;
gyt4 *tp;
uint m,w;
ulong n,v;
uchar i,str[15];
m=1000;
n=100000000;
xp = bar;
tp = &bar[2];
w=xp->dat;
v=tp->dat;
if(w==0 && v==0)
{
for(i=0;i<7;i++)
bcd[i]=0;
return;
}
for(i=0;i<4;i++)
{
str[i]=w/m+'0';
w=w%m;
m/=10;
}
for(i=4;i<13;i++)
{
str[i]=v/n+'0';
v=v%n;
n/=10;
}
StrToBcd(13,str,bcd);
}
void WareShow(uint no,uchar *str,ulong pricein,ulong priceout,ulong numin,ulong numout,uchar *bar,uchar index)
{
gyt4 *xp;
uchar i,m;
m=0;
WindowsSet(7);
if((no & 0xFF00)==0xFF00)
{
strcpy(&WinHint[0][1],"项目:");
m=1; no -= 0xFF00;
}
else
strcpy(&WinHint[0][1],"PLU :");
NumToStr(no,&WinHint[0][6],SwitchInt);
strcpy(&WinHint[1][1],"名称:");
for(i=0;i<16;i++)
WinDat[1][2+i]=str[i];
WinDat[1][0]=3;WinDat[1][1]=16;
strcpy(&WinHint[2][1],"进货价格:");
xp = &WinDat[2][2];
xp->dat = pricein;
WinDat[2][0]=2;WinDat[2][1]=5;
strcpy(&WinHint[3][1],"销售价格:");
xp = &WinDat[3][2];
xp->dat = priceout;
WinDat[3][0]=2;WinDat[3][1]=5;
strcpy(&WinHint[4][1],"库存数量:");
xp = &WinDat[4][2];
xp->dat = numin;
WinDat[4][0]=2;WinDat[4][1]=5;
strcpy(&WinHint[5][1],"已销售数量:");
xp = &WinDat[5][2];
xp->dat = numout;
WinDat[5][0]=2;WinDat[5][1]=5;
strcpy(&WinHint[6][1],"税种税目索引号:");
xp = &WinDat[6][2];
xp->dat = index;
WinDat[6][0]=1;WinDat[6][1]=1;
if(m==0)
{//有条形码
WinHint[7][0]=1;
strcpy(&WinHint[7][1],"条形码:");
BarToBcd(bar,&WinDat[7][2]);
WinDat[7][0]=6;WinDat[7][1]=13;
}
}
uchar GetWareInfo(uint no,uchar mode)
{
gyt4 *wp,xp,hp,tp,mp,*fp;
uchar str[40],i,bar[7],k,len,warenamestr[17];
uchar m,flg,taxindex,index[7];
uint n;
ulong adr,gs;
n=no;
if((no & 0xFF00)==0xFF00)
{
m=1;
no -= 0xFF00;
gs = no-1;
adr = gs*33 + ItemAdr; //项目、部类
}
else
{
m=0;
gs = no-1;
adr = gs*39 + WareAdr; //PLU
}
memset(warenamestr,0,sizeof(warenamestr));
if(mode == 1)
{//增加商品
xp.dat=0;
hp.dat=0;
tp.dat=0;
mp.dat=0;
taxindex=0;
memset(bar,0,sizeof(bar));
}
else
{//修改商品
SerialFlashRead(FlashDat,adr,16,warenamestr);
SerialFlashRead(FlashDat,adr+16,4,xp.str);
SerialFlashRead(FlashDat,adr+20,4,hp.str);
SerialFlashRead(FlashDat,adr+24,4,mp.str);
SerialFlashRead(FlashDat,adr+28,4,tp.str);
SerialFlashRead(FlashDat,adr+32,1,str);
if(m==0)SerialFlashRead(FlashDat,adr+33,6,bar); //条形码
taxindex=str[0];
}
WareShow(n,warenamestr,xp.dat,hp.dat,mp.dat,tp.dat,bar,taxindex);
I2cRead(IndexItems,6,index);
I2cRead(SingleQuota,4,xp.str);
k=3;
if(mode == 1)k=2;
while(1)
{
bar[0]=K_TC;
bar[1]=K_HJ;
bar[2]=0;
i=Windows(k,1,bar);
if(i==K_TC || i==0xFF)return 0;
fp = &WinDat[6][2];
str[32]=(uchar)fp->dat;
flg=0;
for(i=0;i<6;i++)
{
if(index[i]==str[32])flg=1;
}
if(flg==0)
{
Hint(16,0,"税种税目索引号非法!",3);
continue;
}
wp = &str[20];
fp = &WinDat[3][2];
wp->dat=fp->dat;
if(fp->dat>xp.dat)
{
Hint(32,0,"销售价格超出最大限额!",3);
continue;
}
break;
}
for(i=0;i<16;i++)str[i]=WinDat[1][i+2];
wp = &str[16];
fp = &WinDat[2][2];
wp->dat=fp->dat;
wp = &str[24];
fp = &WinDat[4][2];
wp->dat=fp->dat;
wp = &str[28];
fp = &WinDat[5][2];
wp->dat=fp->dat;
len=33;
if(m!=1)
{
len=39;
BcdToBar(&WinDat[7][2],&str[33]);
}
LcdDisplay(8,16,"您确定要修改/添加吗?",3);
LcdDisplay(24,28,"--按<合计>键确定",0);
LcdDisplay(40,36,"--按其它键取消",0);
if(KeyScan()!=K_HJ)
return 0;
// #if FlashDatM25P80
// Modify(FlashDat,adr,len,str); //写入25P80
// #else
SerialFlashWrite(FlashDat,adr,len,str); //写入45P80
// #endif
return 1;
// Hint(16,32,"操作成功!",3);
}
void ManageSet()
{
gyt2 tp;
ulong adr;
uchar k,i,j,x,m,str[25];
uchar const xm[]={K_XM1,K_XM2,K_XM3,K_XM4,K_XM5,K_XM6,K_XM7,K_XM8,K_XM9,K_XM10,K_XM11,K_XM12,
K_XM13,K_XM14,K_XM15,K_XM16,K_XM17,K_XM18,K_XM19,K_XM20,K_XM21,K_XM22,K_XM23,K_XM24,K_XM25};
x=1;
while(1)
{
WindowsSet(5);
strcpy(&WinHint[0][1],"1.修改项目");
strcpy(&WinHint[1][1],"2.修改PLU");
strcpy(&WinHint[2][1],"3.增加项目");
strcpy(&WinHint[3][1],"4.增加PLU");
strcpy(&WinHint[4][1],"5.下载商品信息");
tp.dat=0;
str[0]=K_TC;
str[1]=K_HJ;
str[2]=0;
x=Windows(x,0,str);
if(str[0]==K_TC)return;
for(i=0;i<25;i++)str[i]=0;
switch(x)
{
case 1:
j=0;
LcdDisplay(0,0,"请输入项目编号:",3);
m=0;
while(1)
{
k=KeyScan();
if(k==K_TC)
{
m=1;
break;
}
if(k==K_HD)
{
j^=25;
if(j==0)LcdDisplay(16,0," ",1);
else LcdDisplay(16,0,"项目换档状态!",1);
continue;
}
for(i=0;i<25;i++)
if(k==xm[i])break;
if(i<25)break;
Beep(400);
}
if(m==1)break;
WareNo = (i+1+j)|0xFF00;
tp.dat = WareNo;
GetWareInfo(tp.dat,0);
break;
case 2: GetPlu(3);
if(WareNo==0)break;
GetWareInfo(WareNo,0);
break;
case 3: adr=ItemNumber; //当前项目数量 1 HEX
I2cRead(adr,1,tp.str);
if(tp.str[0]>=50) //test
{Hint(16,0,"项目数量已满!",3);break;}
tp.str[0]+=1;
WareNo = tp.str[0] | 0xFF00;
if(GetWareInfo(WareNo,1)==1)
I2cWrite(adr,1,tp.str);
break;
case 4: adr = PluNumber; //当前PLU数量 2 HEX
I2cRead(adr,2,tp.str);
if(tp.dat>=11900)
{Hint(16,0,"PLU数量已满!",3);break;}
tp.dat+=1;
WareNo=tp.dat;
if(GetWareInfo(WareNo,1)==1)
I2cWrite(adr,2,tp.str);
break;
case 5:
WareDown();
break;
default: Beep(400); break;
}
k=0;
}
}
/*--------------------------------------------------------------------------------
增加用户 或 删除用户
flag=1 增加用户 flag=0 删除用户
--------------------------------------------------------------------------------*/
uint InputSalerNo()
{
uint adr;
uchar InitLen[2];
InitLen[0]=0;
while(1)
{
LcdDisplay(16,56,"营业员:",1);
InitLen[0]=0;
SalerNo=GetInt(16,120,0,2,0,InitLen);//输入营业员编号
if(InitLen[0]==K_TC)return 0;
if(SalerNo!=0 && SalerNo<13)break;
LcdDisplay(48,16,"0 < 营业员编号 < 13",1);
}
adr=(SalerNo-1)*4+SalerPwd;
return adr;
}
void ModifyPwd(uint n)
{
ulong key;
uchar InitLen[2];
uint us1;
gyt4 pwd;
// LcdDisplay(32,40,"新 密 码:",1);
// LcdDisplay(48,40,"重复密码:",1);
if(n==0)
us1=BossPwd;
else
us1=n;
I2cRead(us1,4,pwd.str);//读出密码
while(1)
{
LcdDisplay(16,40,"原 密 码:",1);
InitLen[0]=0;
key=GetInt(16,120,0,8,1,InitLen);//输入原密码
if(InitLen[0]==K_TC)return;
if(pwd.dat==key)break;
LcdDisplay(48,32,"密码不正确!",1);
Beep(400);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -