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

📄 program.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "ecrsys.h"
#include "ftype.h"
#include "sysdata.h"
#include "data.h"
#include "keydef.h"
#include "iccard.h"
#include "mathes.h"
#include <string.h>
#include "disp.h"
#include "lcd2.h"
#include "PC_Comm.h"
#include "lcd_pop.h"
#include "program.h"
#include "stdio.h"



long Last_Prg_Idx;       /*上次编程的Idx */
long Last_Prg_Step;      /* 上次编程的步骤*/
BOOL last_modi_flag;

/************************************ *****************************/
void progmain(void)     /* Program mode main function */
{
    byte step_Idx = 0;
    byte Update_Menu_flag = 0;
    byte rsult = NG;

    modi_flag = 0;			/* Clear the flag, indicate the attribute did't modified */
    Prog_en_dec_input_flag = 0;
    if(sysflag->soft_lock_flag)		/* Use the soft control lock mode */
    {
		Comm_SetStatus(STATUS_PROGRAM);
       	if(Secr_Pass() == NG)			/* Must pass the security authentication */
       		return;
		Comm_SetStatus(STATUS_IDLE);
    }

	Lcd_Init_Sys_ID(SYS_ID_PROG_MAIN);//画初始键盘布局
    Pop_Btn_Init();//初始化弹出窗口
    
    while (TRUE)                       
    {
        if (!progflag)
            Comm_SetStatus(STATUS_IDLE);
        else
            Comm_SetStatus(STATUS_PROGRAM);

//        RightDisp(0L,sysflag->sysdots);
        if(GetMainMode() != CurrMode)
            return;
        progflag = 0;
        Last_Prg_Idx = IDX_NULL;
        Last_Prg_Step = STEP_NULL;
        if(Update_Menu_flag == 0)
        {
            Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, Str_Lcd_Title_Prog, ALIGN_MID);
            Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);
            Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Prog_Enter);
        }
        
        rsult = Get_Prog_Menu(Str_ProgMain_Menu,&step_Idx, PRG_MAIN_MENU_LINE, 1, Update_Menu_flag, 0);
        Update_Menu_flag = 1;
        
        if(rsult != OK)
        {
            step_Idx =0;
            continue;
        }
        
        if(numcnt)
        {
            if(lnum == 12345678)
            {
                isp_chk();
                break;
            }
            if(lnum <401)
                {errorType(ERR_DIGIT_ILLEGAL);break;}
            step_Idx = lnum-401;
        }

        switch(step_Idx)
        {
            case    0: Update_Menu_flag = 0; pDept(0);          break;//401 -- Dept Setting
            case    1: Update_Menu_flag = 0; PMD_PLU_Menu();           break;//402 -- PLU  Setting
            case    2: Update_Menu_flag = 0; pClerk(0);         break;  // 403 -- Clerk Setting
            case    3: Update_Menu_flag = 0; Prog_TaxRate();    break;  //404 -- Tax Setting
            case    4: Update_Menu_flag = 0; pText_Msg();       break;  //405 -- Text Message 
            case    5: Update_Menu_flag = 0; pOptions();        break;   //406 -- options
            case    6: Update_Menu_flag = 0; pPara_flag();      break;  //407 -- more
            default: 
                if(numcnt)
                    errorType(ERR_DIGIT_ILLEGAL);
                step_Idx = 0; 
                break;
        }
	}		
} /* end progmain */
/*----------------------------------------------------------------------------*
    函数功能
        操作menu
    输入参数
        **Str_Menu: 需要显示的菜单
        *step: 当前操作的步骤(对应当前需要反显的行数), 返回时, 也更新当前操作的步骤.
        Menu_Line: 菜单长度
        FirstLine: 起始行数(1~48)
        mode:  0-整屏刷新 否则, 不必整行刷新
        flag: 0-整行显示  1-分段显示
    返回参数:

    注意, 如果menu分段显示, 不能直接将参数传递下来, 需要建立一个完整的缓冲区,
    再将缓冲区的首地址传送下来.
    另外, 如果Menu 如PLU/DEPT需要划分为多页显示, 不能调用此函数.
*----------------------------------------------------------------------------*/
byte Get_Prog_Menu(const char **Str_Menu, byte *step, byte Menu_Line, byte FirstLine, byte mode, byte flag)
{
    if(mode == 0)
    {
        Rst_Lcd_Text();     /* Reset the text */
        Insert_Full_Text_List(Str_Menu, Menu_Line, FirstLine);
        if(*step < Text_Lcd.EndLine-Text_Lcd.FirstLine)
            Text_Lcd.CurrLine = *step +Text_Lcd.FirstLine;
        Lcd_Reflush_List(0);
    }
    else
    {
        if(*step < Text_Lcd.EndLine-Text_Lcd.FirstLine)
            Text_Lcd.CurrLine = *step +Text_Lcd.FirstLine;
        if(flag != 0)//-分段显示, 需要根据flag 的值进行分类, 从而正确显示menu
        {
            memcpy(Text_Lcd.text[Text_Lcd.LastLine], *Str_Menu+(Text_Lcd.LastLine)*(MAX_TEXT+1), MAX_TEXT);
        }
        Lcd_Reflush_List(1);
    }

    while(1)
    {
        if(GetIn() != OK)
            continue;

        GetMainMode();    
        if (MainMode != CurrMode)
            return NG;
        
        switch(InCmd)
        {
            case    KD_ENTER:           /*Enter for accept the input index*/
                *step = Text_Lcd.CurrLine-Text_Lcd.FirstLine;
                return OK;
                
            case KD_PAGE_DOWN:
            case KD_PAGE_UP:
                if(Menu_Line < DISP_LCD_TEXT_LINE)//如果当前屏的显示行数不足一屏, 不用此2键
                    break;
            case KD_DOWN:
            case KD_UP:
                Lcd_Reflush_List(Do_Menu_Roll(InCmd));
                break;
                
            case KD_CANCEL:
                return NG;
                
            default: 
                bellcnt = 0x10;
                break;
        }
    }
    return NG;
}

/*return 0--reflush all   1--reflush the last line and the current line*/
byte Do_Menu_Roll(word key)
{
    byte reflush_flag = 0;
    switch(key)
    {
        case KD_PAGE_UP:
            if(Text_Lcd.EndLine <=  DISP_LCD_TEXT_LINE)
                break;
            if(Text_Lcd.CurrLine >= DISP_LCD_TEXT_LINE)
                Text_Lcd.CurrLine -= DISP_LCD_TEXT_LINE;
            else
                Text_Lcd.CurrLine = Text_Lcd.EndLine -1;
            break;
            
        case KD_PAGE_DOWN:
            if(Text_Lcd.EndLine <=  DISP_LCD_TEXT_LINE)
                break;
            Text_Lcd.CurrLine += DISP_LCD_TEXT_LINE;
            if((Text_Lcd.CurrLine >= Text_Lcd.EndLine)&&(Text_Lcd.CurrLine < Text_Lcd.EndLine +DISP_LCD_TEXT_LINE-Text_Lcd.EndLine%DISP_LCD_TEXT_LINE))
                Text_Lcd.CurrLine = Text_Lcd.EndLine-1;
            break;
            
        case KD_UP:
            if(Text_Lcd.CurrLine % DISP_LCD_TEXT_LINE >0)
            {
                Text_Lcd.CurrLine --;
                reflush_flag = 1;
            }
            else
            {
                if(Text_Lcd.EndLine <= DISP_LCD_TEXT_LINE)
                {
                    Text_Lcd.CurrLine = Text_Lcd.EndLine -1;
                    reflush_flag = 1;
                }
                else
                    Text_Lcd.CurrLine = (Text_Lcd.CurrLine + Text_Lcd.EndLine -1)%(Text_Lcd.EndLine);
            }
            break;
                
        case KD_DOWN:
            Text_Lcd.CurrLine = (Text_Lcd.CurrLine+1)%(Text_Lcd.EndLine);
            if((Text_Lcd.EndLine <= DISP_LCD_TEXT_LINE)||(Text_Lcd.CurrLine%DISP_LCD_TEXT_LINE >0))
                reflush_flag = 1;
            break;
    }
    return reflush_flag;
}

/* Check the department refresh or not */
/*----------------------------------------------------------------------------*
*  检查部门刷新切换的条件
*   1> 如果刚才的操作有信息的更新, 需要刷新
*   2> 如果跳转到上一部门或下一部门, 需要刷新
*****
*----------------------------------------------------------------------------*/
BOOL Chk_Dept_Refresh(byte prg_idx)
{
	if (Last_Prg_Idx == IDX_NULL)		/* The first programming */
		return 0xff;//需要全部刷新
	if (prg_idx != Last_Prg_Idx)		/* 显示了不同的部门 */
		return 0xff;//需要全部刷新
    return Last_Prg_Step;
}


/* Do the dept roll */
void Do_Dept_Roll(word key, word *idx_step)
{
	word max_step;
	word step;

    max_step = (word)Max_Dept_No*MAX_DEPT_STEP;
    step = *idx_step + max_step;
    switch(key)
    {
        case KD_PAGE_UP:
            step -= MAX_DEPT_STEP;
            break;
        case KD_PAGE_DOWN:
            step += MAX_DEPT_STEP;
            break;
        case KD_UP:
            step -= 1;
            break;
        case KD_DOWN:
            step += 1;
            break;
    }
	step %= max_step;	/* Get the true step */

	*idx_step = step;
}

/*-----------------------------------------------------------------
*  Dept binary data changed to ASCII data and display on LCD
*  Input :  char idx  --> the index no. of current dept
*                         and internal step of program.
*  需要显示当前部门的所有参数, 以及当前操作步骤的内容.
*  现在只需要每屏显示一个部门的参数即可
*----------------------------------------------------------------*/
void Dbin2asc(word Idx_Step)
{
    byte prg_step;       /* The display step */
    byte prg_idx;        /* The index department number */
    byte pflag;          /* The temporary data store the department structure's flag */
	char lcd_text_buf[MAX_TEXT];
	byte len, len1;
    byte mode = 0;
    byte step = 0;

	#ifdef AUTO_PER 			/* Support the department auto percent function */
	if((sysflag->Auto_Per_Use_Flag == 0) && (Idx_Step % MAX_DEPT_STEP == DEPT_PER_STEP))
		return;											/* When system flag not support the stock, produce a virtual key */
	#endif /* End AUTO_PER */
    
    prg_idx  = Idx_Step / MAX_DEPT_STEP;    /* Get the index no. */
    prg_step = Idx_Step % MAX_DEPT_STEP;   /* Get the index step */
    Clr_Dsp_Data();            /* Clear the previous display */

    mode = Chk_Dept_Refresh(prg_idx);
    //prepare for Dbin2Asc
    if (mode == 0xff ) //如果发现需要刷新,  执行以下刷新的函数.
    {
        Rst_Lcd_Text();
        Insert_Full_Text_List(Str_Dept_Prog_Step, MAX_DEPT_STEP+1, 2);
        //Dpet No.
        len = strlen(Str_Dept_Prog_Step[step]);
        LongtoAsc(Text_Lcd.text[step]+len-3, (prg_idx+1), 3);
    }
    step++;
    Text_Lcd.CurrLine = prg_step+1;

    //Description
    if((mode == 0xff)||(mode == DEPT_DESC_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].desc, MAX_DESC_LEN);
    }
    step++;
    
    //HDLO
    if((mode == 0xff)||(mode == DEPT_HDLO_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        HDLO_To_Asc(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].Hdlo, sysflag->sysdots);
    }
    step++;
    
    //price
    if((mode == 0xff)||(mode == DEPT_PRICE_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        LnumToTextBuff(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].price, sysflag->sysdots);
    }
    step++;
    
    //Tax
    if((mode == 0xff)||(mode == DEPT_VTAX_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        if(sysflag->Tax_System == TAX_MODE)//TAX
        {
            VTAX_to_Asc(Text_Lcd.text[step]+LCD_POSI_NOR, (dept[prg_idx].pflag)&0x0f);
        }
        else if(sysflag->Tax_System == VAT_MODE)//VAT
        {

            memset(Text_Lcd.text[step], 0x20, MAX_TEXT);
            xtr_strcpy(Text_Lcd.text[step]+2, Str_TaxSys_Sel[1]);
            VTAX_to_Asc(Text_Lcd.text[step]+LCD_POSI_NOR, (dept[prg_idx].pflag)&0x0f);
        }
        else//GST-PST
        {
        }
    }
    step++;
    
    //group
    if((mode == 0xff)||(mode == DEPT_GROUP_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        LnumToTextBuff(Text_Lcd.text[step]+LCD_POSI_NOR, dept[prg_idx].group, 0);
    }
    step++;
    
    // Normal / Negative / Gallonage
    if((mode == 0xff)||(mode == DEPT_MODE_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        pflag = (dept[prg_idx].pflag2)&0x0f;
        memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Dept_Mode[pflag], strlen(Str_Dept_Mode[pflag]));
    }
    step++;
    
    //single/ Normal
    if((mode == 0xff)||(mode == DEPT_TYPE_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        pflag = (dept[prg_idx].pflag>>4);
        memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Dept_Type[pflag], strlen(Str_Dept_Type[pflag]));
    }
    step++;
    
    //Allow sale or not
    if((mode == 0xff)||(mode == DEPT_SALE_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        pflag = (dept[prg_idx].sale);
        xtr_strcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Dept_Sale[pflag]);
    }
    step++;

    // Age limit
    if((mode == 0xff)||(mode == DEPT_AGE_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        pflag = (dept[prg_idx].pflag2>>4)&0x0f;
        if (pflag == 0)
            memcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_None, strlen(Str_None));
        else
            LWordtoAsc(Text_Lcd.text[step]+LCD_POSI_NOR, Age_Limit[pflag-1], 2);
    }
    step++;
    //KP select
    if((mode == 0xff)||(mode == DEPT_KP_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        xtr_strcpy(Text_Lcd.text[step]+LCD_POSI_NOR, Str_Act_Sel[dept[prg_idx].send_kp_flag]);
    }    
    step++;
    #ifdef AUTO_PER
    if((mode == 0xff)||(mode == DEPT_PER_STEP))
    {
        memset(Text_Lcd.text[step]+LCD_POSI_NOR, 0x20, MAX_TEXT-LCD_POSI_NOR);
        Text_Lcd.text[step][LCD_POSI_NOR] = (dept[prg_idx].per_flag == 0)?('+'):('-');
        LnumToTextBuff(Text_Lcd.text[step]+LCD_POSI_NOR+1, dept[prg_idx].per_rate, PER_DOTS);
    }
    step++;

⌨️ 快捷键说明

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