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

📄 6963c基于240128模块c语言参考程序.txt

📁 常用液晶模块选型资料及中文数据手册
💻 TXT
📖 第 1 页 / 共 2 页
字号:

uchar fnST6(void)  // 状态位ST6判断(屏读/屏拷贝状态)
{
 uchar i;
 
 for(i=10;i>0;i--)
 {
  if((LCMCW & 0x40) == 0x40)
   break;
 }
 return i; // 若返回零,说明错误
}

uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令
{
 if(fnST01() == 0)
  return 1;
 LCMDW = uPar1;
 if(fnST01() == 0)
  return 2;
 LCMDW = uPar2;
 if(fnST01() == 0)
  return 3;
 LCMCW = uCmd;
 return 0; // 返回0成功
}

uchar fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令
{
 if(fnST01() == 0)
  return 1;
 LCMDW = uPar1;
 if(fnST01() == 0)
  return 2;
 LCMCW = uCmd;
 return 0; // 返回0成功
}

uchar fnPR12(uchar uCmd)  // 写无参数的指令
{
 if(fnST01() == 0)
  return 1;
 LCMCW = uCmd;
 return 0; // 返回0成功
}

uchar fnPR13(uchar uData)  // 写数据
{
 if(fnST3() == 0)
  return 1;
 LCMDW = uData;
 return 0; // 返回0成功
}

uchar fnPR2(void)    // 读数据
{
 if(fnST01() == 0)
  return 1;
 return LCMDW;
}

// 设置当前地址
void fnSetPos(uchar urow, uchar ucol)
{
 uint iPos;

 iPos = urow * 30 + ucol;
 fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
 gCurRow = urow;
 gCurCol = ucol;
}

// 设置当前显示行、列
void cursor(uchar uRow, uchar uCol)
{
 fnSetPos(uRow * 16, uCol);
}

// 清屏
void cls(void)
{
 uint i;

 fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针
 fnPR12(LC_AUT_WR);    // 自动写
 for(i=0;i<240*30;i++)
 {
  fnST3();
  fnPR13(0x00);    // 写数据
 }
 fnPR12(LC_AUT_OVR);    // 自动写结束
 fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
 gCurRow = 0;     // 置地址指针存储变量
 gCurCol = 0;
}

// LCM 初始化
char fnLCMInit(void)
{
 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) 显示函数
uchar dprintf(char *fmt, ...)
{
 va_list arg_ptr;
 char c1,c2,cData;
 char tmpBuf[64];    // LCD显示数据缓冲区
 uchar i=0,j,uLen,uRow,uCol;
 uint k;
 
 va_start(arg_ptr, fmt);
 uLen = (uchar)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 + -