📄 code_input.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 + -