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

📄 lcd2.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 4 页
字号:
                Lcd_PartLayout_Main();
            else
            {
                Tl_Title.align = ALIGN_MID;
                Tl_Title.posi_max = 1;
                Tl_Title.posi[0] = 1;
                Tl_Title.len[0] = strlen(Str_Lcd_Title_Sale);
                memset(Tl_Title.text,0, MAX_TEXT);
                memcpy(Tl_Title.text,Str_Lcd_Title_Sale,Tl_Title.len[0]);
			    Lcd_Layout_Main();
//                Lcd_Init_SaleHead();
            }
		}
		else 
        {
//			Ts_Key_Tab = Ts_KeyMap_Sale_Main_7inch;
//            Ts_Key_Table_Size = Ts_KeyMap_Sale_Main_Size;
//            Tl_Title.align = ALIGN_MID;
//            Tl_Title.posi_max = 1;
//            Tl_Title.posi[0] = 1;
//            Tl_Title.len[0] = strlen("<R> CLERK01");
//            memset(Tl_Title.text,0, MAX_TEXT);
//            memcpy(Tl_Title.text,"<R> CLERK01",Tl_Title.len[0]);
//			Lcd_Layout_Main();
//            Lcd_Init_SaleHead();
		}
	}
	else if (sys_id == SYS_ID_SALE_DPLU) 
    {
		Ts_Key_Tab = Ts_KeyMap_Hardplu;
        Ts_Key_Table_Size = Ts_KeyMap_Hardplu_Size;
		Lcd_PartLayout_Main();
	}
    else if(sys_id == SYS_ID_SALE_DEPT)
    {
		Ts_Key_Tab = Ts_KeyMap_ShiftDept;
        Ts_Key_Table_Size = Ts_KeyMap_ShiftDept_Size;
		Lcd_PartLayout_Main();
    }
	else if((sys_id == SYS_ID_XZRPT)||(sys_id == SYS_ID_PROG_MAIN))//added by xxc
	{
        Tl_Title.align = ALIGN_MID;
        Tl_Title.posi_max = 1;
        Tl_Title.posi[0] = 1;
        memset(Tl_Title.text,0, MAX_TEXT);
        if(sys_id == SYS_ID_PROG_MAIN)
        {
            Tl_Title.len[0] = strlen(Str_Lcd_Title_Prog);
            memcpy(Tl_Title.text,Str_Lcd_Title_Prog,Tl_Title.len[0]);
            Ts_Key_Table_Size = Ts_KeyMap_Prog_Main_Size;
        }
        else
        {
            Tl_Title.len[0] = strlen(Str_Lcd_Title_Rpt);
            memcpy(Tl_Title.text,Str_Lcd_Title_Sale,Tl_Title.len[0]);
            Ts_Key_Table_Size = Ts_Digit_Input_Tab_Size;
        }
		Ts_Key_Tab = Ts_Digit_Input_Tab;
		Lcd_Layout_Main();
	}
//	else if (sys_id == SYS_ID_PROG_MAIN) {
//		Ts_Key_Tab = Ts_KeyMap_Prog_Main;
//        Ts_Key_Table_Size = Ts_KeyMap_Prog_Main_Size;
//        Tl_Title.align = ALIGN_MID;
//        Tl_Title.posi_max = 1;
//        Tl_Title.posi[0] = 1;
//        Tl_Title.len[0] = strlen("PROGRAM");
//        memset(Tl_Title.text,0, MAX_TEXT);
//        memcpy(Tl_Title.text,"PROGRAM",Tl_Title.len[0]);
//		Lcd_Layout_Main();
//		Lcd_Init_Prog();
//	}
	else {
		// ...
	}

	Lcd_Sys_Id = sys_id;
}
/*
	Dispaly the input digit.
	说明: 正在输入数据时候的显示和输入数据后的显示是不太一样的,
			这样用户使用的时候就很方便了.
*/
void Lcd_Tl_Input_Disp(byte input_stat, long data)
{
	byte i;
	byte j;
	byte dot_posi = MAX_INPUT_LEN;
	byte tmp[MAX_LCD2_LEN+1] = "                          ";
	byte len = 0;

	if((CurrMode == XREPORT)||(CurrMode == ZREPORT))
		return;

	if (input_stat == TL_INPUT_CLEAR) 
    {	/* Display 0.00 */
		LongLcdFmt_Text_Buff(BUF_ID_TL_INPUT, 1, 0, sysflag->sysdots, ALIGN_LEFT);
		Lcd_Disp_Text_Buff(BUF_ID_TL_INPUT);
	}
	else if (input_stat == TL_INPUT_INPUTING) 
    { /* Input the digit */
		j = MAX_INPUT_LEN;
		for (i = numcnt; i > 0; i--) {
			if (dec_flag) {
				if (MAX_INPUT_LEN - j == dec_cnt) {
					tmp[--j] = '.';
					dot_posi = j;
				}
			}
			else if (temp_disp_dot_flag) {
				if (MAX_INPUT_LEN - j == sysflag->sysdots) {
					tmp[--j] = '.';
					dot_posi = j;
				}
			}
			tmp[--j] = In_Buff[i-1] + '0';
		}
		if (temp_disp_dot_flag && !dec_flag) {
			tmp[MAX_INPUT_LEN-sysflag->sysdots-1] = '.';
			dot_posi = MAX_INPUT_LEN-sysflag->sysdots-1;
		}

		if (j > dot_posi)
			j = dot_posi;
		memmove(tmp, tmp+j, MAX_INPUT_LEN-j);
		tmp[MAX_INPUT_LEN-j] = '\0';
		Lcd_Send_Text_Buff_Str(BUF_ID_TL_INPUT, 1, tmp, ALIGN_MID);
		Lcd_Disp_Text_Buff(BUF_ID_TL_INPUT);
	}
	else if (input_stat == TL_INPUT_INPUTED) { /* Has inputted the digit */
		if (dec_flag) {
			LongLcdFmt_Text_Buff(BUF_ID_TL_INPUT, 1, data, dec_cnt, ALIGN_LEFT);
		}
		else if (temp_disp_dot_flag) {
			LongLcdFmt_Text_Buff(BUF_ID_TL_INPUT, 1, data, sysflag->sysdots, ALIGN_LEFT);
		}
		else {
			LongLcdFmt_Text_Buff(BUF_ID_TL_INPUT, 1, data, 0, ALIGN_LEFT);
		}
		Lcd_Disp_Text_Buff(BUF_ID_TL_INPUT);
	}
}

/* Initial the pop text */
void Lcd_Init_Pop_Text(byte pop_type)
{
	Bak_Ts_Key_Tab = Ts_Key_Tab;
	Bak_Ts_Key_Table_Size = Ts_Key_Table_Size;

	if (Ts_Key.curr_logi != KD_NULL_LOGI)		/* 弹出按键 */
		Lcd_Draw_Button_REV(Ts_Key.curr_logi, TS_KEY_IDLE);
    
	if (pop_type == POP_ID_NOR) /* Error message pop type */
    {		
		Ts_Key_Tab = Ts_KeyMap_Err;
        Ts_Key_Table_Size = Ts_KeyMap_Err_Size;
	}
	else /* Sale payment successful message */
    {
		Ts_Key_Tab = Ts_KeyMap_Sel;
        Ts_Key_Table_Size = Ts_Pop_KeyMap_Size;
	}
	Rst_Pop_Text();

	unconditioned_refresh_margin = 1;
	Draw_Pop_Text_Flag = 1;

	Lcd_Layout_Draw_Key();
}
/*
	释放弹出窗口,还原显示。
*/
void Lcd_Res_Pop_Text(void)
{
	Ts_Key_Tab = Bak_Ts_Key_Tab;
    Ts_Key_Table_Size = Bak_Ts_Key_Table_Size;

	Draw_Pop_Text_Flag = 0;

    Lcd_Layout_Draw_Key();
    
	unconditioned_refresh_margin = 0;
}


/*----------------------------------------------------------------------------*
	Display the error type to the lcd
*----------------------------------------------------------------------------*/
void Lcd_Err_Type(word type, char *str)
{
	char error_str[MAX_LCD_NUM+1];
	byte i;
	byte j;
	word tmp;
	byte len;			/* The current print string length */
	byte inc;			/* The increment */
	char *cur_str;		/* The current print string */
	byte spec_char_cnt;		/* 全角字符的统计, 用于更改为其他国家语言的时候, 可能出现全角字符 */
	extern	const int	Error_Type_Tabl[];
	extern	const char	*Prn_Error_Tabl[];

	byte max_len;   /*一行允许的最大字符长度*/

	if (Lcd_Mode == LCD_10_INCH)
		max_len = MAX_LCD2_LEN;
	else
		max_len = MAX_POP_TEXT7;

	Lcd_Init_Pop_Text(POP_ID_NOR);

	Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, "ERROR!", ALIGN_MID);
	Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
	Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, Str_Null, ALIGN_MID);
	Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);

	if (type == 0) 
    {
		strcpy(error_str, str);
		Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, error_str, ALIGN_LEFT);
		Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
	}
	else 
    { // type != 0
		if(type >= 1000) 
        {
			strcpy(error_str, Disp_Err_Abnormal);
			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, error_str, ALIGN_LEFT);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
		}
		else 
        {
			error_str[0] = 'E';
			tmp = type;
			for(i = 3; i > 0; i --)
			{
				j = tmp%10;
				tmp /= 10;
				error_str[i] = j + '0';
			}
			error_str[4] = ':';
			error_str[5] = '\0';
			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, error_str, ALIGN_LEFT);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);

			for(i = 0; i < ERROR_TYPE_NUM; i ++) 
            {
				if (Error_Type_Tabl[i] == type)
					break;
			}
			if (i < ERROR_TYPE_NUM) /* Has find the error type */
            {		
				cur_str = (char *)(Prn_Error_Tabl[i]);		/* Print the error description */
				len = strlen(cur_str);
				while(len != 0)
				{
					inc = max_len-2;				/* The one line length */
					if(len <= inc)			/* The leave length is less than the one line length(27) */
					{
						Lcd_Send_Text_Buff_Mem(BUF_ID_POP_TEXT, 1+2, cur_str, inc, ALIGN_LEFT);
						Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
						len = 0;
						inc = 0;
						break;
					}
					else
					{
						if(cur_str[inc] == ' ')		/* The next character is the blank */
						{
							Lcd_Send_Text_Buff_Mem(BUF_ID_POP_TEXT, 1+2, cur_str, inc, ALIGN_LEFT);
							Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
							while(cur_str[inc] == ' ')
								inc ++;
						}
						
						/* Print the integrated word in one line */
						else if((Chk_Word(cur_str[inc - 1]) == NG) && (Chk_Word(cur_str[inc]) != NG))
						{
							Lcd_Send_Text_Buff_Mem(BUF_ID_POP_TEXT, 1+2, cur_str, inc, ALIGN_LEFT);
							Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
						}
						else
						{
							while(Chk_Word(cur_str[inc - 1]) != NG)
							{
								inc --;
								if(inc == 0)
								{
									inc = max_len-2;
									break;
								}
							}
							/* The new add: */
							/* 用于全角字符的调整 */
							spec_char_cnt = 0;
							for(j = 0; j < inc; j ++)
							{
								if((byte)(cur_str[j]) >= 0xa1)			/* Indicate the korea character */
									spec_char_cnt ++;
							}
							if(spec_char_cnt&0x01)			/* The counter is odd */
								inc --;
							/*--------------*/
							Lcd_Send_Text_Buff_Mem(BUF_ID_POP_TEXT, 1+2, cur_str, inc, ALIGN_LEFT);
							Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
						}
						cur_str += inc;
						len -= inc;
					}
				}
			}
		}
	}
}

/*
	Checking the sure has pressing or not
*/
BOOL Lcd_Chk_Sure_Key(void)
{
	word key;

	key = GetKey();
	if (key == KD_CLEAR || key == KD_SURE || key == KD_RETURN)
		return TRUE;
	else 
		return FALSE;
}

/* 初始化CASH特殊的系统标志量 */
void Lcd_Init_Cash_Spec(void)
{
	skip_null_key = FALSE;
}

/* 还原CASH的特殊系统标志量 */
void Lcd_Res_Cash_Spec(void)
{
	skip_null_key = TRUE;
}

/*
	Display the cash information to the LCD.
*/
void Lcd_Disp_Cash_Info(long subttl, long cash, long change)
{
	byte step = 0;
	int delay_cnt;
	byte con_flag;

	byte lcd_posi;

	if (Lcd_Mode == LCD_10_INCH)
		lcd_posi = LCD_POSI_CASH_INFO;
	else
		lcd_posi = LCD_POSI_CASH_INFO7;

    Lcd_Disp_Subttl();
	Lcd_Init_Pop_Text(POP_ID_NOR);
	Lcd_Init_Cash_Spec();

	do {
		if (step&0x01) {
			Rst_Pop_Text();
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
		}
		else {
			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, "PAYMENT", ALIGN_MID);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, Str_Null, ALIGN_MID);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);

			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, "Subtotal", ALIGN_LEFT);
			LongLcdFmt_Text_Buff(BUF_ID_POP_TEXT, lcd_posi, subttl, sysflag->sysdots, ALIGN_LEFT);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);

			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, Str_Cash, ALIGN_LEFT);
			LongLcdFmt_Text_Buff(BUF_ID_POP_TEXT, lcd_posi, cash, sysflag->sysdots, ALIGN_LEFT);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);

			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, Str_Null, ALIGN_MID);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
			Lcd_Send_Text_Buff_Str(BUF_ID_POP_TEXT, 1, Str_Change, ALIGN_LEFT);
			LongLcdFmt_Text_Buff(BUF_ID_POP_TEXT, lcd_posi, change, sysflag->sysdots, ALIGN_LEFT);
			Lcd_Disp_Text_Buff(BUF_ID_POP_TEXT);
		}

		if (step == 0)
			delay_cnt = 5000;
		else 
			delay_cnt = 1000;
		con_flag = CndtDelay2(delay_cnt);

		step++;
		if (step == 7)
			con_flag = FALSE;
	} while(con_flag);
	Clr_Key_Buff();

	Lcd_Res_Cash_Spec();		/* 还原Cash的特殊标志 */
	Lcd_Res_Pop_Text();
}


/*----------------------------------------------------------------------------*
    将需要显示的字符串一行一行填充到文本显示缓冲区,不显示
*----------------------------------------------------------------------------*/
void Insert_Full_Text_List(const char Str_List[][MAX_TEXT+1], byte Max_Line, byte FstLine)
{
    byte i;
    byte len;

    for(i = 0; i < DISP_LCD_TEXT_LINE*3; i++)
    {
        memset(Text_Lcd.text[i], 0x20, MAX_TEXT);
        if(i < Max_Line)
        {
            len = strlen(Str_List[i]);
            len = (len > MAX_TEXT)? MAX_TEXT: len;
            memcpy(Text_Lcd.text[i], Str_List[i], len);
        }
    }
    Text_Lcd.FirstLine = FstLine-1;
    Text_Lcd.EndLine = Max_Line;
    Text_Lcd.StartLine = 0;
    Text_Lcd.CurrLine = Text_Lcd.FirstLine;
}

/*----------------------------------------------------------------------------*
    将需要显示的字符串一行一行填充到文本显示缓冲区,并将当前行反显.
*----------------------------------------------------------------------------*/
void Get_Full_Text_List(const char **Str_List, byte Max_Line, byte FstLine)
{
    Insert_Full_Text_List(Str_List, Max_Line, FstLine);

    Lcd_Reflush_List(0);

}

/*----------------------------------------------------------------------------*
    mode == 0: 整屏刷新
    mode == 1: 单行刷新
    mode == 2: 刷新除开始两行外的整屏.
*----------------------------------------------------------------------------*/
void Lcd_Reflush_List(byte mode)
{
    byte page = 0;  
    byte i;
    byte max_disp_line;     /* 最大显示的函数 */

    if(Text_Lcd.EndLine >= DISP_LCD_TEXT_LINE)
    {
        page = (Text_Lcd.CurrLine)/DISP_LCD_TEXT_LINE;
        Text_Lcd.StartLine = page*DISP_LCD_TEXT_LINE;
        max_disp_line = DISP_LCD_TEXT_LINE;
    }
    else
    {
        page = 0;
        Text_Lcd.StartLine = 0;
        max_disp_line = Text_Lcd.EndLine;
    }
    for(i = 0; i < DISP_LCD_TEXT_LINE; i++)
    {
        if((i == Text_Lcd.CurrLine - Text_Lcd.StartLine)&&(Text_Lcd.CurrLine >= Text_Lcd.FirstLine))
        {
            Lcd_Text_Line_Disp(i, TRUE);
        }
        else
        {
            if((mode == 0)||((mode == 1)&&(i + Text_Lcd.StartLine == Text_Lcd.LastLine)))
            {
                Lcd_Text_Line_Disp(i, FALSE);
            }
        }
    }
    Text_Lcd.LastLine = Text_Lcd.CurrLine;
}

/*----------------------------------------------------------------------------*
*  函数功能: 显示 Text_Lcd 在指定行的内容, 可以支持单行反显
*     在每次显示一行字符时, 会先擦除刚才的显示, 然后再显示相应的字符  
*   rev -- TRUE: 反显
*----------------------------------------------------------------------------*/
void Lcd_Text_Line_Disp(byte line, byte rev)
{
    int width, height;
    int x1,x2,y1,y2;
    int x0,y0;
    byte font_color = WHITE;
    
    if(line >= DISP_LCD_TEXT_LINE)
        return;
        
    width = MAX_TEXT*Font_Size[DEFAULT_FONT][0];
    height = DISP_LCD_TEXT_LINE*Font_Size[DEFAULT_FONT][1];

    x1 = Func_Btn_Posi[BUF_ID_LCD_TEXT][0]+2;
    x2 = Func_Btn_Posi[BUF_ID_LCD_TEXT][1]-2;
    y1 = Func_Btn_Posi[BUF_ID_LCD_TEXT][2]+2;
    y2 = Func_Btn_Posi[BUF_ID_LCD_TEXT][3]-2;
    x0 = x1 + (x2 - x1 - width)/2;
    y0 = y1 + (y2 -y1 - height)/2;

    y0 = y0 + ((int)line)*Font_Size[DEFAULT_FONT][1];//指定到当前显示的行号.

    if(rev == TRUE)//需要整行反显
    {
        Lcd_Draw_Rect_Fill(x0, y0, x0+width, y0+Font_Size[DEFAULT_FONT][1], WHITE);
        font_color = BLACK;
    }
    else
        Lcd_Draw_Rect_Fill(x0, y0, x0+width, y0+Font_Size[DEFAULT_FONT][1], BLACK);
        
    TFT_Lcd_Disp_Text(Text_Lcd.text[Text_Lcd.StartLine+line], MAX_TEXT, DEFAULT_FONT, 0x11, TRUE, font_color, x0, y0);
}

/*
	Roll the text display buffer
	说明: 这里可仅需修改dsp_line_new即可
*/
void Lcd_Roll(word key)
{
	#if MAX_LCD_TEXT_LINE + DISP_LCD_TEXT_LINE >= 255
	/* 由于采用byte指针,假如把MAX_LCD_TEXT_LINE默认设置成了255
		则在采用page down运算的时候,就会变成稍微复杂一些
	*/
	abcdefghijklmnopqrstuvwxyz
	#endif
	#if MAX_LCD_TEXT_LINE < DISP_LCD_TEXT_LINE
	/* 与上面的道理相似 */
	ABCDEFGHIJKLMNOPQRSTUVWXYZ
	#endif

⌨️ 快捷键说明

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