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

📄 input_op.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
    key = get_key();
    if(!key) continue;
    //beep(50);
    if(error&&key!=CLEAR&&key!=VOID) continue;//出错后,须即时更正或取消操作
    switch(key)
    {
      case VOID://取消操作
        clear_lcd(1,2);
        Last_line=0xff;
		dismode=0;
        return CANCEL;
      break;
      case CLEAR://取消操作
        if(error)//报错时
        {
          clear_lcd(3,1);//清除错误显示
          error=0;      //清除错误标志
        }
      break;
      
      case PAPER1://若按下[走纸]键,则走纸1行
		if(mode==1||mode==2) 
        {
			error=KEY_ERROR;
			break;
        }
		#ifdef C6_VER
			error=Fast_feed_paper_hang(120);
			if(error) return LINE_FEED_FAIL;
		#else
			feed_on_line(1);
		#endif
		break;
      
		#ifdef HYS620
		case BACK_PAPER://若按下[走纸]键,则走纸1行
			if(mode==1||mode==2) 
			{
				error=KEY_ERROR;
				break;
			}
			back_on_dot(120);
			break;
		#endif
      
		case ENTER://最后确定
			if(mode==2) 
			{
				error=KEY_ERROR;
				break;
			}
			Last_line=0xff;
			dismode=0;
			return OK;
			break;
			
		default:
			error=KEY_ERROR;
			break;
		}
	}
}
/*****************************************************************************************
 函数功能: 每输入一个数字键,判断已经输入的数字字符串是否合法.若合法,则转换到数字缓冲区中.
 说明:        
 入口参数: numkey--输入一个数字键;
	    ponit--是否允许输入小数点
            max_key_num--输入时允许的最大数字键长度(不包括小数点)
            *numkey_str--以'\0'为结束符的数字字符串指针(包括小数点)
            特别说明:numkey_str缓冲区大小必须大于max_key_num,小于40
            
 出口参数: *numkey_str--以'\0'为结束符的数字字符串指针(包括小数点)
 返回值  : 有效返回0,否则返回1
 
 作者:
 日期:2003-06-23
*************************************************************************************/
uchar get_valid_digit(uchar numkey,uchar point,uchar max_key_num,uchar *numkey_str)
{
  uchar i;
  uchar haspoint;
  uchar len;//输入的数字字符串长度
  #define MAX_DIGIT_LEN 40
  uchar key_buf[MAX_DIGIT_LEN+1];
  
  set_value0(key_buf,MAX_DIGIT_LEN+1);
  if(max_key_num>MAX_DIGIT_LEN) max_key_num=MAX_DIGIT_LEN;
  if((numkey<'0'||numkey>'9')&&(numkey!=POINT)&&(numkey!=KEY00)&&(numkey!='-')) 
	  return 1;//非有效数字键
  if(!point&&numkey==POINT) 
	  return 1;//如果不允许输入小数点却又输入了,则非法
  
  len=strlen((const char *)numkey_str);//之前已经输入的数字字符串长度即键数
  //if(len==0)
	  //len=1;
  if(len)
    memcpy(key_buf,numkey_str,len);
  key_buf[len]='\0';
  if(numkey==KEY00) //输入双0键后
  {
    key_buf[len]='0';
    key_buf[len+1]='0';
    key_buf[len+2]=0;//结束符
    len+=2;//目前为止输入的键数
  }
  else //输入非双0键
  {
    key_buf[len]=numkey;
	 //strcat(key_buf,numkey);//将当前输入的键值添加到数字键缓冲区
    //if(numkey!=POINT)//输入非小数点
      len++;//目前为止输入的键数
  }
  if(point)
  {
	if(len>max_key_num+1) return 1;//如果目前为止输入的键数超过输入时允许的最大数字键长度,则非法
  }
  else
	if(len>max_key_num) return 1;//如果目前为止输入的键数超过输入时允许的最大数字键长度,则非法
  
  
  if(point)//允许输入小数点时
  {
    if(key_buf[0]==KEY00||key_buf[0]==POINT) return 1;//第1位输入的为00或小数点则非法
    if(key_buf[0]=='0' && (key_buf[1]!=0 && key_buf[1]!=POINT)&&(point==1))//排除条形码输入
      return(1);//若第1位为0,但第2位输入的不是小数点,则非法
    haspoint=0;
    for(i=0;i<len;i++)
    {
      if(key_buf[i]==POINT)
      {
        if(haspoint) return(1);//输入的小数点超过1个,非法
        haspoint=1;
      }
      if(haspoint)
      {//小数点后输入超过2位,非法
	    //2005.11.25
		if(len>ALLOW_INPOINT && i<(len-ALLOW_INPOINT-1))//if(len>=3 && i<len-3) 
			return 1;
      }
    }
  }
  memcpy(numkey_str,key_buf,len);//当前数字字符串
  numkey_str[len]='\0';
  return 0;
}

//==========================================================================================
uchar look_up_pointlong(uchar *numkey_str)
{
	uchar i,len;
	uchar pointlong;
	uchar haspoint;

	pointlong=0;
	haspoint=0;
	len=strlen((const char *)numkey_str);
	for(i=0;i<len;i++)
	{
		if(numkey_str[i]==POINT)haspoint=1;
		else if(haspoint)pointlong++;
	}
	return pointlong;
}

//=======================================================================================
uchar look_up_fushu(uchar *numkey_str)
{
	uchar i,len;
  
	len=strlen((const char *)numkey_str);
	for(i=0;i<len;i++)
	{
		if(numkey_str[i]=='-')return 1;
	}
	return 0; 

}
 
 
/*****************************************************************************************
 函数功能: 将数字字符串转换为无符号长整形数.
 	    (如"1234567.09" 则可以表示为123456709,扩大了10^pointlong倍) 
 说明:      小数点后没有输入数时,作为整数处理
 入口参数: *numkey_str--以'\0'为结束符的数字字符串指针(包括小数点)
           ponit--是否允许输入小数点,0表示不允许,否则表示允许
 出口参数: 		 
 返回值  : num--转换后的无符号长整形数(允许小数点则扩大了100倍,否则
            不扩大)
 
 作者:
 日期:2005-11-26
*************************************************************************************/
ulong numstr_to_long(uchar *num_str,uchar allow_point,uchar pointlong )
{ 
  uchar i,k,j;
  uchar len,point;
  ulong num;
  uchar times; //次数

  len=strlen((const char *)num_str);//数字字符串的长度
  if((pointlong==0)&&(allow_point))allow_point=0;
  for(i=0;i<len;i++)//找小数点的位置
  {
    if(num_str[i]==POINT) 
		if(allow_point) //允许小数点
			break;
		else
			return(0); //不允许小数点
  }
  point=i;//得到小数点的位置
  if(point==0) return(0);//没有可转换的数字
	  
  if((point==len-2)&&(pointlong==2)) //若小数点后只有1位数
  {
    num_str[len]='0';//在其后添加数字'0';
	len+=1;//数字长度加1
    num_str[len+1]=0;//结束符
    
  }	
  num=0;
  for(j=0;j<len;j++)//转换除了小数点本身之外的数字
  {
    k=num_str[j];
	 if(j<point)//整数部分
    {
      if(allow_point) 
		times=point-j+pointlong-1;//允许小数点,扩大10^pointlong倍
	  else
		times=point-j-1 ; //不允许小数点,则不扩大
	  if(num+(k-0x30)*mypow(10,times)>0xffffffffL)
			return(0xffffffffL);
		num=num+(ulong)((k-0x30)*mypow(10,times));
    }
    else if(j>point) //小数部分
    {
      if(num+(k-0x30)*mypow(10,pointlong-j+point)>0xffffffffL)
		return(0xffffffffL);
      num+=(k-0x30)*mypow(10,pointlong-j+point); //扩大了10^pointlong倍
    }
  
 }
  return(num);
}
/*****************************************************************************************
 函数功能: 将数字字符串转换为无符号长整形数.
 	    (如"1234567.09" 则可以表示为123456709,扩大了100倍) 
 说明:      小数点后没有输入数时,作为整数处理
 入口参数: *numkey_str--以'\0'为结束符的数字字符串指针(包括小数点)
           ponit--是否允许输入小数点,0表示不允许,否则表示允许
 出口参数: 		 
 返回值  : num--转换后的无符号长整形数(允许小数点则扩大了100倍,否则
            不扩大)
 
 作者:
 日期:2003-06-23
*************************************************************************************/
/*
ulong numstr_to_long(uchar *num_str,uchar allow_point)
{ 
  uchar i,k,j;
  uchar len,point;
  ulong num;
  uchar times; //次数
  
  len=strlen((const char *)num_str);//数字字符串的长度
  for(i=0;i<len;i++)//找小数点的位置
  {
    if(num_str[i]==POINT) 
		if(allow_point) //允许小数点
			break;
		else
			return(0); //不允许小数点
  }
  point=i;//得到小数点的位置
  if(point==0) //没有可转换的数字
	  return(0);
  if(point==len-2) //若小数点后只有1位数
  {
    //2005.11.25
    for(i=len;i<(len+2*allow_point-1);i++)
    {
	 num_str[i]='0';
     len+=1;//数字长度加1
	}
    //num_str[len]='0';//在其后添加数字'0';
	//len+=1;//数字长度加1
    num_str[len+1]=0;//结束符
    
  }	
  num=0;
  for(j=0;j<len;j++)//转换除了小数点本身之外的数字
  {
    k=num_str[j];
	//2005.11.25

	/* if(j<point)//整数部分
    {
      if(allow_point) 
		times=point-j+2*allow_point-1;//允许小数点,扩大100倍
	  else
		times=point-j-1 ; //不允许小数点,则不扩大
	  if(num+(k-0x30)*mypow(10,times)>0xffffffffL)
			return(0xffffffffL);
		num=num+(ulong)((k-0x30)*mypow(10,times));
    }
    else if(j>point) //小数部分
    {
      if(num+(k-0x30)*mypow(10,2*allow_point-j+point)>0xffffffffL)
		return(0xffffffffL);
      num+=(k-0x30)*mypow(10,2*allow_point-j+point); //扩大了100倍
    }
  */
   /* if(j<point)//整数部分
    {
      if(allow_point) 
		times=point-j+1;//允许小数点,扩大100倍
	  else
		times=point-j-1 ; //不允许小数点,则不扩大
	  if(num+(k-0x30)*mypow(10,times)>0xffffffffL)
			return(0xffffffffL);
		num=num+(ulong)((k-0x30)*mypow(10,times));
    }
    else if(j>point) //小数部分
    {
      if(num+(k-0x30)*mypow(10,2-j+point)>0xffffffffL)
		return(0xffffffffL);
      num+=(k-0x30)*mypow(10,2-j+point); //扩大了100倍
    }
	
 }
  return(num);
}
*/

⌨️ 快捷键说明

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