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

📄 code_input.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
字号:
/*-------------------------------------------------------------
功能:键盘的区位码输入法
说明:符合国家标准GB18240.1-2003和GB18240.2-2003的税控机软件
日期:2003年6月12日
 
---------------------------------------------------------------*/
#include  "include.h"

/*==================================================================
函数功能:键盘的区位码输入法(输入数+小计+...确认)
入口参数:*inbuf--输入的汉字或ASCII字符存放缓冲区指针;
	  len--缓冲区长度(每个汉字占2字节,每个ASCII占1字节)
出口参数:*inbuf--输入的汉字或ASCII字符存放缓冲区指针;
返回值:   ==POWER_OFF,则表示断电,返回
	   ==0,成功
	   ==CANCEL,取消操作
全局变量:
编制人:     日期:2003-06-26
==================================================================*/	
/*uchar input_code(uchar *inbuf,uchar len)    
{
  uchar key;//键值
  uchar keynum;    //输入的键数
  uchar max_keynum;//最大允许输入键数
  #define MAX_KEY_LEN	10	//数字键字符串最大长度
  uchar numkey_buf[MAX_KEY_LEN];//输入的数字键字符串缓冲区
  uchar error;//错误类别
  ulong num;//输入数
  uchar nametmp;   //区位码暂存
  uchar i,j;                                      
  uchar cha_num,str_len;        //输入的字个数,输入字符串长度                             
  uchar disp_buf[MAX_LCD_COL*MAX_LCD_NUM+1];//显示缓冲,长度为lcd一页
  

  //----------初始化----------------//
  clear_lcd(0,4);
  for(i=0;i<MAX_KEY_LEN;i++) numkey_buf[i]=0;//初始化数字输入缓冲区
  keynum=0;
  max_keynum=4;
  error=0;
  str_len=0;
  cha_num=1;
  inbuf[0]=0;
  //----------提示当前功能--------------//
  strcpy(disp_buf,"区位码输入");
  lcd_disp(0,0,disp_buf);
  //----------提示下一步操作---------------//
  sprintf(disp_buf,"请输入第%1bu个字+[小计]:\r",cha_num); 
  lcd_disp(1,0,disp_buf);
  strcpy(disp_buf,"按[取消]退出");
  lcd_disp(3,0,disp_buf);
  
  while(1)
  {
    if(error) catch_error_display(error,0);//捕获错误
	openbacklight();
    if(low_pwr) return POWER_OFF;//监测到断电了,则exit 
    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;//清除数字输入缓冲区
          keynum=0;
          clear_lcd(2,2);//清除数字显示
        }
        else if(inbuf[0]!=0) //若有字产生
        {
          if(inbuf[--str_len]>0xa0)//汉字
          {                                       
            if(str_len) str_len--;
            if(cha_num) cha_num--;
          }
          else  
          {
            if(cha_num) cha_num--;   //ASCII    
          }
          keynum=0;                      
	}
      break;
      //-------取得输入数字键-------//
      case '0' :
      case '1' :
      case '2' :
      case '3' :
      case '4' :
      case '5' :
      case '6' :
      case '7' :
      case '8' :
      case '9' :
      case KEY00://双0
      //-------取得输入数字键-------//
        error=get_valid_digit(key,0,max_keynum,numkey_buf);
	if(error)//输入非法 
	{
	  error=KEY_ERROR;
	  break;
	}
	keynum++;
	//------显示输入数-------//
	clear_lcd(2,2);
	lcd_disp(3,0,numkey_buf);
      break;  	
      case SUBTOTAL:    
        if(keynum==max_keynum) //input a char code over
        {
          num=numstr_to_long(numkey_buf,0);//转换输入数为十进制
	  for(i=0;i<MAX_KEY_LEN;i++) numkey_buf[i]=0;//初始化数字输入缓冲区
          nametmp=num/100;
          if(nametmp==10)                       //ASCII code
          {
            nametmp=num%100;
            if((1<=nametmp)&&(nametmp<=96))
            {
              if(str_len<len)//not overflow
              {
                inbuf[str_len]=nametmp+31;
                str_len++;
                inbuf[str_len]=0;
                keynum=0; //input next
                cha_num++;
               break;
              }
            }
              error=OVER_RANGE_ERROR;
              break;
          }//if ASCII code

          nametmp=num/100;
          if(((0<nametmp)&&(nametmp<10))||((15<nametmp)&&(nametmp<88))) 
          {
            nametmp=num%100;
            if((0<nametmp)&&(nametmp<95))       //a vaild code
            {
              if(str_len<(len-1))                                                             //not overflow
              {
                nametmp=num/100;
                inbuf[str_len]=nametmp+0xa0;
                str_len++;
                nametmp=num%100;
                inbuf[str_len]=nametmp+0xa0;
                str_len++;
                inbuf[str_len]=0;
                keynum=0;                       //input next
                cha_num++;
		break;
              }
	    }
          }//if input a 汉字区位码
          error=OVER_RANGE_ERROR;
          break;
        }//if(keynum==max_keynum)
	error=KEY_ERROR;
      break;
      case ENTER://最后确定
        if(keynum!=0||inbuf[0]==0)//输入数字, 未取区位码或未输入汉字/字符
        {
          error=KEY_ERROR;
	  break;
	}
	return 0;
      break;
      default://按下其他键,报错
        error=KEY_ERROR;
      break;
    }//switch
    //----------提示下一步操作---------------//
    if(!error)
    {
      if(str_len>48)j=str_len-48;
      else if(str_len>24)j=str_len-24;
      else j=0;
      sprintf(disp_buf,"请输入第%1bu个字+[小计]:\r%s\r",cha_num,&inbuf[j]);
      clear_lcd(1,2);
      lcd_disp(1,0,disp_buf);
    }
  }//while
}
*/

⌨️ 快捷键说明

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