闲来无事,用手头51单片机做个进制计算器
成品功能:能实现十进制带负数、带小数点的加减乘除,不同进制之间的转换,同一进制之间的加减乘。
开始制作。
思考过程
首先要考虑的就是按键数量了:
我就得出来如下方案:
硬件部分
直接放图
如图所示连接P1接矩阵按键,P3接独立按键。
这里矩阵按键和独立按键怎么测值就不说了。
整数部分的加减乘除
代码如下:
if(fuhao==1)//加 { sprintf(Disp,"%-6.3f",a_l+b_l); //将结果存在数组中方便显示 //spintf将右边的字符串到左边数组中 //%-6.3f为占位符既(1)表示靠左6位保留三位小数的浮点数 lcdwrd_string(Disp,6); //显示 } if(fuhao==2)//减 { sprintf(Disp,"%-6.3f",a_l-b_l); lcdwrd_string(Disp,6); } if(fuhao==3)//乘 { sprintf(Disp,"%-9.4f",a_l*b_l); lcdwrd_string(Disp,9); } if(fuhao==4)//除 { sprintf(Disp,"%-9.4f",a_l/b_l); lcdwrd_string(Disp,9); }
这里直接显示运算结果,就避免了运算过程中产生的小数(两数相除)等数据类型问题。
负数问题
小数问题
有小数点的话,我解决的方法是按完小数点之后记录小数点之后有几位,计算结果之前,让存起来的数乘0.1的多少次方。比如输入的3.1415,小数点之后有四位,存起来的数就是31415再四个0.1。
代码如下:
if(fhao_a==1){a_l = a*pow(0.1,a_wei)*(-1);} //将结果保存到double精度的数中 //有几位小数的话要乘0.1的几次方 //负数的话要成-1 else {a_l = a*pow(0.1,a_wei);} if(fhao_b==1){b_l = b*pow(0.1,b_wei)*(-1);} else {b_l = b*pow(0.1,b_wei);}
部分效果如图。
这样十进制的加减乘除带符号和小数的问题就基本解决完了。
思想
fhao_a = fhao_a*2 + k;
while(biao!=0) //一位一位显示
{
lcdwrd(0x30+biao%2);
biao=biao/2;
}
为啥不做除呐,因为按键不够。一除就会出现小数,没想明白怎么表示。
思想还是以十进制保存,然后再做运算,再转化为相应进制的数输出。按键不够用所以没法做不同进制之间的运算。
效果如图所示:
十六进制减
二进制加
最后附上完整的项目文件。自行下载。
这个项目到这里就算完了。
还有很多不足的地方,希望大佬可以指正。也希望和爱好者交流学习。
禁止转载!!!
QQ:2039723308
VX:Shiboven