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

📄 input_op.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-------------------------------------------------------------
功能:输入操作--菜单选择功能和等待输入数
说明:符合国家标准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 + -