📄 51lcd1602+=
字号:
/*********************************************************
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 + -