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

📄 lcd12864.c

📁 本程序为12864点阵型液晶的驱动程序
💻 C
字号:
/****************************************************************************************************
* 文件名:	LCD12864.c																				*
* 描 述:	本文件包含了液晶模块的基本函数和显示汉字的所有操作子函数,可共其他的模块进行调用			*	
* 接口定义:	用的是熊涛那块12864接口板,接口按板上定义												*
*			P1口接DB7 -- DB0																		*
*			DI -- P3.7, 数据/指令 选择																*
*			RW -- P3.6, 读/写选择																	*
*			E -- P3.5, 使能信号																		*
*			CS2 -- P3.4, 片选1, 右半片																*
*			CS1 -- P3.3, 片选2, 左半片																*
*			RST -- P3.2, 复位																		*
* 版 本:	KEIL uV2																				*
****************************************************************************************************/


//头文件
#include "config.h"
#include "ziku.h"


//定义结构体数组
struct Word_Buffer
{
	uchar word[2];
};
struct Word_Buffer word_buf[32];							//定义结构体数组来存储待显示的汉字,共32个


/*****************************************************************************************************
* 函 数 名:	Delay
* 功能描述: 本函数为延时子函数,延时 i ms
* 全局变量: 无
* 入口参数:	i
* 出口参数:	无
* 调用模块: 无
* 版  	本:	KEIL uV2
******************************************************************************************************/
void Delay(uchar i)
{
	uchar	j;
	while(i > 0)
	{
		i--;
		j = 122;
		while(j > 0)
		{
			j--;
		}
	}
}

/*****************************************************************************************************
* 函 数 名:	Initiate
* 功能描述: 本函数为液晶初始化子函数
* 全局变量: 无
* 入口参数:	无
* 出口参数:	无
* 调用模块: 无
* 版  	本:	KEIL uV2
******************************************************************************************************/
void Initiate(void)
{
	Delay(40);
	LEFTSIDE
	WriteCmd(0x3e);											//关显示
	RIGHTSIDE
	WriteCmd(0x3e);											//关显示

	LEFTSIDE
	WriteCmd(0x3f);											//开显示
	RIGHTSIDE
	WriteCmd(0x3f);											//开显示

	LEFTSIDE												//起始行设置为第一行
	WriteCmd(0xc0);	
	RIGHTSIDE
	WriteCmd(0xc0);	

	ClearDDRAM();											//清屏

	LEFTSIDE												//读左右半屏
	ReadData();
	RIGHTSIDE
	ReadData();	
}


/*****************************************************************************************************
* 函 数 名:	CheckBusy
* 功能描述: 本函数为判断LCD忙子函数,BUSY=1时,为忙;BUSY=0时,为空闲
* 全局变量: 无
* 入口参数:	
* 出口参数:	无
* 调用模块: 无
* 日 	期:
* 版  	本:	KEIL uV2
******************************************************************************************************/
void CheckBusy(void)
{
	DPORT = 0xff;
	DI = 0;
	RW = 1;
	E = 1;
	while(DPORT & 0x80);									//BUSY=1时,为忙,则等待;BUSY=0时,为空闲
	E = 0;
}


/*****************************************************************************************************
* 函 数 名:	WriteCmd
* 功能描述: 本函数为写指令子函数
* 全局变量: 无
* 入口参数:	cmd -- 要写入的指令
* 出口参数:	无
* 调用模块: CheckBusy()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteCmd(uchar cmd)									//写指令子函数
{
//	CheckBusy();
	DI = 0;
	RW = 0;
	DPORT = cmd;
	E = 1;
	E = 0;	
}


/*****************************************************************************************************
* 函 数 名:	WriteData
* 功能描述: 本函数为写数据子函数
* 全局变量: 无
* 入口参数:	data -- 要写入的数据
*			opp	-- 显示标志位:	为1,显示阳码(点亮为0);为0,显示阴码(点亮为1)
* 出口参数:	无
* 调用模块: CheckBusy()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteData(uchar dat)									//写数据子函数
{
//	CheckBusy();
	DI = 1;
	RW = 0;
	DPORT = dat;
	E = 1;
	E = 0;
}


/*****************************************************************************************************
* 函 数 名:	ReadData
* 功能描述: 本函数为读数据子函数
* 全局变量: 无
* 入口参数:	
* 出口参数:	无
* 调用模块: CheckBusy()
* 版  	本:	KEIL uV2
******************************************************************************************************/
uchar ReadData(void)
{
	uchar	rddata;
//	CheckBusy();
	DI = 1;
	RW = 1;
	E = 1;
	rddata = DPORT;
	E = 0;
	return	rddata;	
}


/*****************************************************************************************************
* 函 数 名:	SetPos
* 功能描述: 本函数为设置显示起始地址(显示行,页地址,Y地址)子函数
* 全局变量: 无
* 入口参数:	st_line -- 液晶显示的起始行,0--63,共64行 
*			x_add -- 液晶显示的页地址,即为DDRAM的行地址,8行为一页,共8页
*			y_add --	液晶显示的Y地址,0--127,在对DDRAM进行读/写操作后,Y地址指针自动加1
* 出口参数:	无
* 调用模块: WriteCmd()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void SetPos(uchar st_line, uchar x_add, uchar y_add)		//设置显示起始地址子函数
{
	st_line &= 0x3f;										//st_line(起始行)的取值范围为0--63
	x_add &= 0x07;											//x_add(页地址)的取值范围为0--7
	WriteCmd(st_line + 0xc0);								//+ 0xc0根据液晶显示模块指令中设置起始行的格式
	WriteCmd(x_add + 0xb8);									//+ 0xb1根据液晶显示模块指令中设置页地址的格式
	if(y_add < 64)
	{
		LEFTSIDE
		WriteCmd(y_add + 0x40);								//y_add的取值范围为0-63,y_add<64时,左半屏显示
	}
	else
	{
		RIGHTSIDE
		WriteCmd(y_add);									//63<y_add<124时,右半屏显示
	}					
}


/*****************************************************************************************************
* 函 数 名:	ClearDDRAM
* 功能描述: 本函数为清DDRAM子函数
* 全局变量: 无
* 入口参数:	无
* 出口参数:	无
* 调用模块: WriteData(),SetPos()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void ClearDDRAM(void)
{
	uchar	i;												//i表示页地址
	uchar	j;												//j表示列地址
	for(i = 0; i < 8; i++)									//清右半屏
	{
		//此处注意,起始行地址受到页地址的限制
		SetPos(0, i, 0);									//设置起始行为第0行,起始页为第0页,起始列为第0列
		for(j = 0; j < 64; j++)								//将右半屏DRAM的64个字节全部清零
		{
			WriteData(0);
		}
	}
	for(i = 0; i < 8; i++)									//清左半屏
	{
		SetPos(0, i, 64);									//设置起始行为第0行,起始页为第0页,起始列为第64列
		for(j = 0; j < 64; j++)								//将左半屏DRAM的64个字节全部清零
		{
			WriteData(0);
		}
	}
}


/*****************************************************************************************************
* 函 数 名:	WriteWord
* 功能描述: 本函数为在液晶屏的任意位置写单个汉字的子函数
* 全局变量: 无
* 入口参数:	st_line,显示的起始行,0--63
*			x_add,显示的页地址,0--7 
*			y_add,显示的列地址,0--127
*		 	Index[2],字符串数组,用来存储汉字
* 出口参数:	无
* 调用模块: WriteData(),SetPos()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteWord(uchar st_line, uchar x_add, uchar y_add, uchar Index[2])
{
	uchar	i;
	uchar 	j;
	if(y_add < 64)
	{
		LEFTSIDE
		WriteCmd(y_add + 0x40);
	}
	else
	{
		RIGHTSIDE
		WriteCmd(y_add);
	}
	
	SetPos(st_line, x_add, y_add);							//设置显示指针的位置		

	for(i = 0; i < 255; i++)
	{
		//汉字作为双字节字符串处理 采用顺序检索方式查找结构体名
		if((GB_16[i].Index[0] == Index[0]) && (GB_16[i].Index[1] == Index[1]))
		{
			for(j = 0; j < 16; j++)							//先写上半字节
			{
				WriteData(GB_16[i].Msk[j]);				
			}

			SetPos(st_line, x_add + 1, y_add);				//页地址加1,准备写下半字节

			for(j = 16; j < 32; j++)
			{
				WriteData(GB_16[i].Msk[j]);					//写下半字节
			}
			//break语句只能跳出一层循环
			break;											//break的用处是跳出for循环,以免重复写入
		}
	} 	
}


/*****************************************************************************************************
* 函 数 名:	WriteFixWord
* 功能描述: 本函数为在液晶屏的固定位置写汉字的子函数
*			因为液晶每行显示8个汉字,一共能显示32个汉字,因此add%32可以得到显示的字为第几个,
*			x_add只能为0,2,4,6;y_add只能为0,16,32,48,64,80,96,112.从而得到转换公式
* 全局变量: 无
* 入口参数:	add,指定地址范围为0--31,全屏可写32个字(16*16) 
*		 	Index[2],字符串数组,用来存储汉字
* 出口参数:	无
* 调用模块: WriteWord()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteFixWord(uchar add, uchar Index[2])
{
	uchar 	st_line = 0;									//设置起始行为0
	uchar 	x_add = add % 32 / 8 * 2;						//转换得到相应的x_add,y_add
	uchar 	y_add = add % 32 % 8 * 16;
	WriteWord(st_line, x_add, y_add, Index);				//调用任意位置写单个汉字的子函数
}


/*****************************************************************************************************
* 函 数 名:	WriteSentence
* 功能描述: 本函数为在液晶屏上写句子的子函数,按照0到31的顺序写入句子
*			从第0个字的位置开始写入汉字,写完一个之后字指针加1,继续写下一个汉字
* 全局变量: 无
* 入口参数:	sentence[],待写入汉字,组成字符串
* 出口参数:	无
* 调用模块: WriteWord(),strlen()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteSentence(uchar sentence[255])
{
	uchar 	i;
	uchar 	j = 0;
	for(i = 0; i < strlen(sentence) / 2; i++)				//strlen()为调用"string.h"中的函数,求字符串的长度
	{
		//从sentence中两个两个的取字符串即汉字 注意不要弄半角的字符或标点符号,否则后面的汉字将找不到 
		word_buf[i].word[0] = sentence[i * 2];
		word_buf[i].word[1] = sentence[i * 2 + 1];
		WriteFixWord(j++, word_buf[i].word);
	}
}


/*****************************************************************************************************
* 函 数 名:	WriteNum
* 功能描述: 本函数为在液晶屏的任意位置显示ASCII表的第几个字符
* 全局变量: 无
* 入口参数:	st_line, x_add, y_add, order
* 出口参数:	无
* 调用模块: SetPos(),WriteData()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteNum(uchar st_line, uchar x_add, uchar y_add, uchar order)
{
	uchar	i;
	uint 	k;
	uchar   buf_x, buf_y;

	buf_x = x_add;
	buf_y = y_add;

	k = order * 0x10;										//因为每16个字节表示一个字符
		
	for(i = 0; i < 8; i++)
	{
		SetPos(st_line, x_add, y_add);							//设置显示指针的位置	
		WriteData(num[k]);
		k++;
		y_add++;
		if(y_add > 127)
		{
			y_add = 0;
			x_add++;
			x_add++;
		}
	}
	
	x_add = buf_x + 1;
	y_add = buf_y;

	for(i = 0;i  < 8; i++)
	{
		SetPos(st_line, x_add, y_add);							//设置显示指针的位置	
		WriteData(num[k]);
		k++;
		y_add++;
		if(y_add > 127)
		{
			y_add = 0;
			x_add++;
			x_add++;
		}		
	}	
}


/*****************************************************************************************************
* 函 数 名:	WriteStr
* 功能描述: 本函数为在液晶屏的任意位置显示显示一列数字
* 全局变量: 无
* 入口参数:	st_line, x_add, y_add, str
* 出口参数:	无
* 调用模块: SetPos(),WriteNum()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteStr(uchar st_line, uchar x_add, uchar y_add, uchar *str)
{
	uchar	i;
	uchar	j;
	uchar	k;
	uchar	n;
	i = 0;

	n = strlen(str);										//no表示数字的个数

	for(j = 0; j < n; j++)
	{
		k = str[i] - 0x20;									//ASCII码转化为10进制数
		WriteNum(st_line, x_add, y_add, k);					//调用显示字符子函数
		y_add = y_add + 8;
		i++;
		if(y_add > 127)
		{
			y_add = 0;
			x_add++;
			x_add++;
		}
	}
}


/*****************************************************************************************************
* 函 数 名:	Printf_Num
* 功能描述: 本函数为在液晶屏的任意位置显示变量中的浮点数
* 全局变量: 无
* 入口参数:	st_line, x_add, y_add, no
* 出口参数:	无
* 调用模块: SetPos(),WriteData()
* 版  	本:	KEIL uV2
******************************************************************************************************/
/*
void Printf_Num(uchar st_line, uchar x_add, uchar y_add, float no)
{
	uchar	a[8];
	if((no < 1.0) && (no > 0.0))
    {
		no *= 1000;
		a[0] = 0;
		a[1] = 0;
		a[2] = no/1000;
		a[3] = 0;
		a[4] = no/100 
		a[5] = no%100/10 + 0x30; 
		a[6] = no%100%10 + 0x30;
		a[7] = 0;
		WriteStr(st_line, x_add, y_add, a);
	}
	else if((no < 1.0) && (no > 0.0))
	{
		
	}
}
*/


/*****************************************************************************************************
* 函 数 名:	Disp_Init
* 功能描述: 本函数为在液晶屏的显示最初界面
* 全局变量: 无
* 入口参数:	无
* 出口参数:	无
* 调用模块: WriteFixWord(),WriteStr()
* 版  	本:	KEIL uV2
******************************************************************************************************/
void Disp_Init()
{
		WriteFixWord(0,"单");
		WriteFixWord(1,"价");
		WriteStr(0,0,32,":     0.00");
		WriteFixWord(7,"元");

		WriteFixWord(8,"重");
		WriteFixWord(9,"量");
		WriteStr(0,2,32,":     0.00");
		WriteStr(0,2,112,"kg");

		WriteFixWord(16,"金");
		WriteFixWord(17,"额");
		WriteStr(0,4,32,":     0.00");
		WriteFixWord(23,"元");

		WriteFixWord(24,"商");
		WriteFixWord(25,"品");
		WriteFixWord(26,"名");
		WriteFixWord(27,"称");
		WriteStr(0,6,64,":");
}

⌨️ 快捷键说明

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