lcddriv.c
来自「16x2字符型液晶显示器驱动程序C语言原代码 实验过,绝对能用」· C语言 代码 · 共 422 行
C
422 行
/*
*********************************************************************************************************
* LCD
* LCD Driver And Display
*
* (c) Copyright 2005, Zou Jiahao, , Huizhou, Guangdong
* All Rights Reserved
*
* V1.0.0
*
*--------------文件信息--------------------------------------------------------------------------------
* 文 件 名: LCDDriv.c
* 创 建 人: 邹家浩
* 最后修改日期: 2005年8月31日
* 描 述: LCD驱动程序
*
*--------------历史版本信息----------------------------------------------------------------------------
* 创建人: 邹家浩
* 版 本: V1.0.0
* 日 期: 2005年8月31日
* 描 述: 原始版本
*
*------------------------------------------------------------------------------------------------------
* 修改人:
* 版 本:
* 日 期:
* 描 述:
*
*------------------------------------------------------------------------------------------------------
* 修改人:
* 版 本:
* 日 期:
* 描 述:
*
*--------------当前版本修订-----------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期: 2005年8月31日
* 描 述: 原始版本
*
*------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include "System.h"
#include "LCDDriv.h"
/*********************************************************************************************************
* 函数名称: LCDInit
* 功能描述: LCD初始化
* 输入参数: 无
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCDInit (void)
{
TimeDelayMS (10); //上电后等待10ms
LCDWriteCmd (0x38); //设置工作方式:8位总线,字符行数2行,5*8点阵
TimeDelayMS (5); //等待4.1ms以上
LCDWriteCmd (0x38); //设置工作方式:8位总线,字符行数2行,5*8点阵
//TimeDelayMS (5);
TimeDelayOn10US (11); //等待100us以上
LCDWriteCmd (0x38); //设置工作方式:8位总线,字符行数2行,5*8点阵
TimeDelayMS (5);
LCDWriteCmd (0x38); //设置工作方式:8位总线,字符行数2行,5*8点阵
LCDWriteCmd( 0x0C); //设置显示状态:关显示
LCDWriteCmd (0x01); //清屏
LCDWriteCmd(0x06); //设置输入方式:光标右移,画面不动
}
/*********************************************************************************************************
* 函数名称: LCDReadDB
* 功能描述: 从LCD数据总线读取数据
* 输入参数: 无
*
* 返 回 值: 在数据总线的值
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT8U LCDReadDB (void)
{
return (LCD_DB);
}
/*********************************************************************************************************
* 函数名称: LCDWriteDB
* 功能描述: 向LCD数据总线写数据
* 输入参数: 欲向数据总线写入的数据
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCDWriteDB (INT8U ch)
{
LCD_DB = ch;
}
/*********************************************************************************************************
* 函数名称: LCDReadBF
* 功能描述: 读忙标志,直到忙标志为0
* 输入参数: 无
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCDReadBF (void)
{
INT8U c = 0;
while (1)
{
LCD_LINE_E_VOL_DOWN(); // E = 0
NOP();
LCD_LINE_RS_VOL_DOWN(); // RS = 0
NOP();
LCD_LINE_RW_VOL_UP(); // RW = 1,为读取数据模式
NOP();
LCD_LINE_E_VOL_UP(); // E = 1
NOP();
NOP();
c = LCDReadDB(); //读取数据
NOP();
NOP();
LCD_LINE_E_VOL_DOWN(); // E = 0
NOP();
LCD_LINE_RW_VOL_DOWN(); // RW = 0
NOP();
LCD_LINE_RS_VOL_UP(); // RS = 1
if (!(c & 0x80))
{
break;
}
}
}
/*********************************************************************************************************
* 函数名称: LCDWriteCmd
* 功能描述: 向LCD写入基本指令
* 输入参数: cmd:欲写入的命令字
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCDWriteCmd (INT8U cmd)
{
LCDReadBF ();
LCD_LINE_E_VOL_DOWN(); // E = 0
NOP();
LCD_LINE_RS_VOL_DOWN(); // RS = 0
NOP();
LCD_LINE_RW_VOL_DOWN(); // RW = 0,为写入数据模式
NOP();
LCD_LINE_E_VOL_UP(); // E = 1
NOP();
NOP();
LCDWriteDB (cmd); // 写入命令
NOP();
NOP();
LCD_LINE_E_VOL_DOWN(); // E = 0
NOP();
LCD_LINE_RW_VOL_UP(); // RW = 1
NOP();
LCD_LINE_RS_VOL_UP(); // RS = 1
}
/*********************************************************************************************************
* 函数名称: LCDWriteData
* 功能描述: 向LCD写入一个字符数据
* 输入参数: ch:欲写入的字符数据
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCDWriteData (INT8U ch)
{
LCDReadBF ();
LCD_LINE_E_VOL_DOWN(); // E = 0
NOP();
LCD_LINE_RS_VOL_UP(); // RS = 1
NOP();
LCD_LINE_RW_VOL_DOWN(); // RW = 0,为写入数据模式
NOP();
LCD_LINE_E_VOL_UP(); // E = 1
NOP();
NOP();
LCDWriteDB (ch); // 写入数据
NOP();
NOP();
LCD_LINE_E_VOL_DOWN(); // E = 0
NOP();
LCD_LINE_RW_VOL_UP(); // RW = 1
NOP();
LCD_LINE_RS_VOL_DOWN(); // RS = 0
//TimeDelayOn10US (7);
}
/*********************************************************************************************************
* 函数名称: LCDReadData
* 功能描述: 从LCD读取一个字符数据
* 输入参数: 无
*
* 返 回 值: 读取的字符数据
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*INT8U LCDReadData (void)
{
INT8U c = 0;
LCD_LINE_E_VOL_DOWN(); // E = 0
LCD_LINE_RW_VOL_UP(); // RW = 1,为读取数据模式
LCD_LINE_RS_VOL_UP(); // RS = 1
LCD_LINE_E_VOL_UP(); // E = 1
c = LCDReadDB (); //
LCD_LINE_E_VOL_DOWN(); // E = 0
LCD_LINE_RW_VOL_DOWN(); // RW = 0
LCD_LINE_RS_VOL_DOWN(); // RS = 0
return (c);
}
/*********************************************************************************************************
* 函数名称: LCDSetDispState
* 功能描述: 设定显示状态开/关.
* 输入参数: id:显示状态开/关标志
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/*void LCDSetDispState (INT8U id)
{
INT8U c = 0x3E;
c |= id;
LCDWriteCmd (c);
}
/*********************************************************************************************************
* 函数名称: LCDSetDDRAddr
* 功能描述: 设定Y地址到地址计数器.
* 输入参数: addr:地址值,范围为00H-3FH
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCDSetDDRAddr (INT8U addr)
{
INT8U c = 0x80;
c |= addr;
LCDWriteCmd (c);
}
/*********************************************************************************************************
* 函数名称: LCDWriteStr
* 功能描述: 向LCD写入字符串
* 输入参数: addr:显示的起始地址; psrc:欲写入的字符串数据; nchar:欲写入的字符数
*
* 返 回 值: 无
*
* 全局变量: 无
* 调用模块: LCD
*
* 作 者: 邹家浩
* 日 期: 2005年8月31日
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
* 修改人: 邹家浩
* 日 期:
*-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCDWriteStr (INT8U addr, const INT8U *psrc, INT8U nchar)
{
INT8U i;
LCDSetDDRAddr (addr);
for (i = 0; i < nchar; i++)
{
LCDWriteData (*psrc);
psrc++;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?