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

📄 rd_lcd1602b.c

📁 LCD1602键盘显示模块实例
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************
*   函数库说明:LCD1602B基本驱动函数库                     *
*   版本:      v2.11                                      *
*   作者:      傻孩子                                     *
*   创建日期:  2005年9月6日                               *
* -------------------------------------------------------- *
*  [支 持 库]                                              *
* -------------------------------------------------------- *
*  [版本更新]                                              *
*   修改:      傻孩子                                     *
*   修改日期:  2006年6月8日                               *
*   版本:      v2.11                                      *
* -------------------------------------------------------- *
*  [版本历史]                                              *
* -------------------------------------------------------- *
*  [使用说明]                                              *
*              1、需要底层硬件驱动函数支持                 *
*                 基本的宏定义:                           *
*                 LCD_RS   LCD_RW   LCD_E                  *
*                 LCD_SET_WRITE_DATA  LCD_SET_READ_DATA    *
*                 LCD_SEND_HALF_CHAR_HIGH(a)               *
*                 LCD_SEND_HALF_CHAR_LOW(a)                *
*                 当处于串行状态下时,只定义LCD_RS         *
*                 LCD_E LCD_SEND_HALF_CHAR_HIGH(a)         *
*                 LCD_SEND_HALF_CHAR_LOW(a)                *
*              2、如果采用8数据位连接,则需要定义数据端口  *
*                 LCD_DATA_PORT,同时需要定义宏来开启该功  *
*                 能:_LCD1602_FULL_DATA_MODEL             *
*              3、需要修改引用宏定义来指定底层硬件驱动     *
*                 函数库。                                 *
*              4、本库驱动下的LCD显示支持1602的各种连      *
*                 接方法。当使用只写模式是请在引用该头     *
*                 文件之前加上宏定义:                     *
*                 # define _USE_LCD_ONLY_WRITE             *
*              5、在调用本库之前,定义RunStringSpeed可     *
*                 以设置滚屏的速度。通过在引用前定义       *
*                 FlashTimeOut 和 FlashGIFTimeOut 可以     *
*                 改变字符闪烁的频率。                     *
*              6、增加一个GIF字幕特效函数。                *
*              7、确定没有LCD复位问题。                    *
*              8、增加对595串行转并行连接的支持。          *
*                 需要头文件SerialToCollateral.h           *
***********************************************************/

/********************
* 头 文 件 配 置 区 *
********************/
# include "RD_MacroAndConst.h"
# include "LIB_Config.h"
# include "RD_LCD1602B.h"


/********************
*   系 统 宏 定 义  *
********************/

/*------------------*
*   常 数 宏 定 义  *
*------------------*/
# define LCD_CMD_DISP_CTR   0x0c
# define LCD_CMD_CLS        0x01
# define LCD_CMD_ENTER_SET  0x02
# define LCD_CMD_ICON_SHOW  0x0f
# define LCD_CMD_ICON_HIDE  0x0c
# define LCD_CMD_NOT_MOVE   0x14


# define LCD_WRITE          0x00
# define LCD_READ           0x01
# define LCD_COMMAND        0x00
# define LCD_DATA           0x01

#ifndef LCD_RUN_STRING_SPEED
    # define LCD_RUN_STRING_SPEED 100
#endif

#ifndef LCD_FLASH_TIME_OUT
    # define LCD_FLASH_TIME_OUT   0x03ff
#endif
#ifndef LCD_FLASH_STRING_GROUP_TIME_OUT
    # define LCD_FLASH_STRING_GROUP_TIME_OUT  0x03ff
#endif

/*------------------*
*   动 作 宏 定 义  *
*------------------*/
#ifndef LCD_SET_WRITE_DATA
    # define LCD_SET_WRITE_DATA
#endif
#ifndef LCD_SET_READ_DATA
    # define LCD_SET_READ_DATA
#endif
#ifndef LCD_RW
    # define LCD_RW   LCD_Temp 
#endif
#ifndef LCD_BF
	# define LCD_BF   LCD_Temp
#endif

#ifndef _Use_LCD1602B_Serial
    # define SetReadState       LCD_SET_READ_DATA;LCD_RS = LCD_COMMAND;LCD_RW = LCD_READ;
    # define SetRead            LCD_SET_READ_DATA;LCD_RW = LCD_READ;
    # define SetWrite           LCD_SET_WRITE_DATA;LCD_RW = LCD_WRITE;
    # define SetCommand         LCD_RS = LCD_COMMAND;
    # define SetData            LCD_RS = LCD_DATA;
#else
    # define _USE_LCD_ONLY_WRITE
    # define SetReadState
	# define SetRead
	# define SetWrite
	# define SetCommand         LCD_RS = LCD_COMMAND;refreshVirtualPORT();
	# define SetData            LCD_RS = LCD_DATA;refreshVirtualPORT();   
	# define SetEnable          LCD_E = High;refreshVirtualPORT();
	# define SetDisable         LCD_E = Low;refreshVirtualPORT();
#endif

#ifdef _LCD1602_FULL_DATA_MODEL
    #ifndef LCD_DATA_PORT
        #error Need for macro: LCD_DATA_PORT
    #endif
#endif
/********************
*  用户变量类型定义 *
********************/

/********************
*  模块结构体定义区 *
********************/

/********************
*   模块函数声明区  *
********************/
static void LCDDelay(unsigned int Time);
static void LCDDelayUs(unsigned int Time);


/********************
*   全局函数声明区  *
********************/
void LCDInit(void);
void LCDSetXY(char X,char Y);
void LCDDisplayString(char *String);
void LCDDisplayNum(unsigned long Num,char BitCount);
void RunString(char *String,char Y,char StartX,char EndX);
char StringLength(char *String);
void Flash(char *String,char Icon,char X,char Y);
void FlashStringGroup(char String[][17],char StringCounter,char X,char Y);
void LCDWaitForReady(void);
void LCDSendCommand(char Command);
void LCDSendData(char Data);

/********************
*   全局函数引用区  *
********************/
#ifdef _Use_LCD1602B_Serial
    extern void refreshVirtualPORT(void);
#endif

/********************
*   模块变量声明区  *
********************/
const static char CHR[16] = {'0','1','2','3','4','5','6','7','8'
                     ,'9','a','b','c','d','e','f'};
                     
/********************
*   全局变量声明区  *
********************/
static char LCD_Temp = 0;

/********************
*   全局变量引用区  *
********************/
#ifndef SYS_TIMER_MS_ADD_UNTILL_OVF
extern unsigned int SystemTimer;
    #define SYS_TIMER_MS_ADD_UNTILL_OVF SystemTimer
#else
extern unsigned int SYS_TIMER_MS_ADD_UNTILL_OVF;
#endif  



/***********************************************************
*   函数说明:LCD驱动类毫秒延时函数                        *
*   输入:    需要延时的大体毫秒数                         *
*   输出:    无                                           *
*   调用函数:LCDDelayUs()                                 *
***********************************************************/
static void LCDDelay(unsigned int Time)
{
    unsigned int TimeCounter = 0;
	
	for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
	{
	    LCDDelayUs(255);
	}
}

/***********************************************************
*   函数说明:LCD驱动指令周期延时函数                      *
*   输入:    需要大体延时Us数                             *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
static void LCDDelayUs(unsigned int Time)
{
     unsigned int TimeCounter = 0;
	 for (TimeCounter = 0;TimeCounter < Time;TimeCounter ++)
	 {
	     asm("nop");
	 }
}

/***********************************************************
*   函数说明:LCD初始化函数                                *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:LCDDelay()  LCDWaitForReady()                *
*             LCDSendCommand()                             *
***********************************************************/
void LCDInit(void)
{
    LCDDelay(15);
   
#ifndef _LCD1602_FULL_DATA_MODEL
	LCDSendCommand(0x28);
#else
    LCDSendCommand(0x38);
#endif
    LCDWaitForReady();
	LCDSendCommand(LCD_CMD_DISP_CTR);
    LCDWaitForReady();
	LCDSendCommand(LCD_CMD_CLS);
	LCDDelay(2);
	LCDSendCommand(LCD_CMD_ENTER_SET);
    LCDWaitForReady();
    LCDSendCommand(LCD_CMD_NOT_MOVE);
	
}

#ifndef _Use_LCD1602B_Serial
/***********************************************************
*   函数说明:向LCD发送指令函数                            *
*   输入:    需要发送的指令                               *
*   输出:    无                                           *
*   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
***********************************************************/
void LCDSendCommand(char Command)
{
	SetWrite;
	SetCommand;
    #ifndef _LCD1602_FULL_DATA_MODEL
	{
		LCD_SEND_HALF_CHAR_HIGH(Command);
        LCD_E = HIGH;
	    LCD_E = LOW;
	}
	{
        LCD_SEND_HALF_CHAR_LOW(Command);	
		LCD_E = HIGH;
		LCD_E = LOW;
	}
    #else
        LCD_DATA_PORT = Command;
        LCD_E = HIGH;
        LCD_E = LOW;
    #endif
    SetRead;		
	SetCommand;
}

/***********************************************************
*   函数说明:向LCD发送数据函数                            *
*   输入:    需要发送的数据                               *
*   输出:    无                                           *
*   调用函数:LCD_SEND_HALF_CHAR_HIGH() LCD_SEND_HALF_CHAR_LOW() *
***********************************************************/
void LCDSendData(char Data)
{
    SetWrite;
	SetData;
    #ifndef _LCD1602_FULL_DATA_MODEL
	{
		LCD_SEND_HALF_CHAR_HIGH(Data);
		LCD_E = HIGH;
	    LCD_E = LOW;
	}

	{
        LCD_SEND_HALF_CHAR_LOW(Data);	

⌨️ 快捷键说明

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