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

📄 lcmtest.c

📁 液晶显示模块显示驱动测试程序
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCM_RW = P3^6; //定义引脚
sbit LCM_RS = P3^7;
sbit LCM_E  = P3^5;
sbit KEY  = P3^4;
#define LCM_Data P1
#define Busy 0x80 //用于检测LCM状态字中的Busy标识

void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,uchar BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y);
void DisplayListChar1(unsigned char X, unsigned char Y);
void Delay(unsigned short count);//void Delay(void);
void Delay400Ms(void);

unsigned char code cdle_net[] = {"BEIJINGMINGHANG"};
unsigned char code email[] = {"COPY ALL NET  "};

void main(void)
{
   Delay(400); //启动等待,等LCM讲入工作状态
    LCMInit(); //LCM初始化
    Delay(5); //延时片刻(可不要)

    DisplayListChar(0, 0);
    //while(1);
}

//写数据
void WriteDataLCM(unsigned char WDLCM)
{
    ReadStatusLCM(); //检测忙
    //LCM_Data = WDLCM;

    LCM_RS = 1;
    LCM_RW = 0;
     LCM_Data = WDLCM;
    Delay(5);
    LCM_E = 0; //若晶振速度太高可以在这后加小的延时
    Delay(2);
    LCM_E = 1;
   // Delay(5);
   // LCM_E = 0;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,uchar BuysC) //BuysC为0时忽略忙检测
{
    if (BuysC) ReadStatusLCM(); //根据需要检测忙
    //LCM_Data = WCLCM;
   // Delay(15);
    LCM_RS = 0;
    LCM_RW = 0;
    //Delay(5);
    LCM_Data = WCLCM;
    Delay(5);
    LCM_E = 0;
    Delay(2);
    LCM_E = 1;
    //Delay(5);
    //LCM_E = 0;
}

//读数据
unsigned char ReadDataLCM(void)
{
    LCM_Data = 0xFF;
    LCM_RS = 1;
    LCM_RW = 1;
    LCM_E = 0;
    LCM_E = 0;
    LCM_E = 1;
    return(LCM_Data);
}

//读状态
unsigned char ReadStatusLCM(void)
{
  do{
    //LCM_Data = 0xFF;
    Delay(5); //延时片刻
    LCM_RS=0;
    LCM_RW = 1;
    LCM_E = 0;
    LCM_E = 0;
   // Delay(2); //延时片刻
    LCM_E = 1;
    //LCM_E = 1;
   // LCM_E = 1;
   // Delay(1000); //延时片刻
   // LCM_E = 0;
   // Delay(5); //延时片刻
    }while (LCM_Data & Busy); //检测忙信号
    return(LCM_Data);
}

void LCMInit(void) //LCM初始化
{
    LCM_Data = 0;
    WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
    Delay(5);
    WriteCommandLCM(0x38,0);
    Delay(5);
    WriteCommandLCM(0x38,0);
    Delay(5);

    WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
    WriteCommandLCM(0x08,1); //关闭显示
    WriteCommandLCM(0x01,1); //显示清屏
    WriteCommandLCM(0x06,1); // 显示光标移动设置
    WriteCommandLCM(0x0C,1); // 显示开及光标设置
    WriteCommandLCM(0x0F,1); //显示清屏
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
    Y &= 0x1;
    X &= 0xF; //限制X不能大于15,Y不能大于1
    if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
    X |= 0x80; //算出指令码
    WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
    WriteDataLCM(DData);
       Delay(200);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y)
{
    unsigned char DData;
    DData=0x21;
    Y=0;
    X=0;

    //Y &= 0x1;
    //X &= 0xF; //限制X不能大于15,Y不能大于1
   while (1) //若到达字串尾则退出
    {
      // KEY=0
      if (  KEY )
       {
            if (X <= 0xF) //X坐标应小于0xF
                {
                    DisplayOneChar(X, Y, DData); //显示单个字符
                    X++;
                    DData++;
                    if (DData==0x80)
                        {
                          DData=0xa1;
                          }
                     if (DData==0x00)
                        {
                          DData=0x21;
                          }
                 }
             else if ((X > 0xF)&&(Y==0))
                 { X=0;
                   Y=1;
                 }
             else if ((X > 0xF)&&(Y==1))
                 {
                   WriteCommandLCM(0x01,1); //显示清屏
                   X=0;
                   Y=0;
                  }
          }
        else
        {
           WriteCommandLCM(0x01,1); //显示清屏
           DisplayListChar1(0, 0);

          }

    }

}
 void DisplayListChar1(unsigned char X, unsigned char Y)
{
    unsigned char DData;
    DData=0x21;
    Y=0;
    X=0;

    //Y &= 0x1;
    //X &= 0xF; //限制X不能大于15,Y不能大于1
   while (1) //若到达字串尾则退出
    {


            if (X <= 0xF) //X坐标应小于0xF
                {
                    DisplayOneChar(X, Y, DData); //显示单个字符
                    X++;
                    DData++;
                     if (DData==0x80)
                        {
                          DData=0xa1;
                          }
                     if (DData==0x00)
                        {
                          DData=0x21;
                          }
                 }
             else if ((X > 0xF)&&(Y==0))
                 { X=0;
                   Y=1;
                 }
             else if ((X > 0xF)&&(Y==1))
                 {
                    while (!KEY)
                   {WriteCommandLCM(0x01,1); //显示清屏
                   X=0;
                   Y=0;
                    }

                  }

         }


}



//延时
void Delay(unsigned short count)
{
  signed char i;

  while(--count != 0)
    {
     for(i = 0; i < 125; i++);                // ";" 表示空语句,CPU空转。
   }                                // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}


⌨️ 快捷键说明

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