微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > lcd1602能显示汉字吗_lcd1602显示汉字程序

lcd1602能显示汉字吗_lcd1602显示汉字程序

时间:09-19 来源:互联网 点击:

起始地址,data_out()的作用是将hanzi[]数组中的16 进制数据发送出去,每一个16进制数字对应之5*7点阵上的每一行内容。第1行第1个字 符需要8个16进制数据,第1行第2个字符处也需要816进制数据。还有第2行的两个字 符点阵,这样显示一个汉字需要32个16进制数据。

  下面列举一个实例(proteus仿真通过)

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

  硬件连接:1602VDD接5V,VO接地,BL1接5V,BL2接地,8根数据线接P0口,RS RW E分别接P2.0、P2.1、P.4口

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

  #include 《reg52.h》

  #include 《string.h》

  #define Busy 0x80 //用于检测LCM状态字中的Busy标识

  #define LCM_Data P0 ;

  sbit LCM_RS=P2^0; //寄存器选择

  sbit LCM_RW=P2^1; //读/写控制

  sbit LCM_E=P2^4; //读/写使能

  int i,j;

  //自定义字符列表 //

  =====================================================================================

  unsigned char character0[8] = {0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02}, //年

  character1[8] = {0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11}, //月

  character2[8] = {0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f}, //日

  characterN[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //日

  //==========================================================

  //=========================================================

  //延时程序

  //=======================================================

  void Delay5Ms(void)

  {

  unsigned long int TempCyc = 5552;

  while(TempCyc--);

  }

  void Delay400Ms(void)

  {

  unsigned char TempCycA = 5;

  unsigned int TempCycB;

  while(TempCycA--)

     {

  TempCycB=7269;

  while(TempCycB--);

     };

  }

  //===================================================================

  //读写子程序

  //=================================================================

  //读数据

  unsigned char ReadDataLCM(void)

  {

  LCM_RS = 1;

  LCM_RW = 1;

  LCM_E = 1;

  LCM_E = 0;

  for(i=0;i《100;i++);

  LCM_E = 1;

  return(LCM_Data);

  }

  //读状态

  unsigned char ReadStatusLCM(void)

  {

  LCM_Data = 0xFF;

  LCM_RS = 0;

  LCM_RW = 1;

  LCM_E = 1;

  LCM_E = 0;

  for(i=0;i《100;i++);

  LCM_E = 1;

  //while (LCM_Data & Busy); //检测忙信号

  return(LCM_Data);

  }

  //写数据

  void WriteDataLCM(unsigned char WDLCM)

  {

  ReadStatusLCM(); //检测忙

  LCM_Data = WDLCM;

  LCM_RS = 1;

  LCM_RW = 0;

  LCM_E = 1;

  LCM_E = 0; //若晶振速度太高可以在这后加小的延时

  for(i=0;i《100;i++);//延时

  LCM_E = 1;

  }

  //写指令

  void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测

  {

  if (BuysC) ReadStatusLCM(); //根据需要检测忙

  LCM_Data = WCLCM;

  LCM_RS = 0;

  LCM_RW = 0;

  LCM_E = 1;

  LCM_E = 0;

  for(i=0;i《100;i++);

  LCM_E = 1;

  }

  //===========================================================

  //初始化子程序

  //===================================================================

  void LCMInit(void) //LCM初始化

  {

  LCM_Data = 0;

  WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号

  Delay5Ms();

  WriteCommandLCM(0x38,0);

  Delay5Ms();

  WriteCommandLCM(0x38,0);

  Delay5Ms();

  WriteCommandLCM(0x38,1); // 显示模式设置,开始要求每次检测忙信号

  Delay5Ms();

  WriteCommandLCM(0x08,1); // 关闭显示

  Delay5Ms();

  WriteCommandLCM(0x01,1); // 清屏 Delay5Ms();

  WriteCommandLCM(0x06,1); // 显示光标移动设置

  Delay5Ms();

  WriteCommandLCM(0x0c,1); // 显示开及光标设置

  Delay5Ms();

  }

  //================================================================

  //按指定位置显示一个字符

//=======================

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top