📄 lcd.c
字号:
get_dot_ch(charcode);
row = ((LCD_DOTROW/LCD_ENGROW) * engrow);
for(i=0;i<LCD_CHDOTROW;i++)
{
/*
slcd.buf[line*2][row + i ] = ((INT8U *)slcd.char_dot)[i*2];
slcd.buf[line*2 + 1][row + i] = ((INT8U *)slcd.char_dot)[i*2 + 1];
*/
put_dot(line,engrow,i);
}
}
void get_dot_eng(INT8U charcode)
{
INT16U far *p;
INT8U i;
for(i = 0;i<LCD_ENGDOTROW;i++)
{
slcd.char_dot[i] = 0;
}
if(charcode==0) return;
p = (INT16U far *)(&wordlib_eng_table[(charcode-0x20)*9]);
for(i = 0;i<LCD_ENGLIBDOTROW;i++)
{
slcd.char_dot[i] = p[i + 1];
}
}
void get_dot_ch(INT16U charcode)
{
INT16U far *p;
INT16U i,j,k,code;
code = charcode;
asm("pushm r0");
asm("mov.w $$[FB],r0",code);
asm("xchg.b r0l,r0h");
asm("mov.w r0,$$[FB]",code);
asm("popm r0");
j = (LCD_CHDOTROW-LCD_CHLIBDOTROW)/2;
for(i = 0;i<LCD_CHDOTROW;i++)
{
slcd.char_dot[i] = 0;
}
if(code <= CHAR_CODE_CHCHAR)
{
i = (((code>>8)-CHAR_CODE_CHL)*94)+(code&0xff)-CHAR_CODE_CHL;
// p = (INT16U far *)(&wordlib_chascii_table[i*12]);
for(i = 0;i<LCD_CHLIBDOTROW;i++)
{
slcd.char_dot[i+j] = p[i];
}
return;
}
if((code >= CHAR_CODE_CHWORDL) && (code <= CHAR_CODE_CHWORDH))
{
i = (((code>>8)-CHAR_CODE_CHL) * CHAR_CODE_CHL_LENGTH)+(code&0xff)-CHAR_CODE_CHL;
k = CHAR_CODE_CHWORDL;
k >>= 8;
k -= CHAR_CODE_CHL;
k *= CHAR_CODE_CHL_LENGTH;
i = i-k;
p = (INT16U far *)(&wordlib_1212_table1[i*12]);
for(i = 0;i<LCD_CHLIBDOTROW;i++)
{
slcd.char_dot[i+j] = p[i];
}
}
}
INT16U get_code_type(INT16U charcode)
{
INT16U i,j;
if(!(charcode&0xff00))
{
if(charcode == CODE_ASCII_END) return STATUS_CODE_ASCIIEND;
if(charcode < CHAR_CODE_ENGL) return STATUS_CODE_ASCIICTRL;
if((charcode >= CHAR_CODE_ENGL) && (charcode <= CHAR_CODE_ENGH)) return STATUS_CODE_ASCII;
if(charcode < CHAR_CODE_CHL) return STATUS_CODE_INVALIDASCII;
return STATUS_CODE_NOASCII;
}
i = charcode;
asm("pushm r0");
asm("mov.w $$[FB],r0",i);
asm("xchg.b r0l,r0h");
asm("mov.w r0,$$[FB]",i);
asm("popm r0");
j = i&0xff;
if(j < CHAR_CODE_CHL) return STATUS_CODE_NOCH;
if(j > CHAR_CODE_CHLH) return STATUS_CODE_INVALIDCH;
if((charcode & 0xff) > CHAR_CODE_CHHH) return STATUS_CODE_INVALIDCH;
if((i >= CHAR_CODE_CHASCIIL) && (i <= CHAR_CODE_CHASCIIH)) return STATUS_CODE_CHASCII;
if(i <= CHAR_CODE_CHCHAR) return STATUS_CODE_CHCHAR;
if((i >= CHAR_CODE_CHWORDL) && (i <= CHAR_CODE_CHWORDH)) return STATUS_CODE_CH1;
return STATUS_CODE_INVALIDCH;
}
INT16U get_valid_code(INT16U code)
{
INT16U status;
status = get_code_type(code);
if(status == STATUS_CODE_ASCIIEND) return 0;
if(status == STATUS_CODE_ASCIICTRL)return 0;
if(status == STATUS_CODE_ASCII) return code;
if((status == STATUS_CODE_INVALIDASCII) | (status != STATUS_CODE_NOASCII)) return CODE_ASCII_SPACE;
if((status == STATUS_CODE_CHCHAR)|(status == STATUS_CODE_CH1)|(status == STATUS_CODE_CH2)|(status == STATUS_CODE_CH3)) return code;
if((status == STATUS_CODE_INVALIDCH) | (status != STATUS_CODE_NOCH)) return CODE_CH_SPACE;
return 0;
}
void lcd_write_line(INT8U line)
{
INT16U i,j,l;
put_dot_line(line);
l = LCD_LINE_PARA[line][5];
for(j = 0;j < LCD_LINE_PARA[line][0];j++)
{
lcd_write_command(LCD_PAGE|(l+j),0,0);
lcd_write_command(LCD_COLUMN_H,LCD_COLUMN_L,1);
port_lcd_cs = 0;
port_lcd_a0 = 1;
portd_lcd_data = 0x0ff;
for(i=0;i<112;i++)
{
lcd_write(slcd.buf[l+j][i]);
}
}
/*
lcd_write_command(LCD_PAGE|(line*2),0,0);
lcd_write_command(LCD_COLUMN_H,LCD_COLUMN_L,1);
port_lcd_cs = 0;
port_lcd_a0 = 1;
portd_lcd_data = 0x0ff;
for(i=0;i<112;i++)
{
lcd_write(slcd.buf[line*2][i]);
}
lcd_write_command(LCD_PAGE|(line*2 + 1),0,0);
lcd_write_command(LCD_COLUMN_H,LCD_COLUMN_L,1);
port_lcd_cs = 0;
port_lcd_a0 = 1;
portd_lcd_data = 0x0ff;
for(i=0;i<112;i++)
{
lcd_write(slcd.buf[line*2 + 1][i]);
}
*/
}
void lcd_up_line(void)
{
INT8U i,j;
for(i = slcd.edit_upline;i < slcd.edit_downline;i++)
{
for(j=0;j<LCD_ENGROW;j++)
{
slcd.code[i+1][j] = slcd.code[i][j];
}
}
for(j=0;j<LCD_ENGROW;j++)
{
slcd.code[slcd.edit_upline][j] = 0x20;
}
for(i = slcd.edit_downline;i > slcd.edit_upline;i--)
{
clear_line_dot(i);
move_line_dot(i-1,i);
}
/*
//以下也是一种刷新方式
for(i = slcd.edit_downline;i > slcd.edit_upline;i--)
{
put_dot_line(i);
}
*/
clear_line_dot(slcd.edit_upline);
}
void lcd_down_line(void)
{
INT8U i,j;
for(i = slcd.edit_upline;i < slcd.edit_downline;i++)
{
for(j=0;j<LCD_ENGROW;j++)
{
slcd.code[i][j] = slcd.code[i+1][j];
}
}
for(j=0;j<LCD_ENGROW;j++)
{
slcd.code[slcd.edit_downline][j] = 0x20;
}
/*
for(i = slcd.edit_upline;i < slcd.edit_downline;i++)
{
clear_line_dot(i);
move_line_dot(i+1,i);
}
*/
/*
//以下也是一种刷新方式
for(i = slcd.edit_upline;i < slcd.edit_downline;i++)
{
put_dot_line(i);
}
clear_line_dot(slcd.edit_downline);
*/
}
void clear_line_dot(INT8U line)
{
INT8U i,j,l;
l = LCD_LINE_PARA[line][5];
for(i=0;i<LCD_LINE_PARA[line][0];i++)
{
for(j = 0;j<LCD_DOTROW;j++)
{
slcd.buf[l+i][j] &= LCD_LINE_PARA[line][i+1];
}
}
}
void move_line_dot(INT8U sline,INT8U dline)
{
INT8U i;
INT16U j;
for(i=0;i<LCD_ENGROW;i++)
{
get_lineeng_dot(sline,i);
put_lineeng_dot(dline,i);
}
/*
for(i=0;i<LCD_DOTROW;i++)
{
j = get_linerow_dot(sline,i);
put_linerow_dot(dline,i,j);
}
*/
}
INT16U get_linerow_dot(INT8U line,INT8U row)
{
INT8U dot[4],l;
INT32U *p;
INT16U *pp;
pp = (INT16U *)dot;
p = (INT32U *)dot;
l = LCD_LINE_PARA[line][5];
dot[0] = slcd.buf[l][row];
dot[1] = slcd.buf[l+1][row];
dot[2] = slcd.buf[l+2][row];
if(LCD_LINE_PARA[line][4]) *p = (*p) >> LCD_LINE_PARA[line][4];
*p &= 0xfff;
return *pp;
}
void get_lineeng_dot(INT8U line,INT8U row)
{
INT8U dot[4],l,r,i;
INT32U *p;
INT16U *pp;
pp = (INT16U *)dot;
p = (INT32U *)dot;
r = row * LCD_ENGDOTROW;
l = LCD_LINE_PARA[line][5];
for(i = 0;i < LCD_ENGDOTROW;i++)
{
dot[0] = slcd.buf[l][r];
dot[1] = slcd.buf[l+1][r];
dot[2] = slcd.buf[l+2][r];
if(LCD_LINE_PARA[line][4]) *p = (*p) >> LCD_LINE_PARA[line][4];
*p &= 0xfff;
slcd.char_dot[i] = *p;
r++;
}
}
void put_lineeng_dot(INT8U line,INT8U row)
{
INT8U dot[4],l,r,i;
INT32U *p;
INT16U *pp;
p = (INT32U *)dot;
pp = (INT16U *)dot;
r = row * LCD_ENGDOTROW;
l = LCD_LINE_PARA[line][5];
for(i = 0;i < LCD_ENGDOTROW;i++)
{
*p = 0;
*pp = slcd.char_dot[i];
if(LCD_LINE_PARA[line][4]) *p = (*p) << LCD_LINE_PARA[line][4];
slcd.buf[l][row] &= LCD_LINE_PARA[line][1];
slcd.buf[l+1][row] &= LCD_LINE_PARA[line][2];
slcd.buf[l][row] |= dot[0];
slcd.buf[l+1][row] |= dot[1];
if(LCD_LINE_PARA[line][0]==3)
{
slcd.buf[l+2][row] &= LCD_LINE_PARA[line][3];
slcd.buf[l+2][row] |= dot[3];
}
}
}
void put_linerow_dot(INT8U line,INT8U row,INT16U data)
{
INT8U dot[4],l;
INT32U *p;
INT16U *pp;
p = (INT32U *)dot;
pp = (INT16U *)dot;
*p = 0;
*pp = data;
if(LCD_LINE_PARA[line][4]) *p = (*p) << LCD_LINE_PARA[line][4];
l = LCD_LINE_PARA[line][5];
slcd.buf[l][row] &= LCD_LINE_PARA[line][1];
slcd.buf[l+1][row] &= LCD_LINE_PARA[line][2];
slcd.buf[l][row] |= dot[0];
slcd.buf[l+1][row] |= dot[1];
if(LCD_LINE_PARA[line][0]==3)
{
slcd.buf[l+2][row] &= LCD_LINE_PARA[line][3];
slcd.buf[l+2][row] |= dot[3];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -