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

📄 lcd.c

📁 51单片机操作串行通信LCD LM3037的源代码,该源代码可用来调试程序.
💻 C
字号:
#include<reg52.h>
#include"lcd.h"


void Lcd_Delay(unsigned int times)
{
	unsigned int i,j;
	for(i=0;i<times;i++)
		for(j=0;j<40;j++);
}


void Lcd_SendCom(unsigned char ComByte)
{
	unsigned char i,j;
	
	LCD_CS=1;_nop_;
	for(i=0;i<5;i++)
	{
		LCD_SCL=0;_nop_;
		LCD_SDA=1;_nop_;
		LCD_SCL=1;_nop_;
	}
	for(i=0;i<3;i++)
	{
		LCD_SCL=0;_nop_;
		LCD_SDA=0;_nop_;
		LCD_SCL=1;_nop_;
	}
	for(j=0;j<2;j++)
	{
		for(i=0;i<4;i++)
		{
			LCD_SCL=0;_nop_;
			if(ComByte&0x80)
			{	LCD_SDA=1;_nop_;}
			else
			{	LCD_SDA=0;_nop_;}
			LCD_SCL=1;_nop_;
			ComByte=ComByte<<1;
		}
		for(i=0;i<4;i++)
		{
			LCD_SCL=0;_nop_;
			LCD_SDA=0;_nop_;
			LCD_SCL=1;_nop_;
		}
	}
	LCD_SCL=0;_nop_;
	LCD_CS=0;_nop_;
	Lcd_Delay(1);
}

void Lcd_SendDat(unsigned char DatByte)
{
	unsigned char i,j;
	
	LCD_CS=1;_nop_;
	for(i=0;i<5;i++)
	{
		LCD_SCL=0;_nop_;
		LCD_SDA=1;_nop_;
		LCD_SCL=1;_nop_;
	}
		LCD_SCL=0;_nop_;
		LCD_SDA=0;_nop_;
		LCD_SCL=1;_nop_;
	
		LCD_SCL=0;_nop_;
		LCD_SDA=1;_nop_;
		LCD_SCL=1;_nop_;

		LCD_SCL=0;_nop_;
		LCD_SDA=0;_nop_;
		LCD_SCL=1;_nop_;

	for(j=0;j<2;j++)
	{
		for(i=0;i<4;i++)
		{
			LCD_SCL=0;_nop_;
			if(DatByte&0x80)
			{	LCD_SDA=1;_nop_;}
			else
			{	LCD_SDA=0;_nop_;}
			LCD_SCL=1;_nop_;
			DatByte=DatByte<<1;
		}
		for(i=0;i<4;i++)
		{
			LCD_SCL=0;_nop_;
			LCD_SDA=0;_nop_;
			LCD_SCL=1;_nop_;
		}
	}
	LCD_SCL=0;_nop_;
	LCD_CS=0;_nop_;
	Lcd_Delay(1);
}




void Lcd_Initial(void)
{
//	Lcd_Delay(20);
	Lcd_SendCom(0x30);    //基本指令集
	Lcd_Delay(1);    //t10
	Lcd_SendCom(0x30);    //8bit数据流
	Lcd_Delay(1);   //t5
	Lcd_SendCom(0x0c);    //开显示,无光标,不反白。
	Lcd_Delay(1);    //t10
	Lcd_SendCom(0x01);    //清显示,并设置地址指针为0。
	Lcd_Delay(1);   //500
	Lcd_SendCom(0x06);    //设定游标方向及显示位移
	Lcd_Delay(1);   //10
	Lcd_ClrImg();
	Lcd_Delay(1);   //10
}

//////////////////////////////////////////////////////////////////////////////
// 功能:显示字符串,有自动换行功能。
// 
/////////////////////////////////////////////////////////////////////////////
bit Lcd_DisStr(unsigned char x,unsigned char y,unsigned char *DisString) reentrant 
{
	unsigned char i;
	unsigned char flag;

	if(x>8)return 0;
	if(y>1)return 0;

	Lcd_SendCom(0x01);    //清显示,并设置地址指针为0。
	Lcd_Delay(5);
	if(y==0)
		Lcd_SendCom(0x80+x);
	else
		Lcd_SendCom(0x90+x);
	Lcd_Delay(10);      //t50//////////////////////////////add
	x=x<<1;
	i=0;
	flag=0;
	while(*DisString>0)
	{
		++i;
		if((y==0)&&((x+i)>18)&&(flag==0))
		{
			flag=1;
			Lcd_SendCom(0x90);
	//		Lcd_Delay(1);    //t50
		}
		Lcd_SendDat(*DisString);
		DisString++;
	//	Lcd_Delay(1);      //t50
	}
}


void Lcd_Img(unsigned char code *img)
{
	unsigned int j=0;
	unsigned char  x,y;
	
	for(y=0;y<32;y++)
		for(x=0;x<9;x++)
		{
			Lcd_SendCom(0x36);
		//	Lcd_Delay(1);
			Lcd_SendCom(y+0x80);
		//	Lcd_Delay(1);
			Lcd_SendCom(x+0x80);
		//	Lcd_Delay(1);
			Lcd_SendCom(0x30);
		//	Lcd_Delay(1);
			Lcd_SendDat(img[j++]);
		//	Lcd_Delay(1);
			Lcd_SendDat(img[j++]);
		//	Lcd_Delay(1);
		}
}

void Lcd_ClrImg(void)
{
	unsigned char  x,y;
	
	for(y=0;y<32;y++)
		for(x=0;x<9;x++)
		{
			Lcd_SendCom(0x36);//Lcd_Delay(5);
			Lcd_SendCom(y+0x80);//Lcd_Delay(5);
			Lcd_SendCom(x+0x80);//Lcd_Delay(5);
			Lcd_SendCom(0x30);//Lcd_Delay(5);
			Lcd_SendDat(0x00);//Lcd_Delay(5);
			Lcd_SendDat(0x00);//Lcd_Delay(5);
		}
}

//十六进制数据转换为ASCII码表,数组索引为所要转换的十六进制数,数组值即为数组索引所对应的ASCII码。
code unsigned char NumToAscii[16]=
{
	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x66
};

//LCD的显示存储区。
xdata unsigned char DisBuf[37]=
{
	' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
	' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',0
};
xdata unsigned char LocationOfBuf=0;
xdata unsigned char EndOfBuf;


unsigned char CharToStr(unsigned char character,unsigned char *strDatas)
{
	
	unsigned char tempByte1;
	unsigned char tempByte2;
	tempByte1=character/100;
	tempByte2=character%100;
	strDatas[0]=tempByte1;
	tempByte1=tempByte2/10;
	tempByte2=tempByte2%10;
	strDatas[1]=tempByte1;
	strDatas[2]=tempByte2;

	tempByte2=3;
/*	tempByte1=0;
	while((strDatas[tempByte1]==0)&&(tempByte1<3))
	{
		tempByte2--;
		tempByte1++;
	}
	if(tempByte2==0)
		tempByte2=1;
	for(tempByte1=0;tempByte1<tempByte2;tempByte1++)
		strDatas[tempByte1]=strDatas[tempByte1+3-tempByte2];
	*/
	return(tempByte2);
}

unsigned char IntToStr(unsigned int intValue,unsigned char *strDatas)
{
	
	unsigned char tempByte1;
	unsigned int tempByte2;
	tempByte1=intValue/10000;
	tempByte2=intValue%10000;
	strDatas[0]=tempByte1;
	tempByte1=tempByte2/1000;
	tempByte2=tempByte2%1000;
	strDatas[1]=tempByte1;
	tempByte1=tempByte2/100;
	tempByte2=tempByte2%100;
	strDatas[2]=tempByte1;
	tempByte1=tempByte2/10;
	tempByte2=tempByte2%10;
	strDatas[3]=tempByte1;
	strDatas[4]=tempByte2;
	tempByte2=5;
/*	tempByte1=0;
	while((strDatas[tempByte1]==0)&&(tempByte1<5))
	{
		tempByte2--;
		tempByte1++;
	}
	if(tempByte2==0)
		tempByte2=1;
	for(tempByte1=0;tempByte1<tempByte2;tempByte1++)
		strDatas[tempByte1]=strDatas[tempByte1+5-tempByte2];
*/
	return(tempByte2);
}

void ResetDispLay(void)
//调用此函数后,再调用变量显示类函数,则显示器刷新。
{
	unsigned char i;
	LocationOfBuf=0;
	for(i=0;i<36;i++)
		DisBuf[i]=' ';
}

bit PrintUnchar(unsigned char *string,unsigned char character)
/*
功能:显示一个unsigned char变量.
参数:string--提示字符串(如:“变量=“)
	  character--所要显示的unsigned char 变量。
返回:0--失败;1--成功。
注意:显示区为循环显示,超出显示区的内容会从头复盖原有内容。
*/
{ 
/*	unsigned char HighHarf,LowHarf;


	while(*string>0)
	{
		DisBuf[LocationOfBuf]=*string;
		string++;
		if((++LocationOfBuf)>35)
			LocationOfBuf=0;
	}
	HighHarf=(character&0xf0)>>4;
	LowHarf =character&0x0f;
	DisBuf[LocationOfBuf]=NumToAscii[HighHarf];
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	DisBuf[LocationOfBuf]=NumToAscii[LowHarf];
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	DisBuf[EndOfBuf]=' ';
	DisBuf[LocationOfBuf]='/';
	EndOfBuf=LocationOfBuf;
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	if(!Lcd_DisStr(0,0,DisBuf))
		return 0;
	return 1;*/
/////////////////////////////////////////////////////////////
	unsigned char tempChar,i;
	unsigned char charArray[3];
	tempChar=CharToStr(character,charArray);

	while(*string>0)
	{
		DisBuf[LocationOfBuf]=*string;
		string++;
		if((++LocationOfBuf)>35)
			LocationOfBuf=0;
	}
	for(i=0;i<tempChar;i++)
	{
		DisBuf[LocationOfBuf]=NumToAscii[charArray[i]];
		if((++LocationOfBuf)>35)
			LocationOfBuf=0;		
	}
	DisBuf[EndOfBuf]=' ';
	DisBuf[LocationOfBuf]='/';
	EndOfBuf=LocationOfBuf;
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	if(!Lcd_DisStr(0,0,DisBuf))
		return 0;
	return 1;
}


bit PrintUnint(unsigned char *string,unsigned int intValue)
/*
功能:显示一个unsigned int变量.
参数:string--提示字符串(如:“变量=“)
	  intValue--所要显示的unsigned int 变量。
返回:0--失败;1--成功。
注意:显示区为循环显示,超出显示区的内容会从头复盖原有内容。
*/
{/* 
	unsigned char HighHarf,LowHarf;
	unsigned char HighByte,LowByte;


	while(*string>0)
	{
		DisBuf[LocationOfBuf]=*string;
		string++;
		if((++LocationOfBuf)>35)
			LocationOfBuf=0;
	}
	LowByte=(unsigned char)intValue;
	HighByte=(unsigned char)(intValue>>8);
	HighHarf=(HighByte&0xf0)>>4;
	LowHarf =HighByte&0x0f;
	DisBuf[LocationOfBuf]=NumToAscii[HighHarf];
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	DisBuf[LocationOfBuf]=NumToAscii[LowHarf];
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	HighHarf=(LowByte&0xf0)>>4;
	LowHarf =LowByte&0x0f;
	DisBuf[LocationOfBuf]=NumToAscii[HighHarf];
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	DisBuf[LocationOfBuf]=NumToAscii[LowHarf];
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	DisBuf[EndOfBuf]=' ';
	DisBuf[LocationOfBuf]='/';
	EndOfBuf=LocationOfBuf;
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	if(!Lcd_DisStr(0,0,DisBuf))
		return 0;
	return 1;*/
///////////////////////////////////////////////////////////////////////
	unsigned char tempChar,i;
	unsigned char charArray[5];
	tempChar=IntToStr(intValue,charArray);

	while(*string>0)
	{
		DisBuf[LocationOfBuf]=*string;
		string++;
		if((++LocationOfBuf)>35)
			LocationOfBuf=0;
	}
	for(i=0;i<tempChar;i++)
	{
		DisBuf[LocationOfBuf]=NumToAscii[charArray[i]];
		if((++LocationOfBuf)>35)
			LocationOfBuf=0;		
	}
	DisBuf[EndOfBuf]=' ';
	DisBuf[LocationOfBuf]='/';
	EndOfBuf=LocationOfBuf;
	if((++LocationOfBuf)>35)
		LocationOfBuf=0;
	if(!Lcd_DisStr(0,0,DisBuf))
		return 0;
	return 1;
}









⌨️ 快捷键说明

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