📄 trade_item.c
字号:
/*-------------------------------------------------------------
功能:交易项目(包括plu和部门)的操作--读写、检查、查找、设置
说明:符合国家标准GB18240.1-2003和GB18240.2-2003的税控机软件
日期:2003年6月12日
---------------------------------------------------------------*/
#include "include.h"
//extern uint g_max_plu_no;//最大plu号
//extern uchar g_stocks_opened;//库存管理已经打开
//===================================================================
//把一个LONG型的数据的高位与低位对调
void ulong_exchange(ulong *num)
{
uchar temp;
temp = *((uchar *)num);
*((uchar *)num) = *((uchar *)num+3);
*((uchar *)num+3) = temp;
temp = *((uchar *)num+1);
*((uchar *)num+1) = *((uchar *)num+2);
*((uchar *)num+2) = temp;
}
//======================================================================
//把一个uint型的数据的高位与低位对调
void uint_exchange(uint *num)
{
uchar temp;
temp = *((uchar *)num);
*((uchar *)num) = *((uchar *)num+1);
*((uchar *)num+1) = temp;
}
/*-----------------------------------------------------
读取PLU
入口参数:
plu_no_t == 需要读取的PLU号
plu == 存放PLU的缓冲区
-----------------------------------------------------*/
uchar read_plu(uint plu_no_t,struct plu_struct *plu)
{
if(plu_no_t>MAX_PLU_NUM) return OVER_RANGE_ERROR;
if(read_sramb(PLU_START_ADDR+(ulong)plu_no_t*PLU_STRUCT_LEN,PLU_STRUCT_LEN,plu))
return(READ_SRAM_FAIL);
// if(lrcdata((uint)sizeof(*plu)-1,1,plu)!=plu->lrc)
// return(LRC_ERROR);
return 0;
}
/*-----------------------------------------------------
写入PLU(包括异或和校验)
入口参数:
plu_no_t == 需要写入的PLU号
plu == 存放PLU的缓冲区
-----------------------------------------------------*/
uchar write_plu(uint plu_no_t,struct plu_struct *plu)
{
if(plu_no_t>MAX_PLU_NUM) return OVER_RANGE_ERROR;
plu->crc = crcxdata((uint)sizeof(*plu)-2,plu);
//plu->lrc = lrcdata(PLU_STRUCT_LEN-1,1,(uchar *)plu);
if(write_sramb(PLU_START_ADDR+(ulong)plu_no_t*PLU_STRUCT_LEN,PLU_STRUCT_LEN,plu))
return(WRITE_SRAM_FAIL);
return 0;
}
/*-----------------------------------------------------
读入全部PLU
入口参数:
start_no == 需要读取的起始PLU号
num == 需要读入的PLU条数
buf == 存放PLU的缓冲区
-----------------------------------------------------*/
uchar read_plu_all(uint start_no,uint num,uchar *buf)
{
struct plu_struct plu;
uint i;
uchar *p,j;
if(start_no+num>MAX_PLU_NUM) return OVER_RANGE_ERROR;
for(i=0;i<num;i++)
{
if(read_sramb(PLU_START_ADDR+(ulong)(start_no+i)*PLU_STRUCT_LEN,PLU_STRUCT_LEN,(uchar*)&plu))
return(WRITE_SRAM_FAIL);
ulong_exchange(&plu.price);
ulong_exchange(&plu.quantity);
ulong_exchange(&plu.money);
ulong_exchange(&plu.retreat_num);
ulong_exchange(&plu.retreat_money);
ulong_exchange(&plu.stocks);
plu.crc=crcxdata((uint)sizeof(plu)-2,(uchar*)&plu);
uint_exchange(&plu.crc);
p=(uchar*)&plu;
for(j=0;j<PLU_STRUCT_LEN;j++)buf[i*PLU_STRUCT_LEN+j]=*p++;
//strncpy(&buf[i*PLU_STRUCT_LEN],(uchar*)&plu,PLU_STRUCT_LEN);
}
//if(read_sramb(PLU_START_ADDR+(ulong)start_no*PLU_STRUCT_LEN,(ulong)num*PLU_STRUCT_LEN,buf))
//return(READ_SRAM_FAIL);
return 0;
}
/*-----------------------------------------------------
写入全部PLU
入口参数:
start_no == 需要读取的起始PLU号
num == 需要写入的PLU条数
buf == 存放PLU的缓冲区
-----------------------------------------------------*/
uchar write_plu_all(uint start_no,uint num,uchar *buf)
{
/* struct plu_struct
{
uchar name[16]; //PLU名称
ulong price; //PLU单价
uchar unitname; //单位名称(克..等)
uchar bar_code[6]; //条形码
ulong quantity; //销售量
ulong money; //销售额
ulong retreat_num; //plu退款数量
ulong retreat_money; //plu退款额
ulong stocks; //库存量
uchar branch; //PLU所属部门
uchar tax_item; //税目编码
uint crc; //累加和校验
};
*/
struct plu_struct plu;
uchar *p,j;
uint i;
if(start_no+num>MAX_PLU_NUM) return OVER_RANGE_ERROR;
for(i=0;i<num;i++)
{
//strncpy((uchar*)&plu,&buf[i*PLU_STRUCT_LEN],PLU_STRUCT_LEN);
p=(uchar*)&plu;
for(j=0;j<PLU_STRUCT_LEN;j++)*p++=buf[i*PLU_STRUCT_LEN+j];
//send_str(PLU_STRUCT_LEN,(uchar*)&plu);
ulong_exchange(&plu.price);
ulong_exchange(&plu.quantity);
ulong_exchange(&plu.money);
ulong_exchange(&plu.retreat_num);
ulong_exchange(&plu.retreat_money);
ulong_exchange(&plu.stocks);
plu.crc=crcxdata((uint)sizeof(plu)-2,(uchar*)&plu);
//uint_exchange(&plu.crc);
if(write_sramb(PLU_START_ADDR+(ulong)(start_no+i)*PLU_STRUCT_LEN,PLU_STRUCT_LEN,(uchar*)&plu))
return(WRITE_SRAM_FAIL);
}
//if(write_sramb(PLU_START_ADDR+(ulong)start_no*PLU_STRUCT_LEN,(ulong)num*PLU_STRUCT_LEN,buf))
//return(WRITE_SRAM_FAIL);
return 0;
}
/*-----------------------------------------------------
写入PLU名称
入口参数:
start_no == 需要读取的起始PLU号
num == 需要写入的PLU条数
buf == 存放PLU的缓冲区
-----------------------------------------------------*/
uchar write_plu_name(uint start_no,uint num,uchar *buf)
{
uint i,error;
struct plu_struct plu_back;
for(i=0;i<num;i++)
{
error=read_plu(start_no+i,&plu_back); //读出原PLU的信息
if(error) return error;
memcpy(plu_back.name,&buf[i*PLU_HEAD_LEN],PLU_HEAD_LEN);//覆盖plu_back.name起前PLU_HEAD_LEN个数据
error=write_plu(start_no+i,&plu_back); //重新写入原SRAM中
if(error) return error;
}
return 0;
}
/*-----------------------------------------------------
读入PLU名称
入口参数:
start_no == 需要读取的起始PLU号
num == 需要读入的PLU条数
buf == 存放PLU的缓冲区
-----------------------------------------------------*/
uchar read_plu_name(uint start_no,uint num,uchar *buf)
{
uint i,error;
struct plu_struct plu_back;
for(i=0;i<num;i++)
{
error=read_plu(start_no+i,&plu_back);
if(error) return error;
memcpy(&buf[i*PLU_HEAD_LEN],plu_back.name,PLU_HEAD_LEN);
}
return 0;
}
/*==================================================================
函数功能:设置最大PLU号(模式:输入数+确认)
入口参数:
出口参数:
返回值: ==POWER_OFF,则表示断电,返回
==OK,成功
==CANCEL,取消操作
全局变量:g_max_plu_no
编制人: 日期:2003-06-26
==================================================================*/
uchar set_max_plu_no()
{
uchar disp_buf[MAX_LCD_COL*MAX_LCD_NUM+1];//显示缓冲,长度为lcd一页
uchar key;//键值
#define MAX_KEY_LEN 10 //数字键字符串最大长度
uchar numkey_buf[MAX_KEY_LEN];//输入的数字键字符串缓冲区
uchar point,max_key_num;//是否允许输入小数,最大允许输入键数
uchar error;//错误类别
ulong num;//输入数
uchar i;
//----------初始化----------------//
clear_lcd(0,4);
error=0;
for(i=0;i<MAX_KEY_LEN;i++) numkey_buf[i]=0;//初始化数字输入缓冲区
point=0;
max_key_num=4;
//----------提示当前功能--------------//
get_menu_name_sp(MAX_LAYER_MENU,SET_MAX_PLU,disp_buf);
lcd_disp(0,0,disp_buf);
//----------提示下一步操作---------------//
sprintf(disp_buf,"请输入最大商品号\r取值范围[1,%d]\r",(uint)MAX_PLU_NUM);
lcd_disp(1,0,disp_buf);
//----------等待按键---------------//
while(1)
{
if(error) catch_error_display(error,0);//捕获错误
if(low_pwr) return POWER_OFF;//监测到断电了,则exit
openbacklight();
key = get_key();
if(!key) continue;
//beep(50);
if(error&&key!=CLEAR&&key!=VOID) continue;//出错后,须即时更正或取消操作
switch(key)
{
case VOID://取消操作
clear_lcd(1,2);
return CANCEL;
break;
case CLEAR://即时更正
if(error)//报错时
{
clear_lcd(3,1);//清除错误显示
error=0;//清除错误标志
}
if(numkey_buf[0]!=0)//若有数输入
{
numkey_buf[0]=0;//清除数字输入缓冲区
clear_lcd(2,1);//清除数字显示
}
break;
//-------取得输入数字键-------//
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
case KEY00://双0
case POINT://小数点
//-------取得输入数字键-------//
error=get_valid_digit(key,point,max_key_num,numkey_buf);
if(error)//输入非法
{
error=KEY_ERROR;
break;
}
//------显示输入数-------//
clear_lcd(2,1);
lcd_disp(2,0,numkey_buf);
break;
case ENTER://最后确定
if(numkey_buf[0]==0)//未输入任何数字
{
error=KEY_ERROR;
break;
}
num=numstr_to_long(numkey_buf,point,2);//转换输入数为十进制
if(!num||num>MAX_PLU_NUM)//检查其合法性
{
error=OVER_RANGE_ERROR;
break;
}
g_max_plu_no = num;
error = write_eeprom(PLU_NUM,2,&g_max_plu_no);
if(error)
{
error = WRITE_EEPROM_FAIL;
break;
}
for(i=0;i<MAX_KEY_LEN;i++) numkey_buf[i]=0;//初始化数字输入缓冲区
//----------提示设置结果---------------//
sprintf(disp_buf,"最大商品号:%d\r\r",g_max_plu_no);
clear_lcd(1,1);
lcd_disp(1,0,disp_buf);
con_disp(1,0,strlen(disp_buf),disp_buf);
return OK;
break;
default:
error=KEY_ERROR;
break;
}
}
}
/*========================================================================
函数功能:设置交易项目,包括部门名称和对应税目索引号、plu的单价、所属部门、
库存量、名称和对应税目索引号。
(操作模式:输入数+功能键+输入数+小计+...确认)
说明: 可以多次连续输入设置;
入口参数:function--功能号
出口参数:
返回值: ==POWER_OFF,则表示断电,返回
==OK,成功
==CANCEL,取消操作
全局变量:g_tax_catalog,g_stocks_opened
编制人: 日期:2003-06-27
======================================================================*/
uchar set_trade_item(uchar function)
{
uchar xdata disp_buf[MAX_LCD_COL*MAX_LCD_NUM+1];//显示缓冲,长度为lcd一页
uchar key;//键值
#define MAX_KEY_LEN 10 //数字键字符串最大长度
uchar xdata numkey_buf[MAX_KEY_LEN];//输入的数字键字符串缓冲区
uchar point,max_key_num;//是否允许输入小数,最大允许输入键数
uchar error;//错误类别
ulong num,num_tmp;//输入数
uchar code_inputed,tmp_inputed;//每次设置的第一步完成了
struct plu_struct xdata plu_t;
struct branch_struct xdata branch[MAX_BRANCH_NUM+1];
uchar cha_menu[3]={PINYIN,0, 0}; //QW_CODE
//uchar cur_line;//菜单当前行
uchar xdata buf[61];
uchar i;
uchar stock_seted,displayed;
//----------初始化----------------//
clear_lcd(0,4);
error=0;
stock_seted=0;
displayed=0;
for(i=0;i<MAX_KEY_LEN;i++) numkey_buf[i]=0;//初始化数字输入缓冲区
code_inputed=0;
tmp_inputed=1;
// item_input_step=0;
//----------提示当前功能--------------//
get_menu_name_sp(MAX_LAYER_MENU,function,disp_buf);
lcd_disp(0,0,disp_buf);
//----------等待按键---------------//
while(1)
{
if(low_pwr) return(POWER_OFF);
//----------提示下一步操作---------------//
if(!code_inputed)//第一步未开始
{
point=0;
if(function==BRANCH_MANAGEMENT)
{
#ifdef C6_VER
max_key_num=2;
#else
max_key_num=3;
#endif
strcpy(disp_buf,"请输入部门号:\r");
}
else
{
max_key_num=4;
strcpy(disp_buf,"请输入商品号:\r");
}
if(tmp_inputed!=code_inputed)
{
clear_lcd(1,2);
lcd_disp(1,0,disp_buf);
tmp_inputed=code_inputed;
}
}
if(function==PLU_MANAGEMENT)
{
if(code_inputed==1)
{
sprintf(disp_buf,"请输入商品%lu的名称\r按[确认]继续\r或按[取消]进入下一项设置",num_tmp);
clear_lcd(1,1);
lcd_disp(1,0,disp_buf);
error=wait_usal_key(1);//等待打开或退出操作
if(error!=OK)
{
error=0;
clear_lcd(0,4);
code_inputed++;
continue;
}
/*cur_line=select_sigle_layer_menu(CHA_INPUT_SUB,cha_menu);
if(!cur_line)
{
clear_lcd(0,4);
code_inputed++;
continue;
}
else if(cur_line==POWER_OFF) return POWER_OFF;
if(cur_line==1)
*/
if(low_pwr) return POWER_OFF;//监测到断电了,则exit
//2005.8.5
error =Get_HzString(10,buf); //Get_HzString(12,buf);
/*
else
{
clear_lcd(0,1);
error = input_code(buf,24);
}
*/
if(error==CANCEL)
{
error=0;
clear_lcd(0,4);
code_inputed++;
continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -