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

📄 trade_item.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-------------------------------------------------------------
功能:交易项目(包括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 + -