计算器液晶显示.docx

上传人:b****7 文档编号:9250397 上传时间:2023-02-03 格式:DOCX 页数:24 大小:62.01KB
下载 相关 举报
计算器液晶显示.docx_第1页
第1页 / 共24页
计算器液晶显示.docx_第2页
第2页 / 共24页
计算器液晶显示.docx_第3页
第3页 / 共24页
计算器液晶显示.docx_第4页
第4页 / 共24页
计算器液晶显示.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

计算器液晶显示.docx

《计算器液晶显示.docx》由会员分享,可在线阅读,更多相关《计算器液晶显示.docx(24页珍藏版)》请在冰豆网上搜索。

计算器液晶显示.docx

计算器液晶显示

key.c

/**********************************************************

按键相关处理程序

**********************************************************/

#include

#include"work.h"

//=========================================================

voidjiahander(void);

voidjianhander(void);

voidchenghander(void);

voidchuhander(void);

//==========================================================

//键盘扫描函数返回键值1-16

//==========================================================

ucharkeys(void)

{

unsignedcharrecode,i,j;

for(i=0;i<4;i++)

{

KEY=~(0x01<

recode=KEY>>4;

if(recode<0x0f)

{

for(j=0;j<4;j++)

{if(!

(recode&0x01<

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;i

moveright

(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;i

moveright

(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1