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

📄 t6963液晶驱动(5行汉字).c

📁 msp430芯片驱动T6963液晶的驱动程序
💻 C
字号:

#include "extern.h"
#include "fontlib.h"//显示字符库。
#include <stdarg.h>
#include <stdio.h>
// T6963C 命令定义
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80 // 显示方式:逻辑“或”
#define LC_MOD_XOR 0x81 // 显示方式:逻辑“异或”
#define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
#define LC_MOD_TCH 0x83 // 显示方式:文本特征
#define LC_DIS_SW 0x90 // 显示开关:D0=1/0:光标闪烁启用/禁用;
   // D1=1/0:光标显示启用/禁用;
   // D2=1/0:文本显示启用/禁用;
   // D3=1/0:图形显示启用/禁用;
#define LC_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
#define LC_AUT_WR 0xB0 // 自动写设置
#define LC_AUT_RD 0xB1 // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0 // 数据一次写,地址加1
#define LC_INC_RD 0xC1 // 数据一次读,地址加1
#define LC_DEC_WR 0xC2 // 数据一次写,地址减1
#define LC_DEC_RD 0xC3 // 数据一次读,地址减1
#define LC_NOC_WR 0xC4 // 数据一次写,地址不变
#define LC_NOC_RD 0xC5 // 数据一次读,地址不变
#define LC_SCN_RD 0xE0 // 屏读
#define LC_SCN_CP 0xE8 // 屏拷贝
#define LC_BIT_OP 0xF0 // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除

char gCurRow=0,gCurCol=0,revfonthead=0,revfontnum=0;

char busyRCMD(void)
{
  char cmd;
  D_PDIR=0x00;
  CD_1; CE_0; RD_0;
  cmd=D_PIN;
  RD_1; CE_1;
  D_PDIR=0xff;
  return(cmd);
}

void busyWCMD(char cmd)
{
  CD_1; CE_0;
  D_POUT=cmd;
  WR_0;WR_1;CE_1;
}

void busyWDAT(char data)
{
  CD_0;CE_0;
  D_POUT=data;
  WR_0;WR_1;CE_1;
}

char GetSTA(char n)
{
  char i;
  for(i=5;i>0;i--){ if((busyRCMD() & n) == n) break;}
  return i;
}

char WrCMD2(char uCmd,char uPar1,char uPar2)
{
  if ( GetSTA(0x03) == 0 ) return 1;
  busyWDAT(uPar1);
  if ( GetSTA(0x03) == 0 ) return 2;
  busyWDAT(uPar2);
  if ( GetSTA(0x03) == 0 ) return 3;
  busyWCMD(uCmd);
  return 0;
}

char WrCMD0(char uCmd)
{
  if( GetSTA(0x03) == 0 ) return 1;
  busyWCMD(uCmd);
  return 0;
}

char WrData(char uData)
{
  if(GetSTA(0x08) == 0)  return 1;
  busyWDAT(uData);
  return 0;
}
//****************设置光标(行0~63,列0~15)************************//
void SetPos(char urow, char ucol)
{
  unsigned int iPos;
  gCurRow = urow+(ucol/16)*16;
  gCurCol = ucol%16;
  iPos = gCurRow * 30 + gCurCol;
  WrCMD2(LC_ADD_POS,iPos & 0xFF,iPos / 256);
}
//****************清行(首行0~63,尾行0~15)*********************//
void ClrFromTo(char x0,char y0)
{
  int length,i;
  char x=x0,y=y0;
  length=y-x;
  length*=30;
  SetPos(x,0);
  WrCMD0(LC_AUT_WR);
  for(i=0;i<length;i++)
  {
  while(GetSTA(0x08)== 0);
  WrData(0x00);
  }
  WrCMD0(LC_AUT_OVR);
}
//**************** 清屏 *********************//
void Cls(void)
{
  ClrFromTo(0,64);
  WrCMD2(LC_ADD_POS,0x00,0x00);
  gCurRow = 0;
  gCurCol = 0;
}
//**************** T6963初始化 *********************//
char LcmInit(void)
{
  if(WrCMD2(LC_TXT_STP,0x00,0x00) != 0) return 0xff;
  WrCMD2(LC_TXT_WID,0x1E,0x00);
  WrCMD2(LC_GRH_STP,0x00,0x00);
  WrCMD2(LC_GRH_WID,0x1E,0x00);
  WrCMD0(LC_CUR_SHP | 0x01);
  WrCMD0(LC_MOD_OR);
  WrCMD0(LC_DIS_SW | 0x08);
  return 0;
}
//*********** 反显光标设置(反显字节相对当前光标首位置,反显字节个数) **********//
void RevPos(char head,char num){revfonthead=head;revfontnum=num;}

//**************** 文字显示 *********************//
// 通过RevPos设置反显文字
// 程序调用vsprintf(),显示符点数,prinf formatter 应设为large
// 仅用于显示1行数据。

void Dprintf(char disprow,char dispcol,char *fmt, ...)
{
  va_list arg_ptr;
  signed char c1,c2,stype[22],type;
  char tmpBuf[69];
  char const *pcstr[22];
  char i=0,j,k,uLen,byte;
  char temprevnum;

  va_start(arg_ptr, fmt);
  uLen = (char)vsprintf(tmpBuf, fmt, arg_ptr);
  va_end(arg_ptr);

  if(uLen>69)while(1);//error
  if(uLen>22)uLen=22;//overflow a line
  while(i<uLen)
  {
      c1 = tmpBuf[i];
      c2 = tmpBuf[i+1];
      stype[i]=c1;
      if(c1 >= 0)//字符
      {
          if(c1 < STARTNUM)pcstr[i] = ASC_MSK;
          else pcstr[i]=&ASC_MSK[(c1-STARTNUM)*12];
          i++;
      }
      else //汉字
      {
          pcstr[i]=ASC_MSK;
          pcstr[i+1]=ASC_MSK;
          stype[i+1]=0;
          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])
              {
                  pcstr[i]=GB_16[j].Msk;
                  pcstr[i+1]=pcstr[i]+12;
                  break;
              }
          }
          i+=2;
      }
  }
  for(i=0;i<ASC_CHR_HEIGHT;i++)
  {
      k=0;
      temprevnum=revfontnum;
      SetPos(disprow,dispcol);
      for(j=0;j<uLen;j++)
      {
          type=stype[j];
          byte=*pcstr[j]++;
          if( temprevnum && revfonthead <= j+1)
          {
              byte = ~byte;
              temprevnum--;
          }
          if(type)
		  {
              tmpBuf[k++]=byte & 0xC0; byte <<= 2;
              tmpBuf[k++]=byte & 0xC0; byte <<= 2;
              tmpBuf[k++]=byte & 0xC0; byte <<= 2;
              if(type<0)tmpBuf[k++]=byte & 0xC0;
          }
          else
          {
              tmpBuf[k++]=byte & 0xC0; byte <<= 2;
              tmpBuf[k++]=byte & 0xC0; byte <<= 2;
          }
      }
      j=k/4;if(k%4)j++;
      tmpBuf[k++]=0;tmpBuf[k++]=0;tmpBuf[k]=0;
      WrCMD0(LC_AUT_WR);
	  for(k=0;k<j;k++)
	  {
	      byte=tmpBuf[k*4]+tmpBuf[k*4+1]/4+tmpBuf[k*4+2]/16+tmpBuf[k*4+3]/64;
	      WrData(byte);
	  }
      WrCMD0(LC_AUT_OVR);
      disprow++;
  }
}

⌨️ 快捷键说明

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