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

📄 prog_cm.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 2 页
字号:
                    else
                        CM_Idx = 0; 
                    Refresh_mode = 0;
                }
                break;
            
            case KD_UP:
                if(Curr_Line > 0)//页内变化
                {
                    Lcd_Text_Line_Disp(Curr_Line--, FALSE);
                    Lcd_Text_Line_Disp(Curr_Line, TRUE);
                    Refresh_mode = 0xff;
                }
                else    //跨页更新,类同KD_PAGE_UP
                {
                    CM_Idx = CM_Curr_Disp[0]-1;
                    Refresh_mode = 1;
                }
                break;
                
            case KD_ENTER:
                {/*使用按键选择方式选择编辑方式*/
                    const char *tmp_str[3];
                    Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Modify_Step[3]);
                    tmp_str[0] = Str_CM_Prog_Sel[0];
                    tmp_str[1] = Str_CM_Prog_Sel[1];
                    tmp_str[2] = Str_CM_Prog_Sel[2];
                    if(Get_Btn_Choice_Input(tmp_str, 0x22,3) != OK)//先弹出操作提示按键
                        break;
                }
                //选择好操作后,进入对应操作体系 
                CM_Idx = CM_Curr_Disp[Curr_Line] - 1;
                if(lnum < 2)
                {
                    if(lnum == 1)
                    {//查找最近的一个未使用的C.M., 如果向后查找没有找到,就从头开始查找
                        byte tmp_CM_Idx = CM_Idx;
                        while((tmp_CM_Idx < MAX_KP_SFX_NUM)&&(KP_Sfx_Desc[tmp_CM_Idx][0] != '\0'))
                            tmp_CM_Idx ++;
                        if(tmp_CM_Idx >= MAX_KP_SFX_NUM)
                        {
                            tmp_CM_Idx = 0;
                            while((tmp_CM_Idx < CM_Idx)&&(KP_Sfx_Desc[tmp_CM_Idx][0] != '\0'))
                                tmp_CM_Idx ++;
                            if(tmp_CM_Idx >= CM_Idx)//说明没有剩余空间存放新的C.M.
                                {errorType(ERR_CM_FULL);break; }
                        }
                        CM_Idx = tmp_CM_Idx;  /*找到对应的空位*/    
                    }

                    //编辑cooking Msg
                    Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Cooking_message_desc);
                    Lcd_Disp_Str_Btn(BUF_ID_TL_INPUT, Str_Modify_Step[1]);
                    
                    if(Get_Desc(KP_Sfx_Desc[CM_Idx],MAX_PRN_LEN,NO) != OK)
                        break;
                    //注意要对编辑的Cooking Msg 添加结束符。
                    KP_Sfx_Desc[CM_Idx][Get_Desc_Len(KP_Sfx_Desc[CM_Idx], MAX_PRN_LEN)] = '\0';
                }
                else//delete
                {
                    byte ret = NG;
                    if(Get_Sure_Done(&ret)!= OK)//确定操作后,删除指定的Cooking Msg
                        break;
                    if(ret == KD_NO)
                        break;
                    memset(KP_Sfx_Desc[CM_Idx], 0, MAX_PRN_LEN+1);
                    CM_Prog_Dept_Ex(CM_Idx);          // 当删除了此Cooking Message后, 对部门中指向此Cooking Message指针也进行修改. 
                }
                Refresh_mode = lnum + 2;//设置更新方式
                break;

            case KD_CANCEL:
                return;
        }
    }
           
}

/*-----------------------------------------------------------------------------
 * Display the full Cooking Message lists 
 *-----------------------------------------------------------------------------
 */
void Disp_Full_CM_List_Ex(void)
{
    WORD	i,j;
    
    Rst_Lcd_Text();     			/* Reset the text*/
    
    for (i = 0,j=0; i < DISP_LCD_TEXT_LINE*3; i++)   // Display 8CMs information
    {
        memset(Text_Lcd.text[i], 0x20, MAX_TEXT);
        if (KP_Sfx_Desc[i][0] != 0)
        {
			xtr_strcpy(Text_Lcd.text[i], KP_Sfx_Desc[i]);
			j ++;
		}
    }

	Text_Lcd.FirstLine = 0;
    Text_Lcd.EndLine = j;
    Text_Lcd.StartLine = 0;
    Text_Lcd.CurrLine = Text_Lcd.FirstLine;

    Lcd_Reflush_List(0);
}

/*-----------------------------------------------------------------------------
 *显示某个部门所连接的所有C.M.信息,
 *先把所有的C.M.信息都送到文本显示缓冲区Text_Lcd.text中,然后再刷新显示器.
 *由于有可能一屏不能全部显示,所以此处需要留意换屏的问题
 *---------------------------------------------------------------------------*/
void Dept_Disp_Cm(WORD Dept_Idx)
{
    byte i;
    byte idx;
    byte len;
    
    Rst_Lcd_Text();
	for (i = 0; i < dept[Dept_Idx].cm_cnt; i++)
	{
		memset(Text_Lcd.text[i], 0x20, MAX_TEXT);
        idx = dept[Dept_Idx].CkMsg[i];
        #if 0
        if (idx == 0)				/*没有数据需要显示了*/
        	break;
        #endif
		if(idx > MAX_KP_SFX_NUM)	/*数据非法-强制设定为第一条*/
        {
	        dept[Dept_Idx].CkMsg[i] = 1;
	        idx = 1;
		}
        xtr_strcpy(Text_Lcd.text[i], KP_Sfx_Desc[idx-1]);/*送到显示缓冲区*/
	}    
    Text_Lcd.FirstLine = 0;
    Text_Lcd.EndLine = i;
    Text_Lcd.StartLine = 0;
    Text_Lcd.CurrLine = Text_Lcd.FirstLine;
    for (; i < DISP_LCD_TEXT_LINE; i++)     // 临时的一个修补
    {
        memset(Text_Lcd.text[i], 0x20, MAX_TEXT);
    }

    Lcd_Reflush_List(0);			/*刷新并送到显示器上 -- 整屏刷新(文本区域)*/
}
/*-----------------------------------------------------------------------------
 *需要显示所有的部门按钮和最下面的命令按钮供用户选择,此处需要设定按钮的值 -
 *设定为KD_DP_1 ----KD_DP-60
 *同时也预设好最下面的命令按钮的按钮值和按钮大小
 *
 *	Note: 此处不显示,仅仅是设定按钮的属性(按键键码和大小)
 *	10/14/2006 11:51PM
 *----------------------------------------------------------------------------*/
void Get_Dpet_key_Map(void)
{
    byte i;
    word key;
    
    for(i = 0; i < MAX_LAYOUT_KEY-LINE_KEY_NUM; i++)	/*最下面会显示一排命令按钮*/
    {
        key = KD_DP_ST + i;
        if(key <= KD_DP_END)
            Dept_Pop_Key_Tabl[i] = key;					/*默认的部门值*/
        else
            Dept_Pop_Key_Tabl[i] = KD_NULL;				/*不足部门,则设定为Null*/
        Dept_Pop_Key_Tabl_Size[i] = 0x11;				/*All are Normal size*/
    }
    for(; i < MAX_LAYOUT_KEY; i++)						/*命令按钮处理*/
    {
        Dept_Pop_Key_Tabl[i] =  Dept_Pop_Key_Cmd[i-(MAX_LAYOUT_KEY-LINE_KEY_NUM)];
        Dept_Pop_Key_Tabl_Size[i] =  Dept_Pop_Key_Cmd_Size[i-(MAX_LAYOUT_KEY-LINE_KEY_NUM)];
    }
}
/*将每个部门都连接需要的C.M.*/

const char Str_Dept_Link_Step[][MAX_TEXT*2+1]     =   
{
    {"Select a Department first, can use [DEPT SHIFT] key to get more"},
    {"Select the right C.M., confirm with [ENTER}"},
};

/*增加一条CM记录到部门上.
 *此处仅仅是提供一个选择画面,让用户选择,然后用户可以做的操作:
 *Page Up/Down/Line Up/Down/Enter/Cancel
 *返回用户输入的键: OK/CANCEL 和选择的CM的行号( 0--CM_MAX_NO-1)
 */
BOOL	Dept_Cm_Add(char *ret_line)
{
	WORD	key = 0;
	BYTE	line = 0;
	BOOL	r = NG;
	BOOL 	loop = true;

	Disp_Full_CM_List_Ex();	/*display whole CM on left text box*/
	while(loop)
	{
		key = GetKey();
		switch(key)
		{
            case KD_PAGE_DOWN:
            case KD_PAGE_UP:
            case KD_DOWN:
            case KD_UP:
                Lcd_Reflush_List(Do_Menu_Roll(key));
                break;
			case	KD_ENTER:
				r = OK;
				line = Text_Lcd.CurrLine;		/*此处需要考虑超过MAX_LCD_LINE*3的情况*/
				loop = false;
				break;
			case	KD_CANCEL:
				r = NG;
				loop = false;
				break;
			default:
				bellcnt = 0x80;	/*bell*/
				break;
		}
	}
	*ret_line = line + 1;
	return(r);
}
/*-----------------------------------------------------------------------------
 *	Program the CM which linked with a department
 *	For each department, maximum 20 cooking message can be linked with
 *
 *----------------------------------------------------------------------------*/
void Dept_Link_CM_Main(void)
{   
    WORD key;
    BYTE idx;
    BYTE ret;

    bool r = NG;
    byte CM_Idx = 0;
    bool loop = true;
    WORD Dept_Idx = 0xffff;
    byte bak_Ddpt_Shift_Inc;

    Get_Dpet_key_Map();				/*Get the keyboard layout */
    bak_Ddpt_Shift_Inc = sysflag->Dept_Shift_Inc;
    sysflag->DPLU_Shift_Inc = MAX_LAYOUT_KEY-LINE_KEY_NUM;
    
    Bak_Ts_Key_Tab1 = Ts_Key_Tab;
    Bak_Ts_Key_Table_Size1 = Ts_Key_Table_Size;
    Ts_Key_Tab = (const word *)Dept_Pop_Key_Tabl;
    Ts_Key_Table_Size = (const byte *)Dept_Pop_Key_Tabl_Size;

    Lcd_Layout_Draw_Key();//弹出右界面
	Lcd_Send_Text_Buff_Str(BUF_ID_TL_TITLE, 1, "Select Cooking Message", ALIGN_MID);
	Lcd_Disp_Text_Buff(BUF_ID_TL_TITLE);
    DeptShiftFlag = 0;
    Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[0]);
    Rst_Lcd_Text();			/*清除文本框中的内容,因为开始的时候还没有选择任何一个部门*/
    Lcd_Clr_Text_Btn(BUF_ID_LCD_TEXT, 0);   // Clear the last display
    while(loop)
    {
        GetMainMode();
        if(MainMode != CurrMode)
        {
        	loop = false;	/*快速退出*/
        	break;
        }
        key = GetKey();
        switch(key)
    	{
		case KD_CANCEL:
			loop = false;
			break;
        case KD_ADD:				/*增加一个C.M到某个部门*/
            if(Dept_Idx == 0xffff)	/*No department is selected*/
            {
                errorMsg("Select a Department first");
                break;
            }
            if(Dept_Idx >= Max_Dept_No)	/*illegal dept index*/
            {
                errorMsg("Chosed the illegal Department");
                break;
            }

			if (CM_TtlNumGet() == 0)	/*如果可用数量为0, 直接报错后返回*/
			{
				errorMsg("No Cooking Message can be used");
				break;
			}
            
            idx = Dept_Cm_FindBlankRcrd(Dept_Idx);
            if (idx == 0xff)		/*Cannot find a blank record*/
            {
            	errorMsg("No space for store the C.M.");
            	break;
            }
            
        	r = Dept_Cm_Add(&CM_Idx);	/*调用子程序添加一条记录*/
        	if (r == OK)		/*Add a new record*/
        	{
				dept[Dept_Idx].CkMsg[idx] = CM_Idx;/*Add one record*/
        	}
            Dept_Disp_Cm(Dept_Idx);		/*Display the new C.M. for department*/
            Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[1]);
            break;

        case KD_DEL:
            if(Dept_Idx == 0xff)	/*No department is selected*/
            {
                errorMsg("Choose the Department first");
                break;
            }
            if(Dept_Idx >= Max_Dept_No)	/*illegal dept index*/
            {
                errorMsg("Chosed the illegal Department");
                break;
            }
			if (CM_DeptTtlNumGet(Dept_Idx) == 0)	/*如果可用数量为0, 直接报错后返回*/
			{
				errorMsg("No CM can be used");
				break;
			}
			/*事实上,此处还需要考虑某个部门一条C.M.都没有连接的情况下删除,
			 *但是由于采用此种算法,不会造成错误,故不细究
			 */
            if(Get_Sure_Done(&ret) != OK)
                break;
            if(ret == KD_NO)				/*用户放弃*/
                break;
			/*dept[Dept_Idx].CkMsg[Text_Lcd.CurrLine] = 0;*/
            memmove(&(dept[Dept_Idx].CkMsg[Text_Lcd.CurrLine]),&(dept[Dept_Idx].CkMsg[Text_Lcd.CurrLine+1]), MAX_DEPT_CM_NO-Text_Lcd.CurrLine-1);
            dept[Dept_Idx].CkMsg[MAX_DEPT_CM_NO-1] = 0;	/*Delete this line*/
            Dept_Disp_Cm(Dept_Idx);
            Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[1]);
            break;
		#if 0
//            case KD_ENTER:
//                if(prg_step != 1)		/*应该在处于Add C.M.步骤之中方可.*/
//                {
//                    errorType(ERR_KEY_ILLEGAL);
//                    break;
//                }
//                for (i=0;i<MAX_DEPT_CM_NO; i++)
//                {
//                	if (dept[Dept_Idx].CkMsg[i] ==0)	/*Found one blank record*/
//                		break;
//                }
//                if(i >= MAX_DEPT_CM_NO)
//                    {errorMsg("The CM buffer in this Dept is full");break; }
//                dept[Dept_Idx].CkMsg[i] = CM_Curr_Disp[curr_line];/*Add*/
//                prg_step = 0;
//                curr_line = 0;
//                Dept_Disp_Cm(Dept_Idx);
            break;
		#endif
        case KD_PAGE_DOWN:
        case KD_PAGE_UP:
        case KD_UP:
        case KD_DOWN:
            if(Dept_Idx != 0xffff)									/*已有DEP key被按下*/
            	Lcd_Reflush_List(Do_Menu_Roll(key));	/*左边文本显示区域上下翻页翻行*/
            break;
        case KD_DPSF:		/*切换部门显示画面*/
            DeptShiftFlag = (DeptShiftFlag+1)%4;	/*总共最多可以显示4屏部门按钮*/
            Lcd_Shift_Exchange(key);
            Dept_Idx = 0xffff;
            break;
        default:
            if((key >= KD_DP_ST)&&(key <= KD_DP_END))
            {
                key -= KD_DP_ST;
                key += (word)DeptShiftFlag*(sysflag->DPLU_Shift_Inc); 
                if(key >= Max_Dept_No)
                {
                    errorType(ERR_KEY_ILLEGAL);
                }
                else
                {
                    Dept_Idx = key;
                    Dept_Disp_Cm(Dept_Idx);
                    Lcd_Disp_Str_Btn(BUF_ID_TL_SUB, Str_Dept_Link_Step[1]);
                }
            }
            break;
    	}
    }
}
#else

void Dept_Link_CM_Main(void)
{
}
void CM_Prog_Main(void)
{
}
#endif

⌨️ 快捷键说明

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