📄 lcd.c
字号:
{
if((lcmRead(1)& 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
U8 fnST6(void) // 状态位ST6判断(屏读/屏拷贝状态)
{
U8 i;
for(i=10;i>0;i--)
{
if((lcmRead(1)& 0x40) == 0x40)
break;
}
return i; // 若返回零,说明错误
}
U8 fnPR1(U8 uCmd,U8 uPar1,U8 uPar2) // 写双参数的指令
{
if(fnST01() == 0)
return 1;
lcmWrite(0,uPar1);
if(fnST01() == 0)
return 2;
lcmWrite(0,uPar2);
if(fnST01() == 0)
return 3;
lcmWrite(1,uCmd);
return 0; // 返回0成功
}
U8 fnPR11(U8 uCmd,U8 uPar1) // 写单参数的指令
{
if(fnST01() == 0)
return 1;
lcmWrite(0,uPar1);
if(fnST01() == 0)
return 2;
lcmWrite(1,uCmd);
return 0; // 返回0成功
}
U8 fnPR12(U8 uCmd) // 写无参数的指令
{
if(fnST01() == 0)
return 1;
lcmWrite(1, uCmd);
return 0; // 返回0成功
}
U8 fnPR13(U8 uData) // 写数据
{
if(fnST3() == 0)
return 1;
lcmWrite(0,uData);
return 0; // 返回0成功
}
U8 fnPR2(void) // 读数据
{
if(fnST01() == 0)
return 1;
return lcmRead(0);
}
// 设置当前地址
void fnSetPos(U8 urow, U8 ucol)
{
U8 iPos;
iPos = urow * 30 + ucol;
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
// 设置当前显示行、列
void cursor(U8 uRow, U8 uCol)
{
fnSetPos(uRow * 16, uCol);
}
// 清屏
void cls(U8 uData)
{
U16 i;
U8 j;
fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针
fnPR12(LC_AUT_WR); // 自动写
for(i=0;i<240*30;i++)
{
while ((j=fnST3())==0);
fnPR13(uData); // 写数据
}
fnPR12(LC_AUT_OVR); // 自动写结束
//fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
//gCurRow = 0; // 置地址指针存储变量
//gCurCol = 0;
}
void cls2(void)
{
U16 i;
fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针
fnPR12(LC_AUT_WR); // 自动写
for(i=0;i<0x80;i++)
{
fnST3();
fnPR13(i); // 写数据
}
fnPR12(LC_AUT_OVR); // 自动写结束
//fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
//gCurRow = 0; // 置地址指针存储变量
//gCurCol = 0;
}
// LCM 初始化
U8 fnLCMInit(void)
{
rPDATC = 0x0000; //All IO is low
rPCONC = 0x5f555555;
rPUPC = 0x3000; //PULL UP RESISTOR should be enabled to I/O
//PORT D GROUP
/* PORT D GROUP(I/O OR LCD) */
/* BIT7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* 01 01 01 01 01 01 01 01 */
rPDATD= 0x00;
rPCOND= 0x5555;
rPUPD = 0x00;
// lcmDelay (100);
if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
return -1;
fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
fnPR12(LC_CUR_SHP | 0x01); // 光标形状
fnPR12(LC_MOD_OR); // 显示方式设置
fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
return 0;
}
// ASCII(8*16) 及 汉字(16*16) 显示函数
void dprintf(U8 *fmt, ...)
{
//U8 tmpBuf[64];
//U8 i,j,uLen,uRow,uCol;
// uRow = fnGetRow();
// uCol = fnGetCol();
U8 c1,c2,cData;
U8 tmpBuf[64]; // LCD显示数据缓冲区
U8 i=0,j,uLen,uRow,uCol;
U16 k;
va_list arg_ptr;
va_start(arg_ptr, fmt);
uLen = (U8)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 >= 0)
{ // ASCII
if(c1 < 0x20)
{
switch(c1)
{
case CR:
case LF: // 回车或换行
i++;
if(uRow < 112)
fnSetPos(uRow+16,0);
else
fnSetPos(0,0);
continue;
case BS: // 退格
if(uCol > 0)
uCol--;
fnSetPos(uRow,uCol);
cData = 0x00;
break;
default: // 其他
c1 = 0x1f;
}
}
for(j=0;j<16;j++)
{
fnPR12(LC_AUT_WR); // 写数据
if(c1 >= 0x1f)
{
if(j < (16-ASC_CHR_HEIGHT))
fnPR13(0x00);
else
fnPR13(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
}
else
fnPR13(cData);
fnPR12(LC_AUT_OVR);
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) // 非退格
uCol++;
}
else
{ // 中文
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
{
fnSetPos(uRow+k,uCol);
fnPR12(LC_AUT_WR); // 写数据
if(j < sizeof(GB_16)/sizeof(GB_16[0]))
{
fnPR13(GB_16[j].Msk[k*2]);
fnPR13(GB_16[j].Msk[k*2+1]);
}
else // 未找到该字
{
if(k < sizeof(GB_16[0].Msk)/4)
{
fnPR13(0x00);
fnPR13(0x00);
}
else
{
fnPR13(0xff);
fnPR13(0xff);
}
}
fnPR12(LC_AUT_OVR);
}
uCol += 2;
i++;
}
if(uCol >= 30) // 光标后移
{
uRow += 16;
if(uRow < 0x80)
uCol -= 30;
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
//return uLen;*/
}
/*void main(void) // 测试用
{
fnLCMInit();
cls();
cursor(0,0);
dprintf("%s","This is a test:中文测试");
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -