您当前的位置:五五电子网电子知识单片机-工控设备51单片机汉字液晶12864子程序 正文
汉字液晶12864子程序

汉字液晶12864子程序

点击数:7409 次   录入时间:03-04 11:52:16   整理:http://www.55dianzi.com   51单片机
    }
}

/****************************************/
/* 画点    */
/****************************************/

void point(void)
 {
  Uchar x1,y1,x,y;
  x1=col;
  y1=row;
  row=y1>>3;  /*取Y方向分页地址 */
  Rddata();
  y=y1&0x07;  /*字节内位置计算 */
  x=0x01;
  x=x<<y;   /*移入所画点  */
  Wrdata(cbyte|x); /*画上屏幕  */
  col=x1;   /*恢复xy坐标  */
  row=y1;
 }

/****************************************/
/* 屏幕滚动定位   */
/****************************************/
void Rollscreen(Uchar x)
 {
  cbyte = DISPFIRST|x; /*定义显示起始行为x?*/
  WrcmdL(cbyte);
  WrcmdM(cbyte);
  WrcmdR(cbyte);
 }

/****************************************/
/* 一个字串的输出   */
/****************************************/
void Putstr(Uchar *puts,Uchar i)
 {
  Uchar j,X;
  for (j=0;j<i;j++)
  {
  X = puts[j];
   if (X&0x80)
    {
     Putcdot(X&0x7f); /*只保留低7位*/
    }
   else Putedot(X-0x20);  /*ascii码表从0x20开始*/
  }
 }

/****************************************/
/*   半角字符点阵码数据输出  */
/****************************************/
void Putedot(Uchar Order)
 {
 Uchar i,bakerx,bakery; /*共定义4个局部变量   */
 int x;   /*偏移量,字符量少的可以定义为UCHAR */
 bakerx = col;  /*暂存x,y坐标,已备下半个字符使用 */
 bakery = row;
 x=Order * 0x10;  /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
 for(i=0;i<8;i++)
  {
  cbyte = Ezk[x];    /*取点阵码,rom数组 */
  Wrdata(cbyte);    /*写输出一字节  */
  x++;
  col++;
  if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界换行*/
   if (row>7) row=0;  /*如果行越界,返回首行 */
  }     /*上半个字符输出结束 */

 col = bakerx;     /*列对齐  */
 row = bakery+1;     /*指向下半个字符行 */
/*下半个字符输出,8列 */
 for(i=0;i<8;i++)
  {
  cbyte = Ezk[x];    /*取点阵码  */
  Wrdata(cbyte);    /*写输出一字节  */
  x++;
  col++;
  if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
   if (row>7) row=1;  /*如果行越界,返回首行 */
  }     /*下半个字符输出结束 */
 row=bakery;
 }      /*整个字符输出结束 */


/****************************************/
/*  全角字符点阵码数据输出  */
/****************************************/
void Putcdot(Uchar Order)
 {
 Uchar i,bakerx,bakery;  /*共定义3个局部变量  */
 int x;    /*偏移量,字符量少的可以定义为UCHAR */
 bakerx = col;   /*暂存x,y坐标,已备下半个字符使用 */
 bakery = row;
 x=Order * 0x20;   /*每个字符32字节 */

/*上半个字符输出,16列 */
 for(i=0;i<16;i++)
  {
  Wrdata(Hzk[x]);    /*写输出一字节  */
  x++;
  col++;
  if (col==LCMLIMIT){ col=0;row++;row++;} /*下一列,如果列越界换行*/
   if (row>6) row=0;  /*如果行越界,返回首行 */
  }     /*上半个字符输出结束 */

/*下半个字符输出,16列 */
 col = bakerx;
 row = bakery+1;
 for(i=0;i<16;i++)    /*下半部分*/
  {
  Wrdata(Hzk[x]);
  x++;
  col++;
  if (col==LCMLIMIT){col=0;row++;row++;} /*下一列,如果列越界换行*/
   if (row>7) row=1;  /*如果行越界,返回首行 */
  }     /*下半个字符输出结束 */
 row = bakery;
 }      /*整个字符输出结束 */

/****************************************/
/* 清屏,全屏幕清零  */
/****************************************/
void Lcmcls( void )
 {
 for(row=0;row<8;row++)
     for(col=0;col<LCMLIMIT;col++) Wrdata(0);
 }

/****************************************/
/*  从液晶片上读数据,保留在全局变量中 */
/****************************************/

void Rddata(void)
 {
 Locatexy();  /*坐标定位,返回时保留分区状态不变 */
  Datalcm=0xFF;
  Dilcm = 1; /*数据*/
  Rwlcm = 1; /*读数据*/
  Elcm = 1; /*读入到LCM*/
  _nop_();
  cbyte = Datalcm; /*虚读一次 */
  Elcm = 0;
 Locatexy();  /*坐标定位,返回时保留分区状态不变 */
  Datalcm=0xFF;
  _nop_();
  Dilcm = 1; /*数据*/
  Rwlcm = 1; /*读数据*/
  Elcm = 1; /*读入到LCM*/
  _nop_();
  cbyte = Datalcm; /*从数据口读数据,真读 */
  Elcm = 0;
 }

/****************************************/
/* 数据写输出   */
/****************************************/

void Wrdata(Uchar X)
 {
 Locatexy();  /*坐标定位,返回时保留分区状态不变 */
// wtcom();
  Dilcm = 1; /*数据输出*/
  Rwlcm = 0; /*写输出  */
  Datalcm = X; /*数据输出到数据口 */
  Elcm = 1; /*读入到LCM*/
  _nop_();
  Elcm = 0;
 }

/****************************************/
/* 命令输出,每次输出一个分区控制口 */
/****************************************/

/*void Wrcmd(Uchar X)
// {
// Locatexy();  /*确定分区,返回时保留分区状态不变 */
// wtcom();  /*等待LCM操作允许 */
//  Dilcm = 0;   /*数据操作 */
//  Rwlcm = 0;   /*写输出   */
//  Datalcm = X;   /*数据输出到数据口 */
//  Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
// }

/********************************/
/* 命令输出到左区控制口  */
/********************************/

void WrcmdL(Uchar X)
 {
  lcdbusyL();  /*确定分区,返回时保留分区状态不变*/
  Dilcm = 0;   /*命令操作 */
  Rwlcm = 0;   /*写输出   */
  Datalcm = X;   /*数据输出到数据口 */
  Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
 }

/********************************/
/* 命令输出到中区控制口  */
/********************************/

void WrcmdM(Uchar X)
 {
  lcdbusyM();  /*确定分区,返回时保留分区状态不变*/
  Dilcm = 0;   /*命令操作 */
  Rwlcm = 0;   /*写输出   */
  Datalcm = X;   /*命令输出到数据口 */
  Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
 }

/********************************/
/* 命令输出到右区控制口  */
/********************************/

void WrcmdR(Uchar X)
 {
  lcdbusyR(); /*确定分区,返回时保留分区状态不变 */
  Dilcm = 0;   /*命令操作 */
  Rwlcm = 0;   /*写输出   */
  Datalcm = X;   /*命令输出到数据口 */
  Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
 }

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态  */
/********************************************************/
void lcdbusyL(void)
 {
        CS1LCM = 0;  /*CLR CS1  */

上一页  [1] [2] [3] [4] [5]  下一页


本文关键字:汉字  子程序  51单片机单片机-工控设备 - 51单片机