单片机简易计算器程序代码.docx

上传人:b****1 文档编号:2955107 上传时间:2023-05-05 格式:DOCX 页数:18 大小:18.21KB
下载 相关 举报
单片机简易计算器程序代码.docx_第1页
第1页 / 共18页
单片机简易计算器程序代码.docx_第2页
第2页 / 共18页
单片机简易计算器程序代码.docx_第3页
第3页 / 共18页
单片机简易计算器程序代码.docx_第4页
第4页 / 共18页
单片机简易计算器程序代码.docx_第5页
第5页 / 共18页
单片机简易计算器程序代码.docx_第6页
第6页 / 共18页
单片机简易计算器程序代码.docx_第7页
第7页 / 共18页
单片机简易计算器程序代码.docx_第8页
第8页 / 共18页
单片机简易计算器程序代码.docx_第9页
第9页 / 共18页
单片机简易计算器程序代码.docx_第10页
第10页 / 共18页
单片机简易计算器程序代码.docx_第11页
第11页 / 共18页
单片机简易计算器程序代码.docx_第12页
第12页 / 共18页
单片机简易计算器程序代码.docx_第13页
第13页 / 共18页
单片机简易计算器程序代码.docx_第14页
第14页 / 共18页
单片机简易计算器程序代码.docx_第15页
第15页 / 共18页
单片机简易计算器程序代码.docx_第16页
第16页 / 共18页
单片机简易计算器程序代码.docx_第17页
第17页 / 共18页
单片机简易计算器程序代码.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机简易计算器程序代码.docx

《单片机简易计算器程序代码.docx》由会员分享,可在线阅读,更多相关《单片机简易计算器程序代码.docx(18页珍藏版)》请在冰点文库上搜索。

单片机简易计算器程序代码.docx

单片机简易计算器程序代码

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineulongunsignedlong

sbitlcden=P2^2;//定义引脚E使能

sbitrs=P2^0;

sbitrw=P2^1;

sbitshangdang=P2^7;

chari,temp,num,g=0,f=0,gz=0,ad=0,bd=0,eq=0,qz,k;//gz为跟踪地址,ad,bd分别表示a,b是否按小数点,eq表示是否入过等号

doubleafd=0,bfd=0;//afd,bfd为小数点后个数

floata,b,daan;longc1,c2;//a,第一个数b,第二个数c,得数daan答案

floatdzh;

ucharflag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号

ucharcodetable[]={

7,8,9,0,

4,5,6,0,

1,2,3,0,

0,0,0,0};

ucharcodetable1[]={

7,8,9,0x2f-0x30,//按键标值0x2f-0x30是将字符转化为数字,和后面的0x30+i抵消,得i值

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30//0x01是清屏命令

};

voiddelay(uintz)//延迟函数

{

while(z--);

}

voidwrite_com(ucharcom)//写指令函数

{

delay(1000);

lcden=0;

rs=0;

rw=0;

P0=com;//com指令付给P0口

lcden=1;

delay(20);

lcden=0;

}

voidwrite_date(uchardate)//写数据函数

{

delay(1000);

lcden=0;

rs=1;

rw=0;

lcden=1;

P0=date;

lcden=0;

}

voidinit()//初始化

{

write_com(0x38);//功能设置命令:

8位,2行DDRAM的地址

delay(200);

write_com(0x0e);//显示开,光标开,不闪烁

delay(200);

write_com(0x06);//增量方式不移位

delay(200);

write_com(0x80);//设置访问地址

delay(200);

}

voidxianshi(chari,charh,floatdaan)//c为得数i从最后一位跟踪,H为精确到小数点后几位

{qz=0;k=0;

c1=(long)daan;

c2=(long)((daan-c1)*10000);//1000000为小数点后6位尝试用pow函数答案不理想

if(c2%10>=5)

{c2=(c2/10)+1;

}

else

{c2=c2/10;}

while(c2!

=0)

{

k=c2%10;

if(i

=0)//从小数点最后一位判断是否为0

{qz=1;}

if(qz==1)//如果小数点后不为0输出开始或者到整数

{write_date(0x30+k);}

i++;c2=c2/10;

if(i==h&&qz==1)//设置小数点位数

write_date(0x2e);

}

while(i

{write_date(0x30);i++;if(i==h){write_date(0x2e);}

}///补位显示

if(c1==0)

{write_date(0x30);}

while(c1!

=0)

{

write_date(0x30+c1%10);

c1=c1/10;

}

}

voidgg(chargz)

{write_com(0xc0);write_date(0xfe);write_com(0x80+gz);}

voidkeyscan(void)//键盘扫描程序

{

if(shangdang==0)//上档键

{delay(100);

if(shangdang==0)

{while(shangdang==0);

g=!

g;//g表示那个档位g=0,下档g=1,上档

if(g==1)

{write_com(0xc0);write_date(0x5e);write_com(0x80+gz);}

if(g==0)

{write_com(0xc0);write_date(0xfe);write_com(0x80+gz);}

shangdang=1;

}}

P1=0xfe;//第一行,7,8,9,/或sin

if(P1!

=0xfe)

{

delay(20);//20ms

if(P1!

=0xfe)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

num=0;

break;

case0xd0:

num=1;

break;

case0xb0:

num=2;

break;

case0x70:

num=3;

break;

}

}

while(P1!

=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9'

{

if(flag==0)//没有按过符号键

{if(ad==1)

afd++;

a=a*10+table[num];//a的初值为'0',结果为输入a值

}

else//如果按过符号键

{if(bd==1)

bfd++;

b=b*10+table[num];//b的初值为'0',结果为输入b值

}

}

else//如果按下的是'/'或者SIN

{

flag=1;

if(g==0)

{fuhao=4;i=table1[num];

if(eq==0){gz++;write_date(0x30+i);}

else{write_com(0x01);write_date(0x41);write_date(0x4e);write_date(0x53);write_date(0x30+i);a=daan;gz=gz+4;}

}//4表示除号已按

if(g==1)

{g=0;gg(gz);fuhao=5;if(eq==0){gz=gz+3;write_date(0x53);write_date(0x49);write_date(0x4e);}

else{write_com(0x01);write_date(0x53);write_date(0x49);write_date(0x4e);write_date(0x41);write_date(0x4e);write_date(0x53);b=daan;gz=gz+6;}

}//5表示SIN已按

}

if(num==0||num==1||num==2)//显示开头

{gz++;

i=table1[num];

write_date(0x30+i);}}

P1=0xfd;//第二行4,5,6,7,*或cos

if(P1!

=0xfd)

{

delay(5);

if(P1!

=0xfd)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

num=4;

break;

case0xd0:

num=5;

break;

case0xb0:

num=6;

break;

case0x70:

num=7;

break;

}

}

while(P1!

=0xfd);

if(num==4||num==5||num==6)//如果按下的是'4','5'或'6'

{

if(flag==0)//没有按过符号键

{if(ad==1)

afd++;

a=a*10+table[num];//输入a值

}

else//如果按过符号键

{if(bd==1)

bfd++;

b=b*10+table[num];//输入b值

}

}

else//如果按下的是'*'

{

flag=1;

if(g==0)

{fuhao=3;i=table1[num];if(eq==0){gz++;write_date(0x30+i);}

else{write_com(0x01);write_date(0x41);write_date(0x4e);write_date(0x53);write_date(0x30+i);a=daan;gz=gz+4;}

}//3表示乘号已按

if(g==1)

{g=0;gg(gz);fuhao=6;if(eq==0){gz=gz+3;write_date(0x43);write_date(0x4f);write_date(0x53);}

else{write_com(0x01);write_date(0x43);write_date(0x4f);write_date(0x53);write_date(0x4e);write_date(0x41);write_date(0x4e);write_date(0x53);b=daan;gz=gz+6;}

}//cos已按

}

if(num==4||num==5||num==6)//显示开头

{gz++;i=table1[num];

write_date(0x30+i);}}

P1=0xfb;//第三行1,2,3,-或tan

if(P1!

=0xfb)

{

delay(5);

if(P1!

=0xfb)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

num=8;

break;

case0xd0:

num=9;

break;

case0xb0:

num=10;

break;

case0x70:

num=11;

break;

}

}

while(P1!

=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

{

if(flag==0)//没有按过符号键

{if(ad==1)

afd++;

a=a*10+table[num];

}

else//如果按过符号键

{if(bd==1)

bfd++;

b=b*10+table[num];

}

}

elseif(num==11)//如果按下的是'-'或者'tan'

{

flag=1;

if(g==0)

{i=table1[num];fuhao=2;if(eq==0){gz++;write_date(0x30+i);}

else{write_com(0x01);write_date(0x41);write_date(0x4e);write_date(0x53);write_date(0x30+i);a=daan;gz=gz+4;}

}//2表示减已按

if(g==1)

{g=0;gg(gz);fuhao=7;if(eq==0){write_date(0x54);write_date(0x41);write_date(0x4e);gz=gz+3;}

else{write_com(0x01);write_date(0x54);write_date(0x41);write_date(0x4e);write_date(0x41);write_date(0x4e);write_date(0x53);b=daan;gz=gz+6;}

}//tan已按

}

if(num==8||num==9||num==10)//显示开头

{gz++;i=table1[num];

write_date(0x30+i);}

}

P1=0xf7;//第四行CE或根号,0,=,+或平方

if(P1!

=0xf7)

{

delay(5);

if(P1!

=0xf7)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

num=12;

break;

case0xd0:

num=13;

break;

case0xb0:

num=14;

break;

case0x70:

num=15;

break;

}

}

while(P1!

=0xf7);

switch(num)

{

case12:

//显示按下的是"清零"或者根号

if(g==0)

{

write_com(0x01);

a=0;

b=0;

flag=0;

fuhao=0;

eq=0;

ad=0;bd=0;afd=0;bfd=0;

gz=0;

}

elseif(g==1)//根号

{g=0;gg(gz);fuhao=9;flag=1;if(eq==0){gz++;write_date(0xe8);}

else{write_com(0x01);write_date(0xe8);write_date(0x41);write_date(0x4e);write_date(0x53);b=daan;gz=gz+4;

}

}

break;

case13:

//按下的是"0"或者小数点

gz++;

if(g==0)//0

{

if(flag==0)//没有按过符号键

{if(ad==1)

afd++;

a=a*10;

write_date(0x30);

}

elseif(flag==1)//如果按过符号键

{if(bd==1)

bfd++;

b=b*10;

write_date(0x30);

}

}

if(g==1)//小数点

{write_date(0x2e);

if(flag==0)

{ad=1;}

if(flag==1)

{bd=1;}

g=0;gg(gz);

}

break;

case14:

//按下=计算程序

{eq=1;

write_com(0xcf);//按下等于键,光标前进至第二行最后一个显示处

write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格

i=0;if(ad==1){a=a/pow(10,afd);}////////////////浮点计算X.***

if(bd==1){b=b/pow(10,bfd);}

if(fuhao==1)//符号1+

{daan=a+b;

if(daan<0)

{daan=(-1)*daan;}

xianshi(i,3,daan);

if(a+b<0)

{daan=(-1)*daan;write_date(0x2d);}

write_date(0x3d);}//再写"="

elseif(fuhao==8)//平方上档1号

{daan=a*a;

xianshi(i,3,daan);

write_date(0x3d);}//再写"="

//////////////////----tan计算//////////////////////////////

elseif(fuhao==2)//-下档键2号

{

if(a-b>0)

{daan=a-b;}

else

{daan=b-a;}

xianshi(i,3,daan);

if(a-b<0)

{daan=(-1)*daan;write_date(0x2d);}

write_date(0x3d);//再写"="

}

elseif(fuhao==7)//tan上档2号位置

{dzh=(float)b*3.141592654/180;

daan=tan(dzh);

if(daan<0)

{daan=(-1)*daan;f=1;}

xianshi(i,3,daan);

if(f==0)

write_date(0x3d);

else

{daan=(-1)*daan;write_date(0x2d);write_date(0x3d);}

}

/////////////////*cos计算///////////////////////////////

elseif(fuhao==3)//'*'下档3号位置

{daan=a*b;

if(daan<0)

{daan=(-1)*daan;}

xianshi(i,3,daan);

if(a*b<0)

{daan=(-1)*daan;write_date(0x2d);}

write_date(0x3d);

}

elseif(fuhao==6)//'cos'上档3号位置

{

dzh=(float)b*3.141592654/180;

daan=cos(dzh);

if(daan<0)

{daan=(-1)*daan;f=1;}

xianshi(i,3,daan);

if(f==0)

write_date(0x3d);

else

{daan=(-1)*daan;write_date(0x2d);write_date(0x3d);}

}

//////////////////////////sin计算///////////////////

elseif(fuhao==4)//'/'下档4号位置

{if(b!

=0)

{daan=a/b;

if(daan<0)

{daan=(-1)*daan;}

xianshi(i,3,daan);

if(a/b<0)

{daan=(-1)*daan;write_date(0x2d);}}

else{write_date(0x21);}

write_date(0x3d);

}

elseif(fuhao==5)//'sin'上档4号位置

{

dzh=(float)b*3.141592654/180;

daan=sin(dzh);

if(daan<0)

{daan=(-1)*daan;f=1;}

xianshi(i,3,daan);

if(f==0)

write_date(0x3d);

else

{daan=(-1)*daan;write_date(0x2d);write_date(0x3d);}

}

elseif(fuhao==9)//计算根号

{if(b>=0)

{daan=sqrt(b);

xianshi(i,3,daan);}

else{write_date(0x21);}

write_date(0x3d);

}a=0;b=0;gz=0;ad=0;bd=0;afd=0;bfd=0;f=0;

break;}

case15:

//显示'+'平方

flag=1;

if(g==0)

{fuhao=1;if(eq==0){gz++;write_date(0x30+table1[num]);}

else{write_com(0x01);write_date(0x41);write_date(0x4e);write_date(0x53);write_date(0x30+table1[num]);a=daan;gz=gz+4;}

}//显示'+'

elseif(g==1)

{g=0;gg(gz);fuhao=8;if(eq==0){gz=gz+2;write_date(0x5e);write_date(0x32);}

else{write_com(0x01);write_date(0x41);write_date(0x4e);write_date(0x53);write_date(0x5e);write_date(0x32);a=daan;gz=gz+5;

}

}break;//平方

}

}

P1=0xf0;

}

voidmain()//主函数

{

init();

i=0;

a=0;//第一个参和运算的数

b=0;//第二个参和运算的数

flag=0;//flag表示是否有符号键按下,

fuhao=0;//fuhao表征按下的是哪个符号

P1=0xf0;

shangdang=1;

while

(1)

{keyscan();

}

}

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2