return(i<<2)+(j+1);//返回键值1-16
}
delayms(5);//延时5ms
}
return0;//无按键返回
}
//=======================================================
//给键值定义值
//=======================================================
ucharscanzhi(void)
{
ucharzhi,k;
k=keys();
switch(k)
{
case0:
zhi=27;break;
case1:
zhi=7;break;
case2:
zhi=8;break;
case3:
zhi=9;break;
case4:
zhi=24;break;///
case5:
zhi=4;break;
case6:
zhi=5;break;
case7:
zhi=6;break;
case8:
zhi=23;break;//*
case9:
zhi=1;break;
case10:
zhi=2;break;
case11:
zhi=3;break;
case12:
zhi=22;break;//-
case13:
zhi=26;break;//nc
case14:
zhi=0;break;
case15:
zhi=25;break;//=
case16:
zhi=21;break;//+
}
return(zhi);
}
//============================================================
voidkeyscan(void)
{
ucharkey;
key=scanzhi();
if(key!
=27)//------有无按键
{
if(key<=9)//-----------------------数字输入------------------
{
pflag=1;
sfflag|=0x01;
if(qflag==1)
{
k=0;
clearplay(3);
bczs=0;
qflag=0;
}
pbuffer1[k++]=0x30+key;
bczs=bczs*10+key;
}//-----------------------------------------------------------
elseif(key>20)//------符号输入
{
pflag=1;
switch(key)
{
case21:
jiahander();break;//+
case22:
jianhander();break;//-
case23:
chenghander();break;//*
case24:
chuhander();break;///
case25:
if(sfflag==0x01)break;
if(qflag==1){sfflag=0;break;}
czshu=bczs;jishuan();sfflag=0x01;pbuffer1[k++]='=';break;//=
case26:
bczs=0;jguo=0;bczshu=0;czshu=0;sfflag=0;
clearplay(3);k=0;qflag=0;jsfuhao=0;break;//nc
}
}
while(scanzhi()!
=27);
}
}
//=======================================================
//等号处理函数
//=======================================================
voidjishuan(void)
{
switch(jsfuhao)
{
case1:
jguo=bczshu+czshu;jchangep();break;
case2:
jguo=bczshu-czshu;jchangep();break;
case3:
jguo=bczshu*czshu;jchangep();break;
case4:
jguo=bczshu/czshu;jchangep();break;
}
jsfuhao=0;
qflag=1;
}
//=======================================================
//加号处理函数
//=======================================================
voidjiahander(void)
{
if(sfflag>=0x82)return;
if((sfflag&0x80)!
=0)
{
k--;
pbuffer1[k++]='+';
jsfuhao=1;
return;
}
if(qflag==1)
{
qflag=0;exchangexx();
bczshu=jguo;bczs=0;pbuffer1[k++]='+';
}
else
{
bczshu=bczs;bczs=0;pbuffer1[k++]='+';
}
sfflag|=0x80;
sfflag+=0x01;
jsfuhao=1;
}
//=======================================================
//减号处理函数
//=======================================================
voidjianhander(void)
{
if(sfflag>=0x82)return;
if((sfflag&0x80)!
=0)
{
k--;
pbuffer1[k++]='-';
jsfuhao=2;
return;
}
if(qflag==1)
{
qflag=0;exchangexx();
bczshu=jguo;bczs=0;pbuffer1[k++]='-';
}
else
{
bczshu=bczs;bczs=0;pbuffer1[k++]='-';
}
sfflag|=0x80;
sfflag+=0x01;
jsfuhao=2;
}
//=======================================================
//乘号处理函数
//=======================================================
voidchenghander(void)
{
if(sfflag>=0x82)return;
if((sfflag&0x80)==0x80)
{
k--;
pbuffer1[k++]='*';
jsfuhao=3;
return;
}
if(qflag==1)
{
qflag=0;exchangexx();
bczshu=jguo;bczs=0;pbuffer1[k++]='*';
}
else
{
bczshu=bczs;bczs=0;pbuffer1[k++]='*';
}
sfflag|=0x80;
sfflag+=0x01;
jsfuhao=3;
}
//=========================================================
//除号处理函数
//=========================================================
voidchuhander(void)
{
if(sfflag>=0x82)return;
if((sfflag&0x80)!
=0)
{
k--;
pbuffer1[k++]='/';
jsfuhao=4;
return;
}
if(qflag==1)
{
qflag=0;exchangexx();
bczshu=jguo;bczs=0;pbuffer1[k++]='/';
}
else
{
bczshu=bczs;bczs=0;pbuffer1[k++]='/';
}
sfflag|=0x80;
sfflag+=0x01;
jsfuhao=4;
}
Lcd1602.c
/*********************************************************
LCD1602的驱动程序
**********************************************************/
#include
#include"work.h"
#include
//===========================================================
//延时约1毫秒
//===========================================================
voiddelayms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
//===========================================================
//lcd读忙标志
//===========================================================
ucharlcdbusy()
{
bitresult;
lcd_rs=0;
lcd_rw=1;
lcd_en=1;
delayms
(1);
result=(bit)(P0&0x80);
lcd_en=0;
return(result);
}
//============================================================
//"写数据函数"
voidwritedata(ucharwrdata1)//"写数据函数"
{
while(lcdbusy());
lcd_rs=1;//writedata
lcd_rw=0;
lcd_en=1;
DQ=wrdata1;
delayms(5);
lcd_en=0;
}
//============================================================
//"写命令函数"
//============================================================
voidwritecom(ucharcomd)//"写命令函数"
{
while(lcdbusy());
lcd_rs=0;
lcd_rw=0;
lcd_en=1;
DQ=comd;
delayms(5);
lcd_en=0;
}
/**********************************************************
"写字符串函数"
**********************************************************
voidwritestr(uchar*p)//"无地址,写之前要先写一个地址"
{
uchari;
i=0;
while(p[i]!
='\0')
{
writedata(p[i]);
i++;
}
}*///---------此函数没有调用过,故注释掉--------------
//*******************"初始化函数"********************************
voidlcdinit(void)
{writecom(0x38);//"5*8双行显示"
delayms(5);
writecom(0x06);
delayms(5);
writecom(0x0c);
delayms(5);
writecom(0x01);//"清屏"
writecom(0x80);
}
//================================================================
//显示清除
//================================================================
voidclearplay(ucharx)
{
uchari;
if(x==1)
{
for(i=0;i<16;i++)
pbuffer1[i]=0;
}
elseif(x==2)
{
for(i=0;i<16;i++)
pbuffer2[i]=0;
}
elseif(x==3)
{
for(i=0;i<16;i++)
{
pbuffer1[i]=0;
pbuffer2[i]=0;
}
}
pbuffer2[15]=0x30;
pflag=1;
}
//=================================================================
//刷全屏:
进行一次全屏的刷写
//=================================================================
voiddisplayall(void)
{
uchari;
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,移第二行。
//==========================================================
voidmoveright(ucharflag)
{
uchari;
if(flag==1)
{
for(i=15;i>0;i--)
pbuffer1[i]=pbuffer1[i-1];
pbuffer1[0]=0;
}
elseif(flag==2)
{
for(i=15;i>0;i--)
pbuffer2[i]=pbuffer2[i-1];
pbuffer2[0]=0;
}
}
//=====================================================
//功能:
结果显示传换
//说明:
显示的结果小数部分是六位的,显示的只是表像结果,
//当进行连运算时,结果就不对了,显示结果没有更改上一次的计算结果
//=====================================================
voidjchangep(void)//结果显示传换
{
uchari,p,q;//i循环变量,p整数位数,q小数位数
ucharn;
longintj,m,xs;//
floatxsj,jguo1;
if(jguo<0)jguo1=-jguo;
elsejguo1=jguo;
j=jguo1;//取整数部分
xsj=jguo1-j;//取小数部分
p=0;
q=0;
if(j==0)//----------无整数---------------------
{
p=1;
q=9;
xs=xsj*(longint)pow(10,9);
while(xs%10==0)
{
xs=xs/10;
q--;
}//取小数个数
xs=xsj*(longint)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;imoveright
(2);
while(pbuffer2[15]==0x30)//小数点后的0不显示
{
moveright
(2);
}
}
}
elseif(xsj<0.000000002)//-----------无小数----------------
{
q=0;
for(i=0;i<10;i++)
{
m=(longint)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*(longint)pow(10,9);
while(xs%10==0)
{
xs=xs/10;
q--;
}//取小数个数
p=0;
for(i=0;i<10;i++)
{
m=(longint)pow(10,i);//p整数个数。
q小数个数
if(j/m!
=0)
p=i+1;
}
xs=xsj*(longint)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;imoveright
(2);
while(pbuffer2[15]==0x30)//小数点后的0不显示
{
moveright
(2);
}
}
}
pflag=1;//刷屏标志置1
}
//======================================================
//连运算的上下两行显示转换
//======================================================
voidexchangexx(void)
{
uchari,j;
j=0;
while(pbuffer2[j]==0)
j++;
for(i=0;i<16;i++)
{
if(j<16)
pbuffer1[i]=pbuffer2[j++];
elsepbuffer1[i]=0;
}
for(i=0