📄 lcd1602.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 + -