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

📄 lcd1602.c

📁 <B>嵌入式操作系统SMALL RTOS51 的例程, 运行于UV2运用WAVE的6000进行仿真</B>
💻 C
字号:
/*********************************************************************************************************
**                                             Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2002, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.12.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: lcd1602.c
**创   建   人: 陈明计
**最后修改日期: 2003年4月27日
**描       述: DP-51的液晶TC1602A的驱动程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 修改人: 陈明计
** 版  本: V1.0
** 日 期: 2003年4月27日
** 描 述: 原始版本,应用于Small RTOS 51 v1.12.1
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define IN_LCD17602
#include  "config.h"

/*********************************************************************************************************
** 函数名称: Lcd1602Delay
** 功能描述: 等待lcd操作完毕
**
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void  Lcd1602Delay(void)
{
    uint8 i;

    i = 100;
    do
    {
        if ((LCD1602_GET_FLAG() & 0x80) == 0)
        {
            break;
        }
    } while (--i != 0);
}


/*********************************************************************************************************
** 函数名称: Lcd1602SendComm()
** 功能描述: 向lcd模块发送命令
**
** 输 入: Command: 给lcd模块发送的命令
** 输 出: 无
** 全局变量: 无
** 调用模块: Lcd1602Delay()
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

        void  Lcd1602SendComm(uint8 Command)
{
    Lcd1602Delay();
    LCD1602_SEND_COMMAND(Command);
}

/*********************************************************************************************************
** 函数名称: Lcd1602SendDate()
** 功能描述: 向lcd模块发送1字节数据
**
** 输 入: Data: 给lcd模块发送的命令
** 输 出: 无
** 全局变量: 无
** 调用模块: Lcd1602Delay()
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

        void  Lcd1602SendDate(uint8 Data)
{
    Lcd1602Delay();
    LCD1602_SEND_DATA(Data);
}

/*********************************************************************************************************
** 函数名称: Lcd1602DispStr()
** 功能描述: 在lcd指定位置显示一个字符串,此函数可以自动换行。
**
** 输 入: x,y : 显示的开始坐(作上角为(1,1))
**         Data: 将要显示的字符串
** 输 出: 无
** 全局变量: 无
** 调用模块: Lcd1602SendComm(),Lcd1602SendDate()
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void  Lcd1602DispStr(uint8 x, uint8 y, char *Data)
{
    if (y == 1)                                                 /* 在第一行显示 */
    {
        if (x < (16 + 1))                                       /* 有效的列号   */
        {
            Lcd1602SendComm(LCD1602_LINE1 - 1 + x);             /* 设置显示地址 */
            for( ; x < (16 + 1) && *Data != '\0'; x++)          /* 显示到字符串结束 */
                                                                /* 或是行结束   */
            {
                Lcd1602SendDate(*Data++);                       /* 显示一个字符 */
            }
            if (*Data != '\0')                                  /* 字符串没有结束 */
            {
                x = 1;                                          /* 从第二行第一列 */
                y = 2;                                          /* 继续显示       */
            }
        }
    }
    if (y == 2)                                                 /* 在第二行显示 */
    {
        Lcd1602SendComm(LCD1602_LINE2 - 1 + x);                 /* 设置显示地址 */
        for( ; x < (16 + 1) && *Data != '\0'; x++)              /* 显示到字符串结束 */
                                                                /* 或是行结束   */
        {
            Lcd1602SendDate(*Data++);                           /* 显示一个字符 */
        }
    }
}

/*********************************************************************************************************
** 函数名称: Lcd1602Clr()
** 功能描述: 清除lcd的指定行
**
** 输 入: y : 清除的行号(最上方为1)
** 
** 输 出: 无
** 全局变量: 无
** 调用模块: Lcd1602DispStr()
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

        void Lcd1602Clr(uint8 y)
{
    uint8 i;
    
    i = 0;  
    if (y == 1)
    {
        Lcd1602SendComm(LCD1602_LINE1);
        i = 16;
    }
    else if (y == 2)
    {
        Lcd1602SendComm(LCD1602_LINE2);
        i = 16;
    }
    if (i != 0)
    {
        do
        {
            Lcd1602SendDate(' ');
        } while (--i != 0);
    }
}

/*********************************************************************************************************
** 函数名称: Lcd1602Init()
** 功能描述: lcd初始化
**
** 输 入: 无
** 
** 输 出: 无
** 全局变量: 无
** 调用模块: Lcd1602SendComm(),Lcd1602Clr()
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

        void  Lcd1602Init(void)
{
    Lcd1602SendComm(LCD1602_MODE);          // 设置LCM模式(系统方式设置)
    Lcd1602SendComm(LCD1602_NO_FLASH);      // 打开LCM显示,无光标
    Lcd1602SendComm(LCD1602_NO_SHIFT);      // 字符向地址递增,光标移动
    Lcd1602SendComm(LCD1602_SH);            // 重新设为光标移动,向右移
    Lcd1602Clr(1);                          // 清屏
    Lcd1602Clr(2);
}

/*********************************************************************************************************
** 函数名称: Lcd1602LoadC()
** 功能描述: 从lcd指定地址处写多个字节数据
**
** 输 入: Addr : 指定的地址
**         Data : 将要写入的数据开始地址
**         NChar: 写入的直接数
** 输 出: 无
** 全局变量: 无
** 调用模块: Lcd1602SendComm(),Lcd1602SendDate()
**
** 作 者: 陈明计
** 日 期: 2003年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void  Lcd1602LoadC(uint8 Addr, uint8 *Data, uint8 NChar)
{
    Lcd1602SendComm(Addr | 0x80);               // 设置地址
    do
    {
        Lcd1602SendDate(*Data++);
    } while (--NChar != 0);
}
/**********************end****************************************/

⌨️ 快捷键说明

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