📄 lcd2.c
字号:
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 + -