单片机简易计算器程序代码.docx
- 文档编号:9878836
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:18
- 大小:18.21KB
单片机简易计算器程序代码.docx
《单片机简易计算器程序代码.docx》由会员分享,可在线阅读,更多相关《单片机简易计算器程序代码.docx(18页珍藏版)》请在冰豆网上搜索。
单片机简易计算器程序代码
#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(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 简易 计算器 程序代码