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

📄 lcd12864.c

📁 基于MSP430F14X单片机的LCD12864的显示驱动程序
💻 C
字号:
/****************************************************************************************************
* 文件名:	LCD12864.c																				*
* Copyright (c) 2008 *********武汉理工大学信息工程学院电信系										*
* 创建人:	王康																					*
* 日 期:	2008.8.6实现了液晶屏上任意显示汉字的功能												*
* 修改人:	王康																					*
* 日 期:	2008.8.7完成了工程功能的扩充,即在液晶屏的任意位置打点,可以用来波形显示					*
* 描 述:	本文件包含了液晶模块的基本函数和显示汉字的所有操作子函数,可共其他的模块进行调用			*	
* 接口定义:	用的是熊涛那块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个


/*****************************************************************************************************
* 函 数 名:	Initiate
* 功能描述: 本函数为初始化子函数
* 全局变量: 无
* 入口参数:	无
* 出口参数:	无
* 调用模块: 无
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期: 
* 版  	本:	KEIL uV2
******************************************************************************************************/
void Initiate(void)
{
	WriteCmd(0x3e);											//关显示
	WriteCmd(0x3f);											//开显示
}


/*****************************************************************************************************
* 函 数 名:	CheckBusy
* 功能描述: 本函数为判断LCD忙子函数,BUSY=1时,为忙;BUSY=0时,为空闲
* 全局变量: 无
* 入口参数:	
* 出口参数:	无
* 调用模块: 无
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	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()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	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()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteData(uchar dat)									//写数据子函数
{
	CheckBusy();
	DI = 1;
	RW = 0;
	DPORT = dat;
	E = 1;
	E = 0;
}


/*****************************************************************************************************
* 函 数 名:	ReadData
* 功能描述: 本函数为读数据子函数
* 全局变量: 无
* 入口参数:	
* 出口参数:	无
* 调用模块: CheckBusy()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	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行 
*			xadd -- 液晶显示的页地址,即为DDRAM的行地址,8行为一页,共8页
*			yadd --	液晶显示的Y地址,0--128,在对DDRAM进行读/写操作后,Y地址指针自动加1
* 出口参数:	无
* 调用模块: WriteCmd()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	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)
	{
		RIGHTSIDE
		WriteCmd(y_add + 0x40);								//y_add的取值范围为0-63,y_add<64时,右半屏显示
	}
	else
	{
		LEFTSIDE
		WriteCmd(y_add);									//63<y_add<124时,左半屏显示
	}					
}


/*****************************************************************************************************
* 函 数 名:	ClearDDRAM
* 功能描述: 本函数为清DDRAM子函数
* 全局变量: 无
* 入口参数:	无
* 出口参数:	无
* 调用模块: WriteData(),SetPos()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	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--63
*		 	Index[2],字符串数组,用来存储汉字
* 出口参数:	无
* 调用模块: WriteData(),SetPos()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	KEIL uV2
******************************************************************************************************/
void WriteWord(uchar st_line, uchar x_add, uchar y_add, uchar Index[2])
{
	uchar	i;
	uchar 	j;
	if(y_add < 64)
	{
		RIGHTSIDE
		WriteCmd(y_add + 0x40);
	}
	else
	{
		LEFTSIDE
		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()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	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()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:
* 版  	本:	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);
	}
}


/*****************************************************************************************************
* 函 数 名:	ScrolDisplay(调试未通过)
* 功能描述: 本函数为在液晶屏上滚动显示句子的子函数
*			所谓滚动显示,即需要建立一个显示缓冲区
* 全局变量: 无
* 入口参数:	sentence[],待写入汉字,组成字符串
* 出口参数:	无
* 调用模块: WriteWord()
* 作 	者:	王康
* 日 	期:	2008.8.6
* 修 改 人:	王康
* 日 	期:	
* 版  	本:	KEIL uV2
******************************************************************************************************/
void ScrolDisplay(uchar sentence[255])
{
	uchar 	i = 0;
	uchar 	j = 0;
	for(i = 0; i < strlen(sentence) / 2; i++)
	{
		for(j = 0; j <= i; j++)
		{
			word_buf[i].word[0] = sentence[i * 2];
			word_buf[i].word[1] = sentence[i * 2 + 1];
			WriteFixWord(i,word_buf[i].word);
		}
	}
}


⌨️ 快捷键说明

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