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

📄 lcd12864.c

📁 由51单片机与12864组成 俄罗斯方块游戏程序 keil工程
💻 C
字号:
//*************************************************************************************************
//*																								  *
//*			 ******************************LCD12864驱动程序**************************			  *
//*																								  *
//*************************************************************************************************
#include "includes.h"

//*************************************************************************************************
//*																								  *
//*			 ********************************读忙标志位*********************************		  *
//*																								  *
//*************************************************************************************************
bit bCheckBusy()
{
	LCDPORT=0xFF;
	RW=1;
	DI=0;
	E=1;
	E=0;
	return BUSYSTATUS; 
}

//*************************************************************************************************
//*																								  *
//*			 ********************************写数据*********************************			  *
//*																								  *
//*************************************************************************************************
void vWriteData(unsigned char ucData)
{
	while(bCheckBusy());
	LCDPORT=0xFF;

	RW=0;
	DI=1;
	LCDPORT=ucData;
	E=1;
	E=0;
}

//*************************************************************************************************
//*																								  *
//*			 ********************************写指令*********************************			  *
//*																								  *
//*************************************************************************************************
void vWriteCMD(unsigned char ucCMD)
{
	while(bCheckBusy());
	LCDPORT=0xFF;

	RW=0;
	DI=0;
	LCDPORT=ucCMD;
	E=1;
	E=0;
}

//*************************************************************************************************
//*																								  *
//*			 ********************************LCD初始化函数*******************************		  *
//*																								  *
//*************************************************************************************************
void vLCDInitialize()
{
	CS1=1;
	CS2=1;
	vWriteCMD(0x38);		//8位形式,两行字符。
	vWriteCMD(0x0F);		//开显示。
	vWriteCMD(0x01);		//清屏。
	vWriteCMD(0x06);		//画面不动,光标右移。
	vWriteCMD(LCDSTARTROW);	//设置起始行。
}
//*************************************************************************************************
//*																								  *
//*			 ******************************设置显示位置*********************************		  *
//*																								  *
//*************************************************************************************************
vSetPosition(unsigned char ucPage,unsigned char ucLine)
{
	if(ucLine<64)
		{
		CS1=1;
		CS2=0;
		}
	else
		{
		CS1=0;
		CS2=1;
		}
	vWriteCMD(LCDPAGE+ucPage);
	vWriteCMD(LCDLINE+ucLine%64);
}
//*************************************************************************************************
//*																								  *
//*			 ******************************显示自定义行*********************************		  *
//*																								  *
//*************************************************************************************************
//在8×128的格子里显示自定义长度的一行
void vShowCustomRow(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char *ucaRow)
{
	unsigned char ucCount;				   //取值范围:ucPage:0~7;ucLine:0~127;
										   //ucWidth:0~127;ucLine+ucWidth<128。
	for(ucCount=0;ucCount<ucWidth;ucCount++)
		{
		vSetPosition(ucPage,ucLine+ucCount);
		vWriteData(*(ucaRow+ucCount));
		}
}

//*************************************************************************************************
//*																								  *
//*			 ******************************清除指定范围*********************************		  *
//*																								  *
//*************************************************************************************************
void vCleanCustom(unsigned char ucRow,unsigned char ucLine,unsigned char ucWidth,unsigned char ucHigh)
{
	unsigned char ucCountOne,ucCountTwo;
	for(ucCountOne=0;ucCountOne<ucHigh;ucCountOne++)
		for(ucCountTwo=0;ucCountTwo<ucWidth;ucCountTwo++)
			{
			vSetPosition(ucRow+ucCountOne,ucLine+ucCountTwo);
			vWriteData(0x00);
			}
}


//*************************************************************************************************
//*																								  *
//*			 ************************************清屏***********************************		  *
//*																								  *
//*************************************************************************************************
void vCleanAll()
{
	unsigned char ucRow,ucLine;
	CS1=1;
	CS2=1;
	for(ucRow=0;ucRow<8;ucRow++)
		{
		vWriteCMD(LCDPAGE+ucRow);
		vWriteCMD(LCDLINE);
		for(ucLine=0;ucLine<64;ucLine++)
			vWriteData(0x00);
		}
}
//*************************************************************************************************
//*																								  *
//*			 *****************************字符显示函数***********************************		  *
//*																								  *
//*************************************************************************************************
//此函数将8×16字符显示在8×128的格子里。
void vShowChar(unsigned char ucCaps,unsigned char ucPage,unsigned char ucLine,unsigned char *ucaCharMap)
{
	unsigned char ucCount,ucaTemp[5];
	switch(ucCaps)
		{
		case CAPS_COMMON:
			vShowCustomRow(ucPage,ucLine,8,ucaCharMap);
			vShowCustomRow(ucPage+1,ucLine,8,ucaCharMap+8);
			break;
		case CAPS_MARK:
			for(ucCount=0;ucCount<5;ucCount++)
				{
				ucaTemp[ucCount]=uca_MARK[40+ucLine+ucCount]|(*(ucaCharMap+ucCount));
				}
			vShowCustomRow(MARKPOS_ROW+1,ucLine,5,ucaTemp);
			vShowCustomRow(MARKPOS_ROW+2,ucLine,5,ucaCharMap+5);
			break;
		case CAPS_TIME:
			for(ucCount=0;ucCount<5;ucCount++)
				{
				ucaTemp[ucCount]=uca_TIME[40+ucLine+ucCount]|(*(ucaCharMap+ucCount));
				}
			vShowCustomRow(4,ucLine,5,ucaTemp);
			vShowCustomRow(5,ucLine,5,ucaCharMap+5);
			break;
		default:
			vShowCustomRow(ucPage,ucLine,5,ucaCharMap);
			vShowCustomRow(ucPage+1,ucLine,5,ucaCharMap+5);
			break;
		}
}

//*************************************************************************************************
//*																								  *
//*			 *****************************图片显示函数***********************************		  *
//*																								  *
//*************************************************************************************************
void vShowGraph(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,
					unsigned char ucHigh,unsigned char * ucaGraph)
{
	unsigned char ucCount;
	for(ucCount=0;ucCount<ucHigh;ucCount++)
		vShowCustomRow(ucPage+ucCount,ucLine,ucWidth,ucaGraph+ucCount*ucWidth);
}
//*************************************************************************************************
//*																								  *
//*			 **********************************显示数字***********************************		  *
//*																								  *
//*************************************************************************************************
void vShowNumber(unsigned char ucCaps,unsigned char ucRow,unsigned char ucLine,unsigned long ulNumber)
{
	unsigned char ucCount,ucNumberFront;
	unsigned long ulNumberTemp=1000000000;

	for(ucNumberFront=0;ucNumberFront<9;ucNumberFront++)
		{
		if(ulNumber/ulNumberTemp)
			break;
		ulNumberTemp/=10;
		}

	for(ucCount=0;ucCount<10-ucNumberFront;ucCount++)
		{
		if(ucCaps==CAPS_COMMON)
			vShowChar(ucCaps,ucRow,ucLine+ucCount*NUMBERWIDTH,uca_Number[ulNumber/ulNumberTemp]);
		else
			vShowChar(ucCaps,ucRow,ucLine+ucCount*NUMBERSWIDTH,uca_NumberS[ulNumber/ulNumberTemp]);
		ulNumber-=(ulNumber/ulNumberTemp)*ulNumberTemp;
		ulNumberTemp/=10;
		}
}

⌨️ 快捷键说明

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