当前位置: 首页 > 技术资料 > 解析液晶显示源程序代码

解析液晶显示源程序代码

QooIC.com 新闻出处:电子市场 | 发布时间:2011/5/19 14:15:11

 


  **************************************************


  *yj.c


  *连线图:


  * DB0---DPROT.0 DB4---DPROT.4 RS-------------P2.5


  * DB1---DPROT.1 DB5---DPROT.5 RW-------------P2.6


  * DB2---DPROT.2 DB6---DPROT.6 E--------------P2.7


  * DB3---DPROT.3 DB7---DPROT.7 VLCD接10K可调电阻到GND*


  *80C51的晶振频率为12MHz


  *液晶显示程序


  ***************************************************/


  #include "reg51.h"


  #include


  #include


  #define DPORT P0


  #define uchar unsigned char


  sbit RS = P2^5;


  sbit RW = P2^6;


  sbit E = P2^7;


  uchar Xpos; //列方向地址指针


  uchar Ypos; //行方向地址指针


  #define NoDisp 0


  #define NoCur 1


  #define CurNoFlash 2


  #define CurFlash 3


  /*延时程序


  由Delay参数确定延迟时间


  */


  void LcdWcn(uchar);


  void LcdWc(uchar);


  void WriteChar(uchar);


  void LcdPos();


  void LcdWd(uchar);


  void LcdWdn(uchar);


  void mDelay(unsigned int Delay)


  { unsigned int i;


  for(;Delay>0;Delay--)


  { for(i=0;i<124;i++)


  {;}


  }


  }


  /*光标设置命令


  Cur 为设定光标参数


  */


  void SetCur(uchar Cur)


  { switch(Cur)


  { case 0x0:


  { LcdWc(0x08); //关显示


  break;


  }


  case 0x1:


  { LcdWc(0x0c); //开显示但无光标


  break;


  }


  case 0x2:


  { LcdWc(0x0e); //开显示有光标但不闪烁


  break;


  }


  case 0x3:


  { LcdWc(0x0f); //开显示有光标且闪烁


  break;


  }


  default: break;


  }


  }


  /*清屏命令


  */


  void ClrLcd()


  { LcdWc(0x01);


  }


  /*在指定的行与列显示


  */


  void WriteChar(uchar c)


  { LcdPos();


  LcdWd(c);


  }


  /*正常读写操作之前检测LCD控制器


  */


  void WaitIdle()


  { uchar tmp;


  DPORT=0xff;


  RS=0;


  RW=1;


  E=1;


  _nop_();


  for(;;)


  { tmp=DPORT;


  tmp&=0x80;


  if(tmp==0)


  break;


  }


  E=0;


  }


  /*不检测忙的写字符子程序


  */


  void LcdWdn(uchar c)


  {


  RS=1;


  RW=0;


  DPORT=c; //写入待写字符


  E=1;


  _nop_();


  E=0;


  }


  /*带忙检测的写字符子程序


  */


  void LcdWd(uchar c)


  { WaitIdle();


  LcdWdn(c);


  }


  /*检测忙信号的送控制字子程序*/


  void LcdWcn(uchar c)


  { RS=0;


  RW=0;


  DPORT=c;


  E=1;


  _nop_();


  E=0;


  }


  /*检测忙信号的送控制字子程序*/


  void LcdWc(uchar c)


  { WaitIdle();


  LcdWcn(c);


  }


  void LcdPos()


  { uchar tmp;


  Xpos&=0x0f; //16xx型液晶的范围是0~15


  Ypos&=0x01; //Y的范围是0~1


  tmp=Xpos;


  if(Ypos==1)


  { tmp+=0x40;


  }


  tmp|=0x80;


  LcdWc(tmp);


  }


  /*LCD的复位程序


  */


  void RstLcd()


  { mDelay(15); //延时15ms


  LcdWcn(0x38);


  mDelay(5);


  LcdWcn(0x38);


  mDelay(5);


  LcdWcn(0x38);


  LcdWc(0x38);


  LcdWc(0x08);


  LcdWc(0x01);


  LcdWc(0x06);


  LcdWc(0x0c);


  }


  void WriteString(char s[])


  { uchar pS=0;


  for(;;)


  { WriteChar(s[pS]);


  pS++;


  if(s[pS]==0)


  break;


  if(++Xpos>=15) //每行最多显示16个字符


  break;


  }


  }


  void main()


  { uchar s1[]="Hellow World!";


  RstLcd(); //复位LCD


  ClrLcd();


  SetCur(CurFlash); //光标显示且闪烁


  Xpos=2;


  Ypos=1;


  WriteString(s1);


  for(;;)


  {;}


  }