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

📄 lcm_2002.c

📁 20*2液晶驱动程序
💻 C
字号:
#include	"STC12C.h"
#include	"Io.h"

//#define	BUSE		// 4/8位总线方式开关
#define	ROW		20		// 单行显示最大字符个数

/*==============================================
函数原型:static void	Delay(unsigned char dat)
函数功能:延时xxms
入口参数:无
出口参数:无
==============================================*/
static void	Delay(unsigned char dly)
{
	unsigned char	i;

	do
	{
		i=250;
		while (--i);
		i=250;
		while (--i);
	}
	while (--dly);
}

#ifdef	BUSE
/*==============================================
函数原型:static void	LCM_BF(void)
函数功能:LCM忙检测
入口参数:无
出口参数:无
==============================================*/
static void	LCM_BF(void)
{
	unsigned char	dat;
	
	LCM_RS=0;
	LCM_RS=0;
	LCM_RW=1;
	LCM_RW=1;
	do
	{
		LCM_Port=0xff;
		LCM_E=1;
		LCM_E=1;
		dat=LCM_Port;
		LCM_E=0;
		LCM_E=0;
	}
	while ((dat&0x80)==0x80);
}

/*==============================================
函数原型:static void	LCM_WT(bit	flag,unsigned char dat)
函数功能:以8位数据方式写入LCM
入口参数:bit	flag,unsigned char dat
			flag=0:写入命令字dat
			flag=1:写入数据dat
出口参数:无
==============================================*/
static void	LCM_WT(bit	flag,unsigned char dat)
{
	LCM_RS=flag;
	LCM_RS=flag;
	LCM_RW=0;
	LCM_RW=0;
	LCM_Port=dat;
	LCM_E=1;
	LCM_E=1;
	LCM_E=0;
	LCM_E=0;
}

/*==============================================
函数原型:void	LCM_Init(void)
函数功能:LCM初始化
入口参数:无
出口参数:无
==============================================*/
void	LCM_Init(void)
{
	LCM_E=0;
	LCM_E=0;
	Delay(20);
	LCM_WT(0,0x30);		// 重复送3次 0  0  1  1  *  *  *  *
	Delay(1);
	LCM_WT(0,0x30);
	Delay(1);
	LCM_WT(0,0x30);
	LCM_BF();
	LCM_WT(0,0x38);		// 0  0  1  DL N  F  *  *	DL=1:8位总线;N=1:两行;F=0:5*7点阵
	LCM_BF();
	LCM_WT(0,0x8);		// 0  0  0  0  1  D  C  B	D=0:显示关;C=0:光标关;B=0:闪烁关
	LCM_BF();
	LCM_WT(0,0x1);		// 0  0  0  0  0  0  0  1	清屏
	LCM_BF();
	LCM_WT(0,0x6);		// 0  0  0  0  0  1  ID S	ID=1:增量方式;S=0:无移位
	LCM_BF();
	LCM_WT(0,0x0c);		// 0  0  0  0  1  D  C  B	D=1:显示开;C=0:光标关;B=0:闪烁关
}

#else

/*==============================================
函数原型:static void	LCM_BF(void)
函数功能:LCM忙检测
入口参数:无
出口参数:无
==============================================*/
static void	LCM_BF(void)
{
	unsigned char	dat,over_tmr=220;
	
	LCM_RS=0;
	LCM_RS=0;
	LCM_RW=1;
	LCM_RW=1;
	do
	{
		LCM_Port|=0xf0;
		LCM_E=1;
		LCM_E=1;
		LCM_E=1;
		dat=LCM_Port&0xf0;
		LCM_E=0;
		LCM_E=0;
		LCM_Port|=0xf0;
		LCM_E=1;
		LCM_E=1;
		LCM_E=1;
		dat|=LCM_Port>>4;
		LCM_E=0;
		LCM_E=0;
	}
	while ((dat&0x80)==0x80&&--over_tmr);
}

/*==============================================
函数原型:static void	LCM_WT_4(unsigned char dat)
函数功能:写入半个字节到LCM
入口参数:unsigned char dat
出口参数:无
==============================================*/
static void	LCM_WT_4(unsigned char dat)
{
	LCM_Port&=0x0f;
	LCM_Port|=dat;
	LCM_E=1;
	LCM_E=1;
	LCM_E=0;
	LCM_E=0;
}

/*==============================================
函数原型:static void	LCM_WT(bit	flag,unsigned char dat)
函数功能:以4位数据方式写入LCM
入口参数:bit	flag,unsigned char dat
			flag=0:写入命令字dat
			flag=1:写入数据dat
出口参数:无
==============================================*/
static void	LCM_WT(bit	flag,unsigned char dat)
{
	LCM_RS=flag;
	LCM_RS=flag;
	LCM_RW=0;
	LCM_RW=0;
	LCM_WT_4(dat&0xf0);
	LCM_WT_4(dat<<4);
}

/*==============================================
函数原型:void	LCM_Init(void)
函数功能:LCM初始化
入口参数:无
出口参数:无
==============================================*/
void	LCM_Init(void)
{
	LCM_RS=0;
	LCM_RS=0;
	LCM_RW=0;
	LCM_RW=0;
	LCM_E=0;
	LCM_E=0;
	Delay(20);
	LCM_WT_4(0x30);		// 重复送3次 0  0  1  1  *  *  *  *
	Delay(1);
	LCM_WT_4(0x30);
	Delay(1);
	LCM_WT_4(0x30);
	Delay(1);
	LCM_WT_4(0x20);
	LCM_BF();
	LCM_WT(0,0x28);		// 0  0  1  DL N  F  *  *	DL=0:4位总线;N=1:两行;F=0:5*7点阵
	LCM_BF();
	LCM_WT(0,0x8);		// 0  0  0  0  1  D  C  B	D=0:显示关;C=0:光标关;B=0:闪烁关
	LCM_BF();
	LCM_WT(0,0x1);		// 0  0  0  0  0  0  0  1	清屏
	LCM_BF();
	LCM_WT(0,0x6);		// 0  0  0  0  0  1  ID S	ID=1:增量方式;S=0:无移位
	LCM_BF();
	LCM_WT(0,0x0c);		// 0  0  0  0  1  D  C  B	D=1:显示开;C=0:光标关;B=0:闪烁关
}

#endif

/*==============================================
函数原型:void	LCM_Data(unsigned char dat)
函数功能:显示单个字符
入口参数:unsigned char dat
出口参数:无
==============================================*/
void	LCM_Data(unsigned char dat)
{
	LCM_BF();
	LCM_WT(1,dat);
}

/*==============================================
函数原型:void	LCM_Command(unsigned char dat)
函数功能:发送给LCM控制命令
入口参数:unsigned char dat
出口参数:无
==============================================*/
void	LCM_Command(unsigned char dat)
{
	LCM_BF();
	LCM_WT(0,dat);
}

/*==============================================
函数原型:void	LCM_Cursor(bit	flag,unsigned char row)
函数功能:设置显示坐标
入口参数:
		bit	flag:0第一行;1第二行
		unsigned char row:	DDRAM地址row(0-ROW)
出口参数:无
==============================================*/
void	LCM_Cursor(bit	flag,unsigned char row)
{
	if (row>=ROW)
	{
		row=0;
	}
	if (flag)
	{
		row|=0xc0;
	}
	else
	{
		row|=0x80;
	}
	LCM_Command(row);
}

/*==============================================
函数原型:void	LCM_String(unsigned char code * pc)
函数功能:显示字符串
入口参数:unsigned char code * pc
出口参数:无
==============================================*/
void	LCM_String(unsigned char code * pc)
{
	while (*pc)
	{
		LCM_Data(*pc);
		pc++;
	}
}

⌨️ 快捷键说明

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