单片机计算器源码

上传人:012****78 文档编号:192750365 上传时间:2021-08-19 格式:DOCX 页数:12 大小:197.31KB
返回 下载 相关 举报
单片机计算器源码_第1页
第1页 / 共12页
单片机计算器源码_第2页
第2页 / 共12页
单片机计算器源码_第3页
第3页 / 共12页
单片机计算器源码_第4页
第4页 / 共12页
单片机计算器源码_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《单片机计算器源码》由会员分享,可在线阅读,更多相关《单片机计算器源码(12页珍藏版)》请在金锄头文库上搜索。

1、单片机计算器源码 作者: 日期:12 /*计算机简介:扩展外存,改变缓存数组下标,可计算任意位数字。(现在改大了单片机放不下,够大了扩展计算sin,cos,平方立方很容易,摁键与内部数据接口函数都写好了)有运算优先级识别函数。即先运算乘除,后运算加减。(链表用的不太熟,内存也不够大,否则可识别加括号运算优先级)可通过改变源码确定精确度(小数点后显示几位数字,超出精确度数字随机)每次计算完摁“1”键即可复位再次计算。摁其他键复位后无法正常运算各种刁钻古怪的算应该会让他死机*/#include#include#define uchar unsigned char#define uint unsig

2、ned charuchar code text16=123+456-789*0.=/;/显示uchar sta,i=0,j,in20,in_num=0,yun10,key2,numofnum=1,suani=1;/定义光标位置,循环变量,循环变量,摁键示值数组,运算符号标志数组,输入是否为等于号标志变量,数字的个数变量uchar work10;/定义存放结果各个位数值float fl3=0,final;/欲计算输入数值整合真值数组.数组个数为可一次计算数值的个数与yun下标为该下标减一.即计算十个数有九个运算符号连接.定义最终结果sbit lcden=P26;sbit lcdrs=P27;vo

3、id w_inst(uchar oder);/液晶显示输入命令函数void w_data(uchar dat);/液晶显示输入数据函数void display(uchar x);/显示函数void delay(uint z);/延时函数void move(uint z);/光标移动函数int ctoi(uchar z);/char to int摁键字符转数值各个位整型函数void itof(uchar *in);/int to float各个位整型整合成实际值函数void calcu();/计算最终值函数uchar ftoi(uchar z);/float to int把结果各个位数值取出.z

4、为该函数输出计算结果的精确度uchar itoc(uchar z);/int to char把各个位数值转化为带输出text顺序void init();/液晶初始化函数uchar keyscan();/键盘扫描函数void main()uchar wei;start:init();for(sta=2,j=0;sta+,j+)/sta为光标的位置key2=keyscan();display(key2);move(sta);/不加此函数光标正常一位一位移动.但若输入运算式过长则溢出屏幕inj=ctoi(key2);in_num+;if(key2=14)break;/判断是否输入等号,若输入则跳出取

5、值循环开始计算itof(in);/处理数据为真值,为计算做准备calcu();/计算最终结果wei=ftoi(10);/把最终结果转换为各个位的字符表达,并返回输出字符个数move(17);/把光标移动到第二行准备输出结果for(i=0;iwei-6;i+)/因为ftoi中转换在最后几位有误差(float与int转化造成)所以显示时去掉(wei-6)display(itoc(worki);while(key2=keyscan()/若摁1键则跳出循环再次运算goto start;/回到函数首部uchar itoc(uchar z)/int to char把work中的各个位结果转换为text中对

6、应序号待输出uchar in;switch(z)case 0:in=12;break;case 1:in=0;break;case 2:in=1;break;case 3:in=2;break;case 4:in=4;break;case 5:in=5;break;case 6:in=6;break;case 7:in=8;break;case 8:in=9;break;case 9:in=10;break;case 12:in=7;break;/-case 15:in=13;break;/.return in;uchar ftoi(uchar z)/float to int把最终结果转换为各

7、个位数字,待输出.z为精确度(输出小数点后位数)uchar ii,trans,fu=0;if(final1;ii+,final/=10)/循环取值存入workworkii=(int)(final)%10;for(i=0;i(ii/2);i+)/取的值为倒序,调整位置函数trans=worki;worki=workii-i-1;workii-i-1=trans;for(i=0;i0;i-)/若为负数则各个位向后移一位worki=worki-1;work0=12;/在串首插入负号return ii;void calcu()/计算最终值函数uchar z;for(z=0,i=0;inumofnum-

8、1;i+,z+)/该大循环找出乘除计算优先运算if(yuni=3)|(yuni=4)if(yuni=3)fli=fli*fli+1;numofnum-;i=-1;/计算两数值并放入前一数值空间,需要计算数值减一,并从头判断.elsefli=fli/fli+1;numofnum-;i=-1;for(j=z;j+2=numofnum;j+)/该循环.在计算后把计算的两数字后的数字和运算符都往前移一位成为不间断数组,为下次计算做准备flj+1=flj+2;yunj=yunj+1;for(z=0,i=0;inumofnum-1;i+,z+)/该大循环计算加减if(yuni=1)fli=fli+fli+

9、1;numofnum-;i=-1;/类上循环解释else fli=fli-fli+1;numofnum-;i=-1;for(j=z;j+2=numofnum;j+)/类上循环解释flj+1=flj+2;yunj=yunj+1;final=flnumofnum-1;void itof(uchar *in)uchar z=0,j1=0;/定义各数值在数组中的下标和输入的数值的数目.定义运算符号标志数组及其下标uchar in1;/存放地址所指数值uchar *p_in=in;/指向in数组的指针uchar jia=0,jian=0,chen=0,chu=0,dian=0,den=0;/是否输入加减

10、乘除的标志和运算方法标志for(j=0;jin_num;j+,p_in+)in1=*p_in;/取一位数值计算并把指针指向下一数值switch(in1)case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:if(chen=1)|(chu=1)|(jia=1)|(jian=1)/若当前数值为0-9则进行合并 z+;numofnum+;jia=0;jian=0;chen=0;chu=0;dian=0;suani=1; else if(dian=1)flz=flz+in1*(1/pow(10,suani);suan

11、i+;break; flz=flz*10+in1;break;case 11:jia=1;yunj1+=1;break;/+若当前字符为11-15,则标志运算变量并记录。case 12:jian=1;yunj1+=2;break;/-case 13:chen=1;yunj1+=3;break;/*case 14:chu=1;yunj1+=4;break;/case 15:dian=1;break;/int ctoi(uchar z)/键盘扫描值转换为要计算的各个位数值.11(+)12(-)13(*)14(/)15(.)16(=)uchar in;switch(z)case 0:in=1;break;case 1:in=2;break;case 2:in=3;break;case 3:in=11;break;/+case 4:in=4;break;case 5:in=5;break;case 6:in=6;break;case 7:in=12;break;/-case 8:in=7;break;case 9:in=8;break;case 10:in=9;break;case 11:in=13;break;/*case 12:in=0;break;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 工学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号