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

📄 修改可以显示的液晶1602.txt

📁 本资源特色是代码的书写规范完整
💻 TXT
字号:
/******************************************************************
** 1602A液晶屏驱动程序
** 晶 振  频 率:11.0592M
** 线路->单片机实验开发板A    时序有问题
******************************************************************/
    #include<reg51.h>  
    #define uchar unsigned char
    #define uint unsigned int

    sbit LCM_E=P3^5;  //定义接口
    sbit LCM_RW=P3^6; //读写选择端口
    sbit LCM_RS=P3^7; //数据/命令选择端口

    #define LCM_Data P1//数据接口

    void LCM_WriteData(uchar WDLCM);   
    void LCM_WriteCommand(uchar WCLCM,BuysC);
    uchar LCM_ReadData(void);
    uchar LCM_ReadStatus(void);
    void LCM_Init(void);
    void DisplayOneChar(uchar X, uchar Y, uchar DData);
    void DisplayListChar(uchar X, uchar Y, uchar code *DData);
    void Delay5Ms(void);
    void Delay400Ms(void);

    uchar code uctech[] = {"1602A"};
    uchar code net[] = {"www.52c51.com"};

    void main(void)
    {
        Delay400Ms(); //启动等待,等LCM讲入工作状态
        LCM_Init(); //LCM初始化
        Delay5Ms(); //延时片刻(可不要)
					
        DisplayListChar(6, 0, uctech);		  
        DisplayListChar(3, 1, net);
           
        LCM_ReadData();//测试用句无意义
        LCM_Data=255;
        while(1);
    }

/****************************1602A写数据函数**************************/
/*函数原型:void LCM_WriteData(uchar WDLCM)
/*函数功能:1602A写数据
/*输入参数:要写入的数据
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    void LCM_WriteData(uchar WDLCM)
    {
        LCM_ReadStatus(); //检测忙
        LCM_Data = WDLCM;
        LCM_RS = 1;
        LCM_RW = 0;
      //  LCM_E = 0; //若晶振速度太高可以在这后加小的延时
        LCM_E = 1; //延时
       // ;;;;
        LCM_E = 0;          //E为高电平,读数据,显示,
    }

/****************************1602A写指令函数**************************/
/*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
/*函数功能:1602A写指令
/*输入参数:要写入的指令
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    void LCM_WriteCommand(uchar WCLCM,BuysC) //BysC为0时忽略忙检测 BysC为自己设置,思想很好
    {
        if (BuysC) LCM_ReadStatus(); //根据需要检测忙
        LCM_Data = WCLCM;
        LCM_RS = 0;
        LCM_RW = 0;
       // LCM_E = 0;
        LCM_E = 1;
        LCM_E = 0;                  //下降沿开始执行指令
        Delay5Ms();                //应预留写指令执行的时间
    }

/****************************1602A读数据函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读数据
/*输入参数:无
/*输出参数:1602A返回的数据
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    uchar LCM_ReadData(void)
    {
        LCM_RS = 1;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;  
        return(LCM_Data);
    }

/****************************1602A读状态函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    uchar LCM_ReadStatus(void)
    {
        LCM_Data = 0xFF;//无什么特殊作用
        LCM_RS = 0;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;  // E需为高电平,高电平读操作
        while (LCM_Data & 0x80); //检测忙信号,不忙后结束检测,返回
        return(LCM_Data);
    }

/****************************1602A初始化函数**************************/
/*函数原型:void LCM_Init(void)
/*函数功能:1602A初始化
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    void LCM_Init(void)
    {
        LCM_Data = 0;  //P1置零,即接收输入端口置零
      ///  LCM_WriteCommand(0x38,0); //三次显示模式设置,不检测忙信号
        //Delay5Ms();
      ///  LCM_WriteCommand(0x38,0);
       // Delay5Ms();
      ///  LCM_WriteCommand(0x38,0);
       // Delay5Ms();

        LCM_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号
        LCM_WriteCommand(0x08,1); //关闭显示
        LCM_WriteCommand(0x01,1); //显示清屏
        LCM_WriteCommand(0x06,1); // 显示光标移动设置
        LCM_WriteCommand(0x0C,1); // 显示开关、光标开关及闪烁开关设置 C为1100B 即三个为 开、关、关   00001DCB
    }

/******************1602A按指定位置显示一个字符函数**********************/
/*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示的字符
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    void DisplayOneChar(uchar X, uchar Y, uchar DData)
    {
        Y &= 0x1;                  //***X,Y控制显示, X为数据地址指针,控制显示的位置  为数据地址指针*********
        X &= 0xF; //限制X不能大于15,Y不能大于1
        if (Y)  X |= 0x40; //当要显示第二行时地址码+0x40;/// 规定首行地址为00H~2FH,此行为40H~67H
        X |= 0x80; // 算出指令码   //80H+地址码为算出指令码,为数据指针地址
        LCM_WriteCommand(X, 0); //这里不检测忙信号,发送地址码
        LCM_WriteData(DData);
    }

/*******************1602A按指定位置显示一串字符函数*********************/
/*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示字符串的首地址
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    void DisplayListChar(uchar X, uchar Y, uchar code *DData)
    {
        uchar ListLength;      //X,Y控制字符显示的位置
        ListLength = 0;
        Y &= 0x1;
        X &= 0xF; //限制X不能大于15,Y不能大于1     16*2  0~15  X,0~1  Y 控制满足。。。。。
        while (DData[ListLength]>0x20) //若到达字串尾则退出
        {
            if (X <= 0xF) //X坐标应小于0xF
            {
                DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
                ListLength++;
                X++;
            }
        }
    }

/********************5ms延时函数************************/
/*函数原型:void Delay5Ms(void)
/*函数功能:5ms延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
    void Delay5Ms(void)
    {
        unsigned int TempCyc = 5552;
        while(TempCyc--);
    }

/********************400ms延时延时函数************************/
/*函数原型:void Delay400Ms(void)
/*函数功能:400ms延时延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/*建立时间:2005/11/14
/*作者:站长
/**********************************************************************/
void Delay400Ms(void)
{
uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
   TempCycB=7269;
   while(TempCycB--);
};
}

⌨️ 快捷键说明

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