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

📄 51lcd1602+=

📁 51简易计算器_lcd1602
💻
字号:
/*********************************************************
LCD1602的驱动程序
**********************************************************/
#include <reg52.h>
#include "work.h"
#include <math.h>

//===========================================================
//延时约1毫秒
//===========================================================
void delayms(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=120;y>0;y--);
}
//===========================================================
//lcd读忙标志
//===========================================================
uchar lcdbusy()
{
  bit result;
  lcd_rs = 0;
  lcd_rw = 1;
  lcd_en = 1;
  delayms(1);
  result = (bit)(P0 &0x80);
  lcd_en = 0;
  return (result);
}

//============================================================
//"写数据函数"
void writedata(uchar wrdata1)   //"写数据函数"
{ 	
	while(lcdbusy());
	lcd_rs=1;		//write data
	lcd_rw=0;
	lcd_en=1;
	DQ=wrdata1;
	delayms(5);
	lcd_en=0;		
}
//============================================================
//"写命令函数"
//============================================================	 
void writecom(uchar comd)	 	//"写命令函数"
{
	while(lcdbusy());
	lcd_rs=0;
	lcd_rw=0;
	lcd_en=1;
	DQ=comd;
	delayms(5);
	lcd_en=0;
} 

/**********************************************************
"写字符串函数"
 **********************************************************
void writestr(uchar *p)	 //"无地址,写之前要先写一个地址"
{
   uchar i;
   i=0;
  while (p[i] != '\0')
  {
    writedata(p[i]);
    i++;
  }
}			*///---------此函数没有调用过,故注释掉--------------
//*******************"初始化函数"********************************
void lcdinit(void)					
{	writecom(0x38);	 //"5*8双行显示"
	delayms(5);
	writecom(0x06);
	delayms(5);
	writecom(0x0c);
	delayms(5);
	writecom(0x01);	//"清屏"
	writecom(0x80);
}

//================================================================
//  显示清除
//================================================================
void clearplay(uchar x)
{
	uchar i;
	if(x==1)
	{
		for(i=0;i<16;i++)
			pbuffer1[i]=0;
	}
	else if(x==2)
	{
	 	for(i=0;i<16;i++)
			pbuffer2[i]=0;
	}
	else if(x==3)
	{
	 	for(i=0;i<16;i++)
		{
			pbuffer1[i]=0;
			pbuffer2[i]=0;
		}
	}	
	pbuffer2[15]=0x30;
	pflag=1;	
}

//=================================================================
//刷全屏:进行一次全屏的刷写
//=================================================================
void displayall(void)
{
	uchar i;
	if(pflag==1)
	{
		writecom(0x0c);
		writecom(0x80+0x40);	   	     //第二行
		for(i=0;i<16;i++)
			writedata(pbuffer2[i]);


		writecom(0x80);		
		for(i=0;i<16;i++)		      //第一行
			writedata(pbuffer1[i]);
		writecom(0x80+k);
		writecom(0x0e);
		pflag=0;					  //清0显示标志位
	}
}
//==========================================================
//flag=1,移第一行;flag=2,移第二行。
//==========================================================
void moveright(uchar flag)
{
	uchar i;
	if(flag==1)
	{
		for(i=15;i>0;i--)
			pbuffer1[i]=pbuffer1[i-1];
		pbuffer1[0]=0;	
	}
	else if(flag==2)
	{
		for(i=15;i>0;i--)
			pbuffer2[i]=pbuffer2[i-1];
		pbuffer2[0]=0;	
	}
}
//=====================================================
//功能:结果显示传换
//说明:显示的结果小数部分是六位的,显示的只是表像结果,
//      当进行连运算时,结果就不对了,显示结果没有更改上一次的计算结果
//=====================================================
void jchangep(void)		   //结果显示传换
{
	uchar i,p,q;		   //i循环变量,p整数位数,q小数位数
	uchar n;
	long int j,m,xs;	   //
	float xsj,jguo1;
	if(jguo<0) jguo1=-jguo;
	else jguo1=jguo;
	j=jguo1;	            //取整数部分
	xsj=jguo1-j;            //取小数部分
	p=0;
	q=0;
	if(j==0)//----------无整数---------------------
	{
		p=1;
		q=9;
		xs=xsj*(long int)pow(10,9);
		while(xs%10==0)
		{
			xs=xs/10;
			q--;	
		}	      //取小数个数
		xs=xsj*(long int)pow(10,q);
		 for(i=15;i>15-q;i--)
		{
			pbuffer2[i]=xs%10+0x30;
			xs=xs/10;	
		}
		if(jguo<0) pbuffer2[15-q-1-1]='-';
		pbuffer2[15-q-1]=0x30;
		pbuffer2[15-q]='.';
		if(q>6)
		{
			n=q-6;
			for(i=0;i<n;i++)
				moveright(2);
			while(pbuffer2[15]==0x30)	    //小数点后的0不显示
			{
				moveright(2);
			}
		}
	}
	else if(xsj<0.000000002)//-----------无小数----------------
	{
		q=0;
		for(i=0;i<10;i++)
		{
			m=(long int)pow(10,i);	   //p整数个数。q小数个数
			if(j/m!=0)
			 p=i+1;
		}
	
		if(jguo<0) {pbuffer2[15-p]='-';}	  //显示负号
		for(i=15;i>15-p;i--)
		{
			pbuffer2[i]=j%10+0x30;
			j=j/10;	
		}
	}
	else //---------小数和整数部分都有---------------------------
	{
		p=1;
		q=9;
		xs=xsj*(long int)pow(10,9);
		while(xs%10==0)
		{
			xs=xs/10;
			q--;	
		}	        //取小数个数
		p=0;
		for(i=0;i<10;i++)
		{
			m=(long int)pow(10,i);	   //p整数个数。q小数个数
			if(j/m!=0)
			 p=i+1;
		}
		xs=xsj*(long int)pow(10,q);
		 for(i=15;i>15-q;i--)
		{
			pbuffer2[i]=xs%10+0x30;
			xs=xs/10;	
		}
		pbuffer2[15-q]='.';
		if(jguo<0) pbuffer2[15-q-p-1]='-';
		for(i=15-q-1;i>15-q-p-1;i--)
		{
			pbuffer2[i]=j%10+0x30;
			j=j/10;	
		}
		if(q>6)
		{
			n=q-6;
			for(i=0;i<n;i++)
				moveright(2);
			while(pbuffer2[15]==0x30)	    //小数点后的0不显示
			{
				moveright(2);
			}
		}		
	}
	pflag=1;	 //刷屏标志置1
}
//======================================================
//连运算的上下两行显示转换
//======================================================
void exchangexx(void)
{
	uchar i,j;
	j=0;
	while(pbuffer2[j]==0)
		j++;
	for(i=0;i<16;i++)
	{
		if(j<16)
		pbuffer1[i]=pbuffer2[j++];
		else pbuffer1[i]=0;	
	}

	for(i=0;i<16;i++)
	{
		pbuffer2[i]=0;
	}
	pbuffer2[15]=0x30;
	k=0;
	while(pbuffer1[k++]!=0);	//取光标位置
	k--;

	pflag=1;       //刷屏标志置1
}

⌨️ 快捷键说明

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