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

📄 t6963_yejin.c

📁 东芝T6963是一个非常通用的芯片,市面上128*64或240*64的点阵液晶大都使用该芯片驱动,这个文件是该芯片的驱动.
💻 C
字号:
T6963_Yejin.C

#i nclude  "T6963_YeJin12864.h"


extern unsigned char code chardot[];
// UNINT CurrentTextPoint      /*应定义成全程变量方式,
/*  绝对定位形式可以考虑*/
/*当前的图形显示口地址*/
// UNINT CurrentGraphPoint     /*同上*/

UNCHAR  data CharType;
UNINT CurrentPoint;/*当前显存的指针*/

 

/*读取液晶的状态*/
//要求片选LCDCE=0,CD=1
UNCHAR T6963_readStauteOfYieJin()/*reentrant*/
{
 return  XBYTE[T6963_CtrOfYieJin];
}

/*判断指令读写状态和数据读写状态*/
void T6963_judge(UNCHAR mode)/*reentrant*/
{
 UNCHAR temp = 0;
 while (temp != mode)
 {
  temp = T6963_readStauteOfYieJin();
  temp = temp & mode;
 }
}

/*写入一个数据或命令参数*/
//要求片选LCDCE=0,CD=0
void T6963_writeAData(UNCHAR   data1)/*reentrant*/
{
 XBYTE[T6963_DataPortOfYieJin] = data1;
}

/*写入一个命令*/
//判断S1S0状态,指令代码写入指令通道
void T6963_writeACom(UNCHAR command)  /*reentrant*/
{
 T6963_judge(ComAndData); /*循环读取STATUS直至等于ComAndData(03h)*/
 XBYTE[T6963_CtrOfYieJin] = command;
 T6963_judge(ComAndData); /*循环读取STATUS直至等于ComAndData(03h)*/
 XBYTE[T6963_CtrOfYieJin]=0x00;
}


/*设置显示模式cgrom&ram,或、异或等*/
//无参数,调用WriteACom,
//因此要判断S1S0状态,指令代码写入指令通道
void T6963_setDisplayMode(UNCHAR  displaymod)
{
 T6963_writeACom(displaymod);
}

/*设置显示开关*/
//无参数,调用WriteACom,
//因此要判断S1S0状态,指令代码写入指令通?
void T6963_setDisplayOn(UNCHAR  on)/*reentrant*/
{
 T6963_writeACom(on);
}


/*清除文本区*/
void T6963_clearText()
{
 UNCHAR address;
 UNINT i;
 /* <2005.5.24旧的代码>
 取出当前的文本区首址
 address=XBYTE[CurrentTextPoint+1];
 judge(ComAndData);
 writeAData(address);
 address=XBYTE[CurrentTextPoint];
 judge(ComAndData);
 writeAData(address);
 writeACom(SetAddressInVRam);
 */
 /*暂时关闭显示*/
// T6963_setDisplayOn(CloseAll);//CloseAll=0x90,关闭一切显示
 /*取出当前的文本区首址*/
 address = (UNCHAR) CurrentTextPoint;
 T6963_judge(ComAndData);
 //写入参数1,指针低字节
 T6963_writeAData(address);
 address = CurrentTextPoint / 256;
 T6963_judge(ComAndData);
 //写入参数2,指针高字节
 T6963_writeAData(address);

 /*地址指针设置*/
 T6963_writeACom(SetAddressInVRam);//SetAddressInVRam=0x24

 /*设置自动写*/
 T6963_writeACom(AutoWrite);
 for (i = 0; i < 0x13e0; i++)
 {
  T6963_judge(jAutoWrite);//0x08 判断STA3(数据自动写状态)
  T6963_writeAData(0x23);
 }
 /*关闭自动写*/
 T6963_writeACom(EndAuto);//0xb2,自动读写结束
 /*开启显示*/
 T6963_setDisplayOn(TextMode | GraphMode | CurFlash | CurOn);
}

/*清除图形区*/
void T6963_clearGraph()
{
 UNCHAR address;
 UNINT i;

 /*暂时关闭显示*/
 T6963_setDisplayOn(GraphMode);//CloseAll);
 /*取出当前的图形区首地址*/

 address = (UNCHAR) CurrentGraphPoint;
 T6963_judge(ComAndData);
 T6963_writeAData(address);
 address = (CurrentGraphPoint / 256);
 T6963_judge(ComAndData);
 T6963_writeAData(address);
 T6963_writeACom(SetAddressInVRam); //0x24 地址指针设置

 /*设置自动写*/
 T6963_writeACom(AutoWrite);
 for (i = 0; i < 0x0fe0;i++)//0x0400; i++) //0x0f00
 {
  T6963_judge(jAutoWrite);//0x08 判断STA3(数据自动写状态)
  T6963_writeAData(0x00);
 }
 /*关闭自动写*/
 T6963_writeACom(EndAuto);//0xb2,自动读写结束
 /*开启显示*/
 T6963_setDisplayOn(TextMode | GraphMode | CurFlash | CurOn | CloseAll);//即0x9F,启用所有显示
}

/*设置文本首地址*/
void T6963_setTextHead(UNINT  address)
{
 UNCHAR temp;
 /*低8位*/
 temp = (UNCHAR) (address & 0x00ff);
 T6963_judge(ComAndData);
 T6963_writeAData(temp);
 /*高8位*/
 temp = (UNCHAR) ((address & 0xff00) >> 8);
 T6963_judge(ComAndData);
 T6963_writeAData(temp);
 /*设置命令*/
 T6963_writeACom(SetTextHeadAddress);//0x40 文本区首址
 /*设置当前的指针*/
 CurrentPoint = address;
}

/*设置文本的宽度*/
void T6963_setTextWidth(UNCHAR width)
{
 T6963_judge(ComAndData);
 T6963_writeAData(width); //写入参数D1,字节数
 T6963_judge(ComAndData);
 T6963_writeAData(0);  //写入参数D2,0x00
 T6963_writeACom(SetTextWidth);  //0x41 文本区的宽度
}

/*设置图形的首址*/
void T6963_setGraphHead(UNINT  address)
{
 UNCHAR temp;
 /*低8位*/
 T6963_judge(ComAndData);
 temp = (UNCHAR) (address & 0x00ff);/*取整型数低8位*/
 T6963_writeAData(temp);
 /*高8位*/
 T6963_judge(ComAndData);
 temp = (UNCHAR) ((address & 0xff00) >> 8);
 T6963_writeAData(temp);

 T6963_writeACom(SetGraphHead); //0x42 图形区首址
 CurrentPoint = address;
}


/*设置图形的宽度*/
void T6963_setGraphWidth(UNCHAR width)
{
 T6963_judge(ComAndData);
 T6963_writeAData(width); //写入参数D1,字节数
 T6963_judge(ComAndData);
 T6963_writeAData(0);  //写入参数D2,0x00
 T6963_writeACom(SetGraphWidth); //0x43 图形区的宽度
}

/*设置光标,mode 是宽度*/
void T6963_setCuro(UNCHAR  mode)
{
 UNCHAR mod;
 mod = (CurMode | (mode & 0x0f));//CurMode=0xa0光标形状8点(列)*N行,N值0-7H
 T6963_writeACom(mod);
}

/*选择三屏缓冲区之一*/
void T6963_selectDisplay(UNINT textAdd, UNINT graphAdd)/*参数可简化*/
{
 /*保存要显示的区*/
 /*<2005.5.24旧的代码>
 *((UNINT xdata*)CurrentTextPoint)=textAdd;
 *((UNINT xdata*)CurrentGraphPoint)=graphAdd;
 */
 CurrentTextPoint = textAdd;
 CurrentGraphPoint = graphAdd;
 /*设置文本的手地址*/
 T6963_setTextHead(textAdd);  //设置文本首地址
 T6963_setGraphHead(graphAdd); //设置图形的首址
 /*设置文本的宽度*/
 T6963_setTextWidth(30);    //setTextWidth(30);
 T6963_setGraphWidth(30);
}


/*设置显存的当前显示地址*/
void T6963_setCurrentPoint(UNINT address)/*reentrant*/
{
 UNCHAR temp;
 //低字节
 temp = (UNCHAR) (address & 0x00ff);
 T6963_judge(ComAndData);
 T6963_writeAData(temp);
 //高字节
 temp = (UNCHAR) ((address & 0xff00) >> 8);
 T6963_judge(ComAndData);
 T6963_writeAData(temp);

 T6963_writeACom(SetAddressInVRam); // 0x24 地址指针设置
 CurrentPoint = address;
}

/*在文本区定位坐标为x,y的位置*/
//??????????????????????????????????????????????????
void T6963_gotoxy(UNCHAR x, UNCHAR y)/*reentrant*/
{
 UNINT off;  /*偏移量*/
 /*<2005.5.24旧的代码>
 off=*((UNINT xdata *)CurrentTextPoint);
 */
 off = CurrentTextPoint;
 /*如果用XWORD[CurrentTextPoint]注意2倍关系;*/
 off += y * 30;//16;   //y*30,是因为128*64,其中的128=16*8,还是左右四位
 off += x;
 T6963_setCurrentPoint(off);//设置显存的当前显示地址
}


/*显示一个8x8字符*/
void T6963_putChar8(UNCHAR ch, bit flag)/*reentrant*/
{
 UNCHAR temp;
 /*为避开显示嵌套,定时器0中断*/
 temp = ch - 0x20;
 T6963_judge(ComAndData);
 if (flag)
  ch = ~ch;
 T6963_writeAData(temp);
 T6963_writeACom(WriteAdd1); /*数据写,地址加1*/
 CurrentPoint++;   /*跟踪当前vram位置*/

 //setCurrentPoint(CurrentPoint); /*应该可以去掉这行*/
}

/*图形区定位x,y的缓存位置*/
void T6963_moveto(UNCHAR  x, UNCHAR  y)
{
 UNINT off;
 /*<2005.5.24旧的代码
 off=*((UNINT xdata *)CurrentGraphPoint);
 >*/
 off = CurrentGraphPoint;
 off += y * 30;//16;   //y*30
 off += x;
 T6963_setCurrentPoint(off);
}

/*显示一个汉字,ch为编号 flag为1时,反显*/
void T6963_putChar16(UNCHAR ch, bit flag)
{
 UNINT offInHZK;
 UNCHAR i = 0;

 /*计算汉字在汉字库的位置*/
 offInHZK = (ch - 1) * 32;
 offInHZK = offInHZK + 0x02000;//0d000
 //注意起始地址与 字库.ASM的起始地址CSEG AT 0d000h 要求一致
 while (i < 16)
 {
  ch = CBYTE[offInHZK++];
  T6963_judge(ComAndData);
  if (flag)
   ch = ~ch;
  T6963_writeAData(ch);
  T6963_writeACom(WriteAdd1);
  /*同行下一点*/
  ch = CBYTE[offInHZK++];
  T6963_judge(ComAndData);
  if (flag)
   ch = ~ch;
  T6963_writeAData(ch);
  T6963_writeACom(WriteAdd1);
  /*下一行*/
  CurrentPoint +=30;// 16;    //30
  T6963_setCurrentPoint(CurrentPoint);
  i++;
 }
 CurrentPoint -= 16 *30;//  16;  //30
 CurrentPoint += 2;
 T6963_setCurrentPoint(CurrentPoint);
}

/*显示一个8x12的字符,ch为编号*/
void T6963_putChar12(UNCHAR ch, bit flag)
{
 UNINT offInHZK;
 UNCHAR i = 0;

 /*计算12×8字符在字库的位置*/
 offInHZK = (ch - 0x20) * 16;
 offInHZK = offInHZK + 0x4000;
 while (i < 16)
 {
  ch = CBYTE[offInHZK++];
  T6963_judge(ComAndData);
  if (flag)
   ch = ~ch;
  T6963_writeAData(ch);
  T6963_writeACom(WriteAdd1);
  /*下一行*/
  CurrentPoint += 30;// 16;  //30
  T6963_setCurrentPoint(CurrentPoint);
  i++;
 }
 CurrentPoint -= 16 * 30;// 16; //30
 CurrentPoint++;
 T6963_setCurrentPoint(CurrentPoint);
}

/*设置光标的位置*/
void T6963_setCurPoint(UNCHAR x, UNCHAR y)
{
 T6963_judge(ComAndData);
 T6963_writeAData(x);
 T6963_judge(ComAndData);
 T6963_writeAData(y);
 T6963_writeACom(SetCurPoint);
}

/*  PUTCHAR.C:  This routine is the general character output of C-51.  */
void putchar(unsigned char ch)
{
 UNCHAR temp;
 UNINT offInHZK, start_xy;

 switch (CharType & 0x07)
 {
 case  1:
  /* 显示8x16的字符*/
  /*计算在汉字库的位置*/
  offInHZK = (ch - 0x20) * 16;
  offInHZK = offInHZK + 0x4000;
  temp = 0;
  while (temp < 16)
  {
   ch = CBYTE[offInHZK];
   offInHZK++;
   T6963_judge(jData);
   if ((CharType & 0x80) == 0x80)
    ch = ~ch;
   T6963_writeAData(ch);
   T6963_writeACom(WriteAdd1);
   /*下一行*/
   CurrentPoint += 30;// 16;     //30;
   T6963_setCurrentPoint(CurrentPoint);
   temp++;
  }
  CurrentPoint -= 16 * 30;// 16;  //30
  CurrentPoint++;
  T6963_setCurrentPoint(CurrentPoint);
  break;
 case  2:
  /*显示16x16的汉字*/
  /*计算汉字在汉字库的位子*/
  offInHZK = (ch - 1) * 32;
  offInHZK = offInHZK + 0x2000;
  temp = 0;
  while (temp < 16)
  {
   ch = CBYTE[offInHZK];
   offInHZK++;
   T6963_judge(jData);
   if ((CharType & 0x80) == 0x80)
    ch = ~ch;
   T6963_writeAData(ch);
   T6963_writeACom(WriteAdd1);
   /*下一走标点*/
   ch = CBYTE[offInHZK];
   offInHZK++;
   T6963_judge(jData);
   if ((CharType & 0x80) == 0x80)
    ch = ~ch;
   T6963_writeAData(ch);
   T6963_writeACom(WriteAdd1);
   /*下一行*/
   CurrentPoint += 30;// 16;  //30;
   T6963_setCurrentPoint(CurrentPoint);
   temp++;
  }
  CurrentPoint -= 16 *30;//  16;  //30
  CurrentPoint += 2;
  T6963_setCurrentPoint(CurrentPoint);
  break;
 case   0:
  /*显示8x8的字符*/
  temp = ch - 0x20;
  T6963_judge(jData);
  if ((CharType & 0x80) == 0x80)
   ch = ~ch;
  T6963_writeAData(temp);
  T6963_writeACom(WriteAdd1);
  CurrentPoint++;
  T6963_setCurrentPoint(CurrentPoint);
  break;
 case   3:
  //显示12*24点阵ASCII码
  start_xy = CurrentPoint;
  offInHZK = (ch - 0x20) * 48;
  for (temp = 0; temp < 24; temp++)
  {
   T6963_judge(jData);
   T6963_writeAData(chardot[offInHZK++]);
   T6963_writeACom(WriteAdd1);
   T6963_judge(jData);
   T6963_writeAData(chardot[offInHZK++]);
   T6963_writeACom(WriteAdd1);
   CurrentPoint += 30;// 16;---------
   T6963_setCurrentPoint(CurrentPoint);
  }
  CurrentPoint = start_xy + 2;
  T6963_setCurrentPoint(CurrentPoint);
  break;
 case  4:
  //2005-05-30早上16*12汉字
  /*计算汉字在汉字库的位子*/
  offInHZK = (ch - 1) * 32;
  offInHZK = offInHZK + 0x3000;
  temp = 0;
  while (temp < 12)
  {
   ch = CBYTE[offInHZK];
   offInHZK++;

   T6963_judge(jData);
   if ((CharType & 0x80) == 0x80)
    ch = ~ch;
   T6963_writeAData(ch);
   T6963_writeACom(WriteAdd1);
   /*下一走标点*/
   ch = CBYTE[offInHZK];
   offInHZK++;

   T6963_judge(jData);
   if ((CharType & 0x80) == 0x80)
    ch = ~ch;
   T6963_writeAData(ch);
   T6963_writeACom(WriteAdd1);

   /*下一行*/
   CurrentPoint += 30;// 16;  //30;
   T6963_setCurrentPoint(CurrentPoint);
   temp++;
  }
  CurrentPoint -= 12*30;// 16;  //30
  CurrentPoint += 2;
  T6963_setCurrentPoint(CurrentPoint);
  break;
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -