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

📄 prog_tax.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 2 页
字号:
	char	Str1[10][MAX_LCD_TEXT+1];
	WORD	r1=0,r2=0;
	char	func_ret=NG;
	char	result=0;
	char	idx = 0;
	char	*ptr;
	char	i;
	char	len;

	const	char	*Str2[10] = 
	{
		{"To Program Canadian GST Tax. "},
		{"To program Canadian PST1 Tax."},
		{"To program Canadian PST2 Tax."},
		{"To program Canadian PST3 Tax."},
		{"To Select whether the non-taxable limit $ amount is with GST or without GST tax for Canadian tax."},
		{"To select whether to active Tax-On-Tax setting for Canadian tax."}
	};


    Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, Str_ProgTaxRateTaxVatGst[0], ALIGN_MID);
    Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);


    while(1)
    {
		for (i=0;i<6;i++)
		{
			memset(Str1[i], ' ', MAX_LCD_TEXT);	/*Clear the buffer first*/
			memcpy(Str1[i],Str_ProgTaxRateTaxVatGst[MAX_TAX_NUM*2+i],MAX_LCD_TEXT);
		}
		/*在此处来判断方式,是为了在控制锁转动时,快速退出此函数,无需后面的刷新*/
		GetMainMode();
		if (MainMode != CurrMode)
			break;

		/*确认是显示GST,还是NON GST*/
		if (Tax_Rate.Tax_Lmt_type == TAX_LMT_NO_GST)
			ptr = (char*)Str_GstNonGst[0];
		else
			ptr = (char*)Str_GstNonGst[1];
		len = strlen(ptr);
		if (len >= MAX_LCD_TEXT)
			len = MAX_LCD_TEXT;
		memcpy((char*)&Str1[4][MAX_LCD_TEXT-len],ptr,len);
		/* 确认是显示TAX ON TAX /NO TAX ON TAX*/
		memcpy((char*)Str1[5],Str_Tax_On_Tax[Tax_Rate.Tax_On_Tax],MAX_LCD_TEXT);

		r1 = Menu_Select(Str1,Str2,GST_PRG_MENU_LEN1,idx,1,0,&result);

	    if (r1 == KD_ENTER)
	    {
			if (result>= GST_PRG_MENU_LEN1)
				continue;				/*选择错误*/
	    	r2 = NG;
			if (result < MAX_TAX_NUM)		/*GST/PST1--4 preset*/
			{
				if (TaxRate_GstRateLmt_Set(result))/*Update the Rate and Limitation*/
					r2 = OK;
			}
			else if (result == 4)	/*program the TAX Limit*/
			{
				if (TaxRate_Gst_Lmt_Set())		/*GST system limitation*/
					r2 = OK;
			}
			else if (result == 5)	/*Program the TAX ON TAX or not*/
			{
				if (TaxRate_Gst_TaxOnTax_Set())
					r2 = OK;
			}

			if(r2 == OK)			/*用户设定了正确的参数等*/
			{
				idx = (result + 1 ) % GST_PRG_MENU_LEN1;	/*main menu for GST program is 6*/
			}
			else
			{
				Bell_Special_Alarm(0);		/*输入非法*/				
							   /*Update the idx step with last cursor postion6*/
				idx = (result) % GST_PRG_MENU_LEN1;	
			}
		}			
		else if (r1 == KD_CANCEL)
		{
			break;
		}
	}
}

/*******************************************************************************
*	用户选择更新USA/VAT Rate
*	输入:	idx -- TAX/VAT index ( ○-- MAX_TAX_NUM -1)
*	功能:
*			根据idx,提示用户输入相关的Rate, 然后根据输入的Rate更新参数
*	return	: BOOL -- true / false
*******************************************************************************/
BOOL	TaxRate_SetUsaVatRateUpdate(char	idx)
{
	char	i;
	long	rate;
	char	*ptr;
	BOOL 	r = false;
	char	str[5][MAX_LCD_TEXT+1];

	for (i = 0; i < 4; i ++)
		memcpy(str[i],(char*)Str_USAVATRATEPRG_PROMPT[i],MAX_LCD_TEXT);
		
	if (sysflag->Tax_System == USA_TAXTYPE)
		ptr = (char*)Str_TaxVat[0];				/*USA dispaly the TAXx string*/
	else
		ptr = (char*)Str_TaxVat[1];				/*VAT display the VATx string*/
	memcpy(str[1],ptr,5);
	str[1][4] = idx + '1';
	if (Lcd_GetTenKey(str,4, 5, 99999,&rate) == OK)/*4行提示,输入5位数,返回在rate*/
	{
		Tax_Rate.rate[idx].rate = rate;			/*Update the Rate*/
		r = true;
	}
	return(r);
}
/*------------------------------------------------------------------------------
* 	Program the TAX Rate of USA/VAT system
*	For USA tax system, only consider the rate, without the taxable function
*	For VAT tax system, the rate only also.
*-----------------------------------------------------------------------------*/
void	TaxRate_SetUsaVat(void)
{
	BYTE	i,r = 0;
	BYTE	key = 0;
	BYTE	idx = 0;
	BYTE	Base = 0;
	BYTE	loop = true;
	BYTE	result = 0;
	BOOL	Flag_Reflush = true;
	char	Lcd_Text_Buf[7][MAX_LCD_TEXT+1];
	const   char	*Str_Prompt[10] = 
	{
		{"  "},
		{"  "},
		{"  "},
		{"  "},
		{"  "},
		{"  "},
		{"  "},
		{"  "},
		{"  "},
		{"  "}
	};	
/*	显示Title  */
//    Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, Str_ProgTaxRate[0], ALIGN_MID);
    Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);
    
    while(loop)
    {
		/*在此处来判断方式,是为了在控制锁转动时,快速退出此函数,无需后面的刷新*/
		GetMainMode();
		if (MainMode != CurrMode)
		{
			return;
		}

		if(sysflag->Tax_System == USA_TAXTYPE)		/*USA tax system*/
			Base = 0;
		else if(sysflag->Tax_System == VAT_TAXTYPE)/*VAT tax system*/
			Base = MAX_TAX_NUM;
		else										/*非法数据*/
			return;
		/*	先Copy需要显示的菜单内容到缓冲区 -- 纯文本区域*/
		for (i=0;i<MAX_TAX_NUM;i++)
		{
			memcpy(Lcd_Text_Buf[i],(char*)Str_ProgTaxRateTaxVatGst[Base+i],MAX_LCD_TEXT);
		}

		/*显示税率,如果税率为0,则不显示. 如果不为0,则先擦除前面的SET UP字样,
		 *然后显示相对应的税率
		 */
		for (i=0;i<MAX_TAX_NUM;i++)
		{
			char	temp[20];
			if (Tax_Rate.rate[i].rate != 0)		/*Rate 不为0,则需要显示Rate*/
			{									/*Clear the SET UP characters*/
				memset((char*)&Lcd_Text_Buf[i][5],' ', MAX_LCD_TEXT-5);	
				sprintf(temp,"%.5l",Tax_Rate.rate[i].rate);	/*Change to ASCII*/
				temp[6] = '%';
				temp[5] = temp[4];
				temp[4] = temp[3];
				temp[3] = temp[2];
				temp[2] = '.';
				memcpy((char*)&Lcd_Text_Buf[i][MAX_LCD_TEXT-7], temp, 7);
			}
		}

		/*每次都需要重新刷新*/
		r = Menu_Select(Lcd_Text_Buf,Str_Prompt,MAX_TAX_NUM,idx,1,0,&result);
		switch(r)
		{
		case	KD_ENTER:
            if (TaxRate_SetUsaVatRateUpdate(result))	/*Ascii input change to Binary*/
            {
            	idx = ( result + 1 ) % MAX_TAX_NUM;  /*编程步骤的Index*/
            }
            else
            {
            	Bell_Special_Alarm(0);		/*输入非法*/
            	idx = result % MAX_TAX_NUM;  
            }
            break;
        case	KD_CANCEL:				/*用户取消输入*/
        case	CTRL_LOCK_CHG:			/*控制锁取消*/
        	loop = false;
        	break;
        default:
			Bell_Special_Alarm(0);		/*输入非法*/
			break;
		}
	}
}
/*------------------------------------------------------------------------------
*	显示文本在文本显示区域,
*	此函数主要用在一些提示场合,比如需要在屏幕上显示一串提示符,然后在底部要求用户
*	输入等场合.
*	由于此函数把屏幕内容已经清除,所以在函数返回以后需要再次刷新屏幕方可.
*	
*	char	**str -- 需要显示的字符串指针 -- 二维数组
*	char	line  -- 需要显示的字符串的行数
*
*	此处有一点需要考虑的是: 函数可以考虑更加强大一些,即自动判断行数,通过判断单词
*	结束来决定. (以后再考虑 -- 这样的话,翻译成其它语言的时候,就比较容易一些
*-----------------------------------------------------------------------------*/
void	Lcd_DispNormalText(const char str[][MAX_LCD_TEXT+1],char line)
{
	char	r;
	
	Rst_Lcd_Text();			/*Clear the LCD buffer*/
	for (r = 0;r < line; r ++)
	{						/*Send to buffer first*/
		Lcd_Send_Text_Buff_Str(BUF_ID_LCD_TEXT, 1,str[r],ALIGN_LEFT);	
		Lcd_Disp_Text_Buff(BUF_ID_LCD_TEXT);	/*Send it to LCD display*/
	}
}

/*------------------------------------------------------------------------------
*	屏幕上显示一串提示字符,然后接受用户数据的输入
*	Input:
*			char	**Str_Prompt -- 需要提示用户的提示符指针
*			char	MaxCntr	 -- 最多允许输入的数字 --不理会小数点的输入
*			long	MaxNum  -- 最大的允许输入的数值
*			
*	Output:
*			long 	*ret		 -- 用户输入的数字(小数和整数部分)
*	Return:
*			OK/NG
*
*-----------------------------------------------------------------------------*/
char Lcd_GetTenKey(const char **Str,char line,char MaxCntr,long MaxNum,long *ret)
{
	char	rtn = NG;       //程序执行结果判断
	char	loop = true;    //循环结束控制判断
	char	flag;
    
    Lcd_DispNormalText(Str,line);   /*display the message*/
	while(loop)
	{
		if (GetIn() == NG)
			continue;
		GetMainMode();
		if(MainMode != CurrMode)		/* The control lock is changed */
		{
			rtn = NG;
			loop = false;
			break;
		}
		switch(InCmd)
		{
			case	KD_ENTER:			/*确认输入,判断输入是否合法*/
				if((numcnt == 0) ||(numcnt > MaxCntr) || (lnum> MaxNum))
				{
					errorType(ERR_DIGIT_ILLEGAL);
					break;
				}
				*ret = lnum;			/*保存需要返回的参数&*/
				rtn = OK;					/*正常返回*/
				loop = false;
				break;
			case	KD_CANCEL:
				rtn = NG;					/*异常返回 -- 用户放弃输入*/
				loop = false;
				break;
			case	KD_CLEAR:			/*Clear key, 继续输入*/
				break;
			default:
				break;
		}
	}
	return(rtn);
}


/*Reserved function*/
void	Bell_Special_Alarm(char	flag)
{
	flag = flag+1;
}


/*----------------------------------------------------------------------------*
    函数功能
        操作menu
    输入参数
        **Str_Menu: 需要显示的菜单
        **Str_Prompt: 需要显示的提示符内容
        : 当前操作的步骤(对应当前需要反显的行数), 返回时, 也更新当前操作的步骤.
        Menu_Line: 菜单长度
        FirstLine: 起始行数(1~48)
        mode:  0-整屏刷新 1 -- 单行刷新
	输出参数:
    	*result	-- 光标当前反显行的行号(0--Menu_Line -1)
    返回参数:
    KD_ENTER	-- 用户按下ENTER键盘  --- *result中数据有效
    KD_CANCEL   -- 用户按下CANCEL键盘 --- *result中数据无效
    
    考虑把此函数做的更加完善,上层程序无需判断是否需要全屏或者单行刷新,
    在此函数中根据传下来的**Str_Menu 和 Text_Lcd.text内容来确定 .......
*----------------------------------------------------------------------------*/
WORD	Menu_Select(const char **Str_Menu, const char *Str_Prompt[],BYTE	Menu_Line,
					BYTE CurrLine,BYTE FirstLine, BYTE mode, BYTE *result)
{
	BOOL loop = true;
	WORD	r = KD_CANCEL;
	
    if(mode == 0)			/*全屏刷新*/
    {
        Rst_Lcd_Text();     				/* Reset the text */
        Insert_Full_Text_List(Str_Menu, Menu_Line, FirstLine);
        if ((CurrLine < Text_Lcd.EndLine) && (CurrLine >=Text_Lcd.FirstLine))
            Text_Lcd.CurrLine = CurrLine + Text_Lcd.FirstLine;
        Lcd_Reflush_List(0);
    }
    else					/* 单行刷新*/
    {
        if(CurrLine < (Text_Lcd.EndLine-Text_Lcd.FirstLine))
            Text_Lcd.CurrLine = CurrLine +Text_Lcd.FirstLine;
        memcpy(Text_Lcd.text[Text_Lcd.LastLine], *Str_Menu+(Text_Lcd.LastLine)*MAX_TEXT, MAX_TEXT);	

        Lcd_Reflush_List(1);
    }
    
    while(loop)
    {
		/*暂时只显示两行字符即可, 以后可以考虑滚动显示*/    	
		Lcd_Disp_Str_Btn(BUF_ID_TL_INPUT,Str_Prompt[Text_Lcd.CurrLine]);

        if( GetIn()==NG)
            continue;
        GetMainMode();    
        if (MainMode != CurrMode)		/*Control Lock changed*/
        {
        	r = CTRL_LOCK_CHG;
        	break;
        }
        
        switch(InCmd)
        {
             
            case KD_PAGE_DOWN:
            case KD_PAGE_UP:
            case KD_DOWN:
            case KD_UP:
                Lcd_Reflush_List(Do_Menu_Roll(InCmd));
                break;
                
            case KD_CANCEL:
                r = KD_CANCEL;			/*函数返回参数*/
                loop = false;			/*退出While循环*/
                break;

            case    KD_ENTER:           /*Enter for accept the input index*/
                *result = Text_Lcd.CurrLine-Text_Lcd.FirstLine;
                r = KD_ENTER;			/*函数返回参数*/
                loop = false;			/*退出While循环*/
                break;

            default: 
                bellcnt = 0x10;
                break;
        }
    }
    return(r);
}

⌨️ 快捷键说明

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