4位数简易计算器.doc
《4位数简易计算器.doc》由会员分享,可在线阅读,更多相关《4位数简易计算器.doc(53页珍藏版)》请在沃文网上搜索。
1、开放式单片机应用系统专题设计 一 .任务要求1.可以进行简单的四则运算。2.参与运算的数据可以是整数,也可以是小数3.有运算错误提示功能和输入限位功能(声光提示)4.其它指标可参考现有的计算器。二、功能特点与使用说明功能特点:该运算器可以进行整数和小数的四则运算, 当运算错误时和输入位超标时会发生声光提示。使用说明:键盘上09为数字按键,F1代表小数点,F2代表等号,F6,F5,F4,F3分别代表,。有按键输入即可进行运算。三、方案设计1,资源分配:全局变量数组:reg14,reg24分别保存第一次输入的数和第次次输入的数的位数字。全局变量数组:dot14,dot24分别保存第一次输入和第二次
2、输入的数的小数点的位置。如第一次输入的数为4.123,则reg14=3,2,1,4,dot14=0,0,0,1全局变量数组:dispreg4,disdot4分别保存显示缓存中数的4位数字全局变量Cap标记输入数的位数,全局变量keyval保存得到键值,全局变量operate为符号标志符,位变量ready,regindex,dots,getkey分别表示等号标识符,输入数顺序标识符,小数点标识符,按键输入标识符。局部变量数组resnum4,resdot4分别保存计算结果的4位数字和符号。设计思路:首先进行初始化后,设计读取键值函数,每读取一次键值,getkey置1,跳出读取键值函数,判断键值:如
3、果是数字键并且是输入的第一个数,则转入storetoreg1函数保存输入的数字,并调用transtodisreg函数保存到显示缓存的数组中。并且是输入的第二个数,则转入storetoreg2函数保存输入的数字,并且ready置1,并调用transtodispreg函数保存到显示缓存的数组中.如果是符号键则转入inputoperate函数用operate保存下键值,并且将regindex置1.如果是等号则转入result函数处理,如果ready=0表示输入错误,ready=1则根据operate的值分别转到相应的加减乘除程序中执行。执行完运算后再转入breakresult函数求出计算结果的每一位
4、和小数点的位置,并调用storetoreg函数保存到显示缓存的数组中。执行完后按下复位键,显示清零重新进行运算。显示函数则在中断函数中执行,每隔一段时间定时扫描一次显示缓存的内容,然后显示。分析与计算:这个程序算法并不很复杂,主要在于要细分成很多子模块,将存数,显示,计算三大块分开处理,这样不仅思路清晰,而且便于调试。但是全局变量较多,所占内存较多,在调试的过程中会出现很多问题。四流程图1.main函数读取键值函数KEY_getvaluestoretoreg1(keyval)键值储存函数,存储到reg1Storetoreg2(keyval)键值储存函数,存储到reg2显示小数点缓存函数inpu
5、tdot()显示缓存函数transtodispreg(int *reg,int *dot)result()执行运算程序小数点输入判断函数inputoperate();add()加法函数减法函数sub()乘法函数mul()除法函数div()获取运算数的函数 getreg(int *reg,int *dot) breakresult(float result)求出运算结果各位的函数Interrupt1()中断函数Display()Delay()Delay1()clr(int *p)Error()五 源程序#include C8051F310.h#define uchar unsigned char
6、uchar code duanma=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6;/显示09及小数点的段码void storetoreg1(int num);void storetoreg2(int num);void initial();void clr(int *p);void error();void Oscillator_Init();void transtodispreg(int *reg,int *dot);void display();void delay();void getres();void breakresult(fl
7、oat result);void add();void sub();void div();void mul();sbit p10=P00;int KEY_getvalue();void inputdot();void result();void inputdot();void inputoperate();void delay1();float getreg(int *reg,int *dot);float added,adder;int data reg14;int idata reg24;int data dot14;int idata dot24;uchar k;int cap; /输入
8、的位数int keyval;int data dispreg4;int data dispdot4;int idata operate;bdata int marker;sbit ready = marker0;sbit regindex = marker1;sbit getkey = marker2;sbit dots=marker3;void Init_Device(void);void PCA_Init();void Port_IO_Init();void main()SP = 0x60;CKCON=0xFA; Init_Device(); initial();while(1)while
9、(1)keyval =KEY_getvalue();if(getkey=1)getkey = 0; /break;break;if(keyval=0) if(regindex=0)storetoreg1(keyval);transtodispreg(reg1,dot1);else storetoreg2(keyval); transtodispreg(reg2,dot2);else if(keyval=10)inputdot();if(regindex=0)transtodispreg(reg1,dot1);else transtodispreg(reg2,dot2);else if(keyv
10、al=12&keyval=15) inputoperate(); else if(keyval =11) result(); /*符号操作函数 */ void inputoperate() operate =keyval;regindex = 1;dots =0;cap =0; /*判断运算符号函数 */ void result()if(ready=1)switch(operate)case 15: add(); break;case 14: sub(); break;case 13: mul(); break;case 12: div(); break;elseif(operate!=0)e
11、rror();elseready =0;regindex = 0;dots =0;operate =0;cap = 0; /*运算函数 */void add()TF0=1;TR0=0;added=getreg(reg1,dot1);adder=getreg(reg2,dot2);TR0=1;adder = added + adder;breakresult(adder);void sub()TF0=1;TR0=0;added=getreg(reg1,dot1);adder=getreg(reg2,dot2);TR0=1;adder = added - adder;breakresult(add
12、er);void mul()TF0=1;TR0=0;added=getreg(reg1,dot1);adder=getreg(reg2,dot2);TR0=1;adder = added * adder;breakresult(adder);void div()TF0=1;TR0=0;added=getreg(reg1,dot1);adder=getreg(reg2,dot2);TR0=1;adder = added / adder;breakresult(adder);/* 求出运算结果各位的函数 */void breakresult(float result) int resnum4; i
13、nt resdot4;/这样定义,否则有问题 int res7;/这样定义,否则有问题 int zheng,zheng1,k,l; float xiao;clr(resnum);clr(resdot); res0=0;res1=0;res2=0;res3=0;res4=0;res5=0; res6=0; /int resnum4=0; /int resdot4=0;/这样定义,否则有问题 /int res7=0; zheng=(int)result; xiao=result-zheng; xiao=xiao*10000+1; /printf(xiao=%fn,xiao); zheng1=(in
14、t)xiao; res0=zheng/1000; res1=zheng%1000/100; res2=zheng%100/10; res3=zheng%10; res4=zheng1/1000; res5=zheng1%1000/100; res6=zheng1%100/10; for(k=0;k4;k+) if(resk!=0) break; if(k=0;l-) resnuml=resk;/ printf(resnum%d=%dn,l,resnuml); k+; else/注意为0.25的情况,小数位的位置恒定 resdot3=1; for(l=3;l=0;l-) resnuml=res6
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 位数 简易 计算器
