📄 input_op.c
字号:
/*-------------------------------------------------------------
功能:输入操作--菜单选择功能和等待输入数
说明:符合国家标准GB18240.1-2003和GB18240.2-2003的税控机软件
日期:2003年6月12日
---------------------------------------------------------------*/
#include "include.h"
#define ARROW_UP_KEY UP_ARROW //上移
#define ARROW_DOWN_KEY DOWN_ARROW //下移
#define PAGE_UP_KEY LEFT_ARROW //上翻页
#define PAGE_DOWN_KEY RIGHT_ARROW //下翻页
#define ENTER_KEY ENTER //选定
#define ESCAPE VOID //返回操作
#define NO_CHOOSED 0x0 //未选定任何菜单
#define IS_CHOOSED 0x1 //选定某项菜单
#define EXIT_CHOOSE 0xfe //返回上一级菜单
#define LCD_LINE MAX_LCD_NUM //LCD每一页面有4行
#define LCD_COL MAX_LCD_COL //LCD每一页面有24列
/*-----------------------------------------------------------------
函数功能:显示某一页菜单
说明:
入口参数:mode--方式锁位置;
layer--菜单级别;
*item_func_no--某一级下其中一个子菜单项所有功能号缓冲区地址;
(数据格式:item_func_no[]={功能号数目n,功能号1,...功能号n})
cur_line--当前菜单行 (从1开始)
出口参数:
返回值:
全局变量:
编制人: 日期:2003-06-17
------------------------------------------------------------------*/
void display_menu_page(uchar mode,uchar layer,uchar *item_func_no,uchar cur_line)
{
//LCD_LINE=4;LCD_COL=24
uchar xdata buf_LN[LCD_COL+1]; //1行显示缓冲区
//uchar xdata buf_PG[LCD_LINE*LCD_COL+1];//1页显示缓冲区
uchar start_line;//某一页的开始行
uchar i;
uchar item_num;//某一级中一个子菜单项数
//uchar xdata item_len[LCD_LINE+1];//某一页中各子菜单项的长度暂存
uchar con_disp_line;//反显行
uchar con_disp_locate;//反显开始位置
static uchar xdata buf_PG[LCD_LINE*LCD_COL+1];
static uchar xdata item_len[LCD_LINE+1];
static uchar Last_layer=0xff;
if(Last_layer!=layer){Last_layer=layer;Last_line=0xff;dismode=0;}
if(Last_line!=cur_line-1)
{
if(!dismode) //整屏刷新
{
buf_PG[0]=0;
item_num=strlen(item_func_no);//得到此菜单项功能号数目
start_line=(cur_line-1)/LCD_LINE*LCD_LINE; //4行
if(start_line>3)dismode=0;
for(i=start_line;i<start_line+LCD_LINE;i++)
{//取得某一页菜单项名称并暂存
get_menu_name(mode,layer,item_func_no[i],buf_LN);//取得某一项菜单项名称
strcat(buf_PG,buf_LN);
item_len[i-start_line]=strlen(buf_LN);
if(i==(item_num-1)) break;//达到菜单项功能号最大数目时退出
}
if(!dismode)
clear_lcd(0,LCD_LINE);
lcd_disp(0,0,buf_PG);//显示某一页菜单
con_disp_line=(cur_line-1)%LCD_LINE;
con_disp_locate=0;
for(i=0;i<con_disp_line;i++)con_disp_locate+=item_len[i];
con_disp(con_disp_line,0,item_len[con_disp_line],&buf_PG[con_disp_locate]);//反显所选的菜单
Last_line=cur_line-1;
}
else //刷新两行
{
con_disp_line=Last_line%LCD_LINE;
con_disp_locate=0;
for(i=0;i<con_disp_line;i++)con_disp_locate+=item_len[i];
strncpy(buf_LN,&buf_PG[con_disp_locate],item_len[i]);
buf_LN[item_len[i]-1]=0;
lcd_disp(con_disp_line,0,buf_LN);//正常显示上次的反显行
con_disp_line=(cur_line-1)%LCD_LINE;
con_disp_locate=0;
for(i=0;i<con_disp_line;i++)con_disp_locate+=item_len[i];
con_disp(con_disp_line,0,item_len[con_disp_line],&buf_PG[con_disp_locate]);//反显所选的菜单
Last_line=cur_line-1;
}
}
}
/*===========================================================================
函数功能:对某一级菜单的菜单项进行选择操作
入口参数:choose_key--选择键键值
item_num--某一级菜单中子菜单项数
出口参数:*cur_line--当前菜单行指针 (菜单行从1开始)
返回值: ==0x0,未选定; ==0x1,选定;==0xfe,返回上一级
全局变量:
编制人: 日期:2003-06-17
============================================================================*/
uchar choose_home_menu(uchar choose_key,uchar *cur_line)
{
uchar over;
uchar choosed_line;
over=NO_CHOOSED;
choosed_line=*cur_line;
switch(choose_key)
{
case ARROW_UP_KEY: //上移
if((choosed_line!=1)&&(choosed_line!=2))
{
choosed_line-=2;
}
else
{
if(choosed_line==1)choosed_line=6;
else if(choosed_line==2)choosed_line=5;
}
break;
case ARROW_DOWN_KEY://下移
if(choosed_line%2)
{
if(choosed_line<4)choosed_line+=2;
else choosed_line=2;
}
else
{
if(choosed_line<6)choosed_line+=2;
else choosed_line=1;
}
break;
case PAGE_UP_KEY: //上翻页
if(!(choosed_line%2))
{
choosed_line-=1;
}
break;
case PAGE_DOWN_KEY: //下翻页
if(choosed_line%2)
{
choosed_line+=1;
}
break;
case ENTER_KEY: //选定
over=IS_CHOOSED;
break;
case ESCAPE: //退出返回
over=EXIT_CHOOSE;
break;
default:
break;
}
*cur_line=choosed_line;//当前的菜单行
return over;
}
/*===========================================================================
函数功能:对某一级菜单的菜单项进行选择操作
入口参数:choose_key--选择键键值
item_num--某一级菜单中子菜单项数
出口参数:*cur_line--当前菜单行指针 (菜单行从1开始)
返回值: ==0x0,未选定; ==0x1,选定;==0xfe,返回上一级
全局变量:
编制人: 日期:2003-06-17
============================================================================*/
uchar choose_menu_line(uchar choose_key,uchar item_num,uchar *cur_line)
{
uchar over;
uchar choosed_line,j;
over=NO_CHOOSED;
choosed_line=*cur_line;
switch(choose_key)
{
case ARROW_UP_KEY: //上移
if(choosed_line!=1)
{
choosed_line--;
j=choosed_line%4;
if(j==0)dismode=0;
else dismode=1;
}
else
{
choosed_line=item_num;
dismode=0;
}
break;
case ARROW_DOWN_KEY://下移
if(choosed_line<item_num)
{
choosed_line++;
j=choosed_line%5;
if((j==0)||(choosed_line%9==0))dismode=0;
else dismode=1;
}
else
{
choosed_line=1;
dismode=0;
}
break;
case PAGE_UP_KEY: //上翻页
if(choosed_line>LCD_LINE)
{
choosed_line-=LCD_LINE;
//dismode=0;
}
else
{
choosed_line=1;
//dismode=1;
}
dismode=0;
break;
case PAGE_DOWN_KEY: //下翻页
if((choosed_line+LCD_LINE)<item_num)
{
choosed_line+=LCD_LINE;
//dismode=0;
}
else
{
choosed_line=item_num;
//dismode=1;
}
dismode=0;
break;
case ENTER_KEY: //选定
over=IS_CHOOSED;
dismode=0;
break;
case ESCAPE: //退出返回
over=EXIT_CHOOSE;
dismode=0;
break;
default:
break;
}
*cur_line=choosed_line;//当前的菜单行
return over;
}
/*===========================================================================
函数功能:对仅有一级菜单的菜单项进行选择操作
入口参数:mode--功能模式
*menu_item--菜单项指针
(菜单格式:{item(1),...item(n),0})
出口参数:
返回值: cur_line--当前菜单行:
==POWER_OFF, 断电返回
==0,取消操作
==其他,当前菜单行
全局变量:
编制人: 日期:2003-06-27
============================================================================*/
/*uchar select_sigle_layer_menu(uchar mode,uchar *menu_item)
{
uchar cur_line;
uchar key;
uchar over_mode;
uchar menu_num;
cur_line=1;
menu_num=strlen(menu_item);
display_menu_page(mode,1,menu_item,cur_line);
while(1)
{
if(low_pwr) return POWER_OFF;//如果断电了,则exit
openbacklight();
key = get_key();
if(!key) continue;//等待键
//beep(50);
over_mode=choose_menu_line(key,menu_num,&cur_line);//否则选择菜单项,当前行将移到新位置
switch(over_mode)
{
case IS_CHOOSED://若选定某项菜单,取得相应功能号
return cur_line;
break;
case EXIT_CHOOSE://若选择返回
return 0;
break;
default://未选定,则继续等待按键
break;
}
display_menu_page(mode,1,menu_item,cur_line);
}
}
*/
/*==================================================================
函数功能:等待输入常用键(取消、确认、走纸),并做相应处理
入口参数:mode--模式:=0,接受三种键中任何键
=1,不接受[走纸]键
=2,只接受[取消]键;
出口参数:
返回值: ==POWER_OFF,则表示断电,返回
==OK,确认成功
==CANCEL,取消操作
全局变量:
编制人: 日期:2003-07-17
==================================================================*/
uchar wait_usal_key(uchar mode)
{
uchar key;//键值
uchar error,error1;//错误类别
error=0;
error1=0;
//----------等待按键---------------//
while(1)
{
if((error)&&(error1!=error)){error1=error; catch_error_display(error,0);}//捕获错误
if(low_pwr) return POWER_OFF;//监测到断电了,则exit
openbacklight();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -