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 + -
显示快捷键?