📄 lcm_drive.c
字号:
* 功能:指定地址显示字符。
* 入口参数:disp_cy 显示行值(0-7)
* disp_cx 显示列值(0-15)
* dispdata 所要显示的字符(ASCII码)
* 注:支持显示字符0-9、A-Z、a-z及空格,字符显示格式为5*7,模为8*8,所以
* 屏幕显示为8*16(共8行,每行16个字符)。
***********************************************************************/
void LCM_DispChar(uint8 disp_cy, uint8 disp_cx, char dispdata)
{ uint8 code *pchardata;
uint8 i;
disp_cy = disp_cy&0x07; // 参数过滤
disp_cx = disp_cx&0x0f;
/* 先要找出显示数据的类型,并设置相应的点阵数据表,然后设置指针,以取得对应的点阵数据。 */
switch(dispdata&0xf0)
{ case 0x20:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB20[dispdata];
break;
case 0x30:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB30[dispdata];
break;
case 0x40:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB40[dispdata];
break;
case 0x50:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB50[dispdata];
break;
case 0x60:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB60[dispdata];
break;
case 0x70:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB70[dispdata];
break;
default:
pchardata = &ASCII_TAB20[0];
break;
} // end of switch(dispdata&0xf0)...
if( (disp_cx&0x08) == 0 ) // 选择液晶控制芯片(即CS1--控制前8个字符,CS2--控制后8个字符)
{ i = disp_cx<<3;
LCM_Wr1Command(LCM_ADDRSTRX+i); // 设置当前列地址,即列
LCM_Wr1Command(LCM_ADDRSTRY+disp_cy); // 设置当前页地址,即行
for(i=0; i<5; i++);
LCM_Wr1Data(0x00); // 显示一列空格
for(i=0; i<5; i++)
{ LCM_Wr1Data(*pchardata); // 发送数据 */
pchardata++;
}
LCM_Wr1Data(0x00);
for(i=0; i<5; i++);
LCM_Wr1Data(0x00);
}
else
{ i = (disp_cx&0x07)<<3; // 若Y>7,则选取用CS2并且地址值要先减去8,再乘以8
LCM_Wr2Command(LCM_ADDRSTRX+i);
LCM_Wr2Command(LCM_ADDRSTRY+disp_cy); // 设置当前页地址,即行
for(i=0; i<5; i++);
LCM_Wr2Data(0x00); // 显示一列空格
for(i=0; i<5; i++)
{ LCM_Wr2Data(*pchardata); // 发送数据 */
pchardata++;
}
LCM_Wr2Data(0x00);
for(i=0; i<5; i++);
LCM_Wr2Data(0x00);
}
}
/***********************************************************************
* 名称:LCM_DispStr()
* 功能:字符串显示输出。
* 入口参数:disp_cy 显示起始行(0-7)
* disp_cx 显示起始列(0-15)
* disp_str 字串指针
* 出口参数:无
* 注:支持显示字符0-9、A-Z、a-z及空格,字符显示格式为5*7,模为8*8,所以屏幕显示
* 为8*16(共8行,每行16个字符)。
***********************************************************************/
void LCM_DispStr(uint8 disp_cy, uint8 disp_cx, char *disp_str)
{ while( *disp_str != '\0')
{ disp_cy = disp_cy&0x07; // 参数过滤
disp_cx = disp_cx&0x0f;
LCM_DispChar(disp_cy, disp_cx, *disp_str); // 显示字符
disp_str++; // 指向下一字符数据
disp_cx++;
if(disp_cx>15) disp_cy++; // 指向下一显示行
}
}
/***********************************************************************
* 名称:LCM_DispWord()
* 功能:汉字显示输出。
* 入口参数:disp_cy 显示起始行(0-7)
* disp_cx 显示起始列(0-15)
* 出口参数:无
* 注:支持显示字符0-9、A-Z、a-z及空格,字符显示格式为5*7,模为8*8,所以屏幕显示
* 为8*16(共8行,每行16个字符)。
***********************************************************************/
uint8 code WORD_TAB1[256] ={ //-- 文字: 上--
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,
0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,
0x40,0x40,0x40,0x40,0x40,0x60,0x40,0x00,
//uint8 code WORD_TAB20[32] ={ //-- 文字: 大--
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,
0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,
0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,
//uint8 code WORD_TAB30[32] ={ //-- 文字: 机--
0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,
0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,
0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00,
//uint8 code WORD_TAB40[32] ={ //-- 文字:自--
0x00,0x00,0x00,0xF8,0x48,0x48,0x4C,0x4B,
0x4A,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,
0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,
//uint8 code WORD_TAB50[32] ={ //-- 文字: 学--
0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,
0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,
0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
///uint8 code WORD_TAB60[32] ={ //-- 文字: 院--
0xFE,0x02,0x32,0x4A,0x86,0x0C,0x24,0x24,
0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x00,
0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,
0x01,0x01,0x7E,0x81,0x81,0x81,0xF1,0x00
};
uint8 code WORD_TAB2[64] ={ //-- 文字: 电 --
0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,
0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,
0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
//uint8 code WORD_TAB80[32] ={ //-- 文字: 压 --
0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,
0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,
0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,
};
void LCM_DispWord(uint8 disp_cy, uint8 disp_cx,uint8 code *pchardata)
{ unsigned char i,j;
uint8 code *pchartempdata;
unsigned char temp_cx,temp_cy;
disp_cy = disp_cy&0x07; // 参数过滤
disp_cx = disp_cx&0x0f;
for(j=0;j<4;j++)
{
pchartempdata = pchardata + j*8;
temp_cx = disp_cx+j%2;
temp_cy = disp_cy+j/2;
if( (temp_cx&0x08) == 0 ) // 选择液晶控制芯片(即CS1--控制前8个字符,CS2--控制后8个字符)
{
i = temp_cx<<3;
LCM_Wr1Command(LCM_ADDRSTRX+i); // 设置当前列地址,即列
LCM_Wr1Command(LCM_ADDRSTRY+temp_cy); // 设置当前页地址,即行
for(i=0; i<5; i++);
for(i=0; i<8; i++)
{ LCM_Wr1Data(*pchartempdata); // 发送数据 */
pchartempdata++;
}
for(i=0; i<5; i++);
}
else
{ i = (temp_cx&0x07)<<3; // 若Y>7,则选取用CS2并且地址值要先减去8,再乘以8
LCM_Wr2Command(LCM_ADDRSTRX+i);
LCM_Wr2Command(LCM_ADDRSTRY+temp_cy); // 设置当前页地址,即行
for(i=0; i<5; i++);
for(i=0; i< 8; i++)
{ LCM_Wr2Data(*pchartempdata); // 发送数据 */
pchartempdata++;
}
for(i=0; i<5; i++);
}
}
}
void LCM_DispWords(uint8 disp_cy, uint8 disp_cx)
{
uint8 i,temp_cx,temp_cy;
uint8 code *pchardata;
pchardata = &WORD_TAB1[0];
temp_cx = disp_cx;
temp_cy = disp_cy;
for(i = 0;i<8;i++)
{
temp_cx = disp_cx + 2*(i%8);
temp_cy = temp_cy&0x07; // 参数过滤
temp_cx = temp_cx&0x0f;
LCM_DispWord(temp_cy, temp_cx, pchardata); // 显示字符
pchardata = pchardata + 32; // 指向下一字符数据
}
temp_cx = 0;
pchardata = &WORD_TAB2;
for(i = 0; i<2;i++)
{
temp_cx = 2*i;
temp_cy = disp_cy + 2;
temp_cy = temp_cy&0x07; // 参数过滤
temp_cx = temp_cx&0x0f;
LCM_DispWord(temp_cy, temp_cx, pchardata);
pchardata = pchardata + 32;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -