4位数简易计算器.docx
- 文档编号:26209060
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:54
- 大小:715.99KB
4位数简易计算器.docx
《4位数简易计算器.docx》由会员分享,可在线阅读,更多相关《4位数简易计算器.docx(54页珍藏版)》请在冰豆网上搜索。
4位数简易计算器
《开放式单片机应用系统专题设计》
一.任务要求
1.可以进行简单的+-×÷四则运算。
2.参与运算的数据可以是整数,也可以是小数
3.有运算错误提示功能和输入限位功能(声光提示)
4.其它指标可参考现有的计算器。
二、功能特点与使用说明
功能特点:
该运算器可以进行整数和小数的四则运算,当运算错误时和输入位超标时会发生声光提示。
使用说明:
键盘上0~9为数字按键,F1代表小数点,F2代表等号,F6,F5,F4,F3分别代表+,-,×,÷。
有按键输入即可进行运算。
三、方案设计
1,资源分配:
全局变量数组:
reg1[4],reg2[4]分别保存第一次输入的数和第次次输入的数的位数字。
全局变量数组:
dot1[4],dot2[4]分别保存第一次输入和第二次输入的数的小数点的位置。
如第一次输入的数为4.123,则reg1[4]={3,2,1,4},dot1[4]={0,0,0,1}
全局变量数组:
dispreg[4],disdot[4]分别保存显示缓存中数的4位数字
全局变量Cap标记输入数的位数,全局变量keyval保存得到键值,全局变量operate为符号标志符,位变量ready,regindex,dots,getkey分别表示等号标识符,输入数顺序标识符,小数点标识符,按键输入标识符。
局部变量数组resnum[4],resdot[4]分别保存计算结果的4位数字和符号。
设计思路:
首先进行初始化后,设计读取键值函数,每读取一次键值,getkey置1,跳出读取键值函数,判断键值:
如果是数字键并且是输入的第一个数,则转入storetoreg1函数保存输入的数字,并调用transtodisreg函数保存到显示缓存的数组中。
并且是输入的第二个数,则转入storetoreg2函数保存输入的数字,并且ready置1,并调用transtodispreg函数保存到显示缓存的数组中.如果是符号键则转入inputoperate函数用operate保存下键值,并且将regindex置1.如果是等号则转入result函数处理,如果ready=0表示输入错误,ready=1则根据operate的值分别转到相应的加减乘除程序中执行。
执行完运算后再转入breakresult函数求出计算结果的每一位和小数点的位置,并调用storetoreg函数保存到显示缓存的数组中。
执行完后按下复位键,显示清零重新进行运算。
显示函数则在中断函数中执行,每隔一段时间定时扫描一次显示缓存的内容,然后显示。
分析与计算:
这个程序算法并不很复杂,主要在于要细分成很多子模块,将存数,显示,计算三大块分开处理,这样不仅思路清晰,而且便于调试。
但是全局变量较多,所占内存较多,在调试的过程中会出现很多问题。
四.流程图
1.main函数
读取键值函数KEY_getvalue
storetoreg1(keyval)键值储存函数,存储到reg[1]
Storetoreg2(keyval)键值储存函数,存储到reg[2]
显示小数点缓存函数inputdot()
显示缓存函数transtodispreg(int*reg,int*dot)
result()执行运算程序
小数点输入判断函数inputoperate();
add()加法函数
减法函数sub()
乘法函数mul()
除法函数div()
获取运算数的函数getreg(int*reg,int*dot)
breakresult(floatresult)求出运算结果各位的函数
Interrupt1()中断函数
Display()
Delay()
Delay1()
clr(int*p)
Error()
五.源程序
#include"C8051F310.h"
#defineucharunsignedchar
ucharcodeduanma[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//显示0~9及小数点的段码
voidstoretoreg1(intnum);
voidstoretoreg2(intnum);
voidinitial();
voidclr(int*p);
voiderror();
voidOscillator_Init();
voidtranstodispreg(int*reg,int*dot);
voiddisplay();
voiddelay();
voidgetres();
voidbreakresult(floatresult);
voidadd();
voidsub();
voiddiv();
voidmul();
sbitp10=P0^0;
intKEY_getvalue();
voidinputdot();
voidresult();
voidinputdot();
voidinputoperate();
voiddelay1();
floatgetreg(int*reg,int*dot);
floatadded,adder;
intdatareg1[4];
intidatareg2[4];
intdatadot1[4];
intidatadot2[4];
uchark;
intcap;//输入的位数
intkeyval;
intdatadispreg[4];
intdatadispdot[4];
intidataoperate;
bdataintmarker;
sbitready=marker^0;
sbitregindex=marker^1;
sbitgetkey=marker^2;
sbitdots=marker^3;
voidInit_Device(void);
voidPCA_Init();
voidPort_IO_Init();
voidmain(){
SP=0x60;
CKCON=0xFA;
Init_Device();
initial();
while
(1)
{while
(1){
keyval=KEY_getvalue();
if(getkey==1){
getkey=0;
//break;
}
break;
}
if(keyval<=9&&keyval>=0){
if(regindex==0){
storetoreg1(keyval);
transtodispreg(reg1,dot1);
}
else{
storetoreg2(keyval);
transtodispreg(reg2,dot2);
}
}
elseif(keyval==10){
inputdot();
if(regindex==0){
transtodispreg(reg1,dot1);
}
else{
transtodispreg(reg2,dot2);
}
}
elseif(keyval>=12&&keyval<=15){
inputoperate();
}
elseif(keyval==11){
result();
}
}
}
/*************************符号操作函数**************************/
voidinputoperate(){
operate=keyval;
regindex=1;
dots=0;
cap=0;
}
/*************************判断运算符号函数**************************/
voidresult(){
if(ready==1){
switch(operate){
case15:
add();
break;
case14:
sub();
break;
case13:
mul();
break;
case12:
div();
break;
}
}
else{
if(operate!
=0){
error();
}
else{
ready=0;
regindex=0;
dots=0;
operate=0;
cap=0;
}
}
}
/*************************运算函数**************************/
voidadd(){
TF0=1;
TR0=0;
added=getreg(reg1,dot1);
adder=getreg(reg2,dot2);
TR0=1;
adder=added+adder;
breakresult(adder);
}
voidsub(){
TF0=1;
TR0=0;
added=getreg(reg1,dot1);
adder=getreg(reg2,dot2);
TR0=1;
adder=added-adder;
breakresult(adder);
}
voidmul(){
TF0=1;
TR0=0;
added=getreg(reg1,dot1);
adder=getreg(reg2,dot2);
TR0=1;
adder=added*adder;
breakresult(adder);
}
voiddiv(){
TF0=1;
TR0=0;
added=getreg(reg1,dot1);
adder=getreg(reg2,dot2);
TR0=1;
adder=added/adder;
breakresult(adder);
}
/*************************求出运算结果各位的函数**************************/
voidbreakresult(floatresult)
{
intresnum[4];
intresdot[4];//这样定义,否则有问题
intres[7];//这样定义,否则有问题
intzheng,zheng1,k,l;
floatxiao;
clr(resnum);
clr(resdot);
res[0]=0;
res[1]=0;
res[2]=0;
res[3]=0;
res[4]=0;
res[5]=0;
res[6]=0;
//intresnum[4]={0};
//intresdot[4]={0};//这样定义,否则有问题
//intres[7]={0};
zheng=(int)result;
xiao=result-zheng;
xiao=xiao*10000+1;
//printf("xiao=%f\n",xiao);
zheng1=(int)xiao;
res[0]=zheng/1000;
res[1]=zheng%1000/100;
res[2]=zheng%100/10;
res[3]=zheng%10;
res[4]=zheng1/1000;
res[5]=zheng1%1000/100;
res[6]=zheng1%100/10;
for(k=0;k<4;k++)
{
if(res[k]!
=0)
{
break;
}
}
if(k<4)
{
resdot[k]=1;
for(l=3;l>=0;l--)
{
resnum[l]=res[k];
//printf("resnum[%d]=%d\n",l,resnum[l]);
k++;
}
}
else//注意为0.25的情况,小数位的位置恒定
{
resdot[3]=1;
for(l=3;l>=0;l--)
{
resnum[l]=res[6-l];
}
}
}
/*************************获取运算的两个数的函数**************************/
floatgetreg(int*reg,int*dot){
intj=0;
floatr;
intb=1;
intm=0;
r=reg[3]*1000+reg[2]*100+reg[1]*10+reg[0];
for(j=0;j<4;j++)
{
if(dot[j]==1)break;
}
if(j!
=4)//如果有小数位,没有小数位则不对r处理
{
for(m=0;m { b=b*10; } r=r/b; } returnr; } /*************************键盘读值函数**************************/ intKEY_getvalue() { inttemp1,temp2,keyNumber; intn; P2=0xf0; temp1=P2; temp1=temp1&0xf0; if(temp1! =0xf0) { delay1(); temp1=P2; if(temp1! =0xf0) { P2=0xfe; temp2=0xfe; getkey=1; for(n=0;n<4;n++) { temp1=P2; temp1=temp1&0xf0; switch(temp1) { case224: keyNumber=n; returnkeyNumber; break; case208: keyNumber=n+4; returnkeyNumber; break; case176: keyNumber=n+8; returnkeyNumber; break; case112: keyNumber=n+12; returnkeyNumber; break; case240: temp2=(temp2<<1)+1; P2=temp2; } } } else { return16; } } else { return16; } returnkeyNumber; } /*************************显示数据缓存函数**************************/ voidstoretoreg1(intnum){ if(cap==0){ clr(reg1); clr(dot1); } if(cap<4){ reg1[3]=reg1[2]; reg1[2]=reg1[1]; reg1[1]=reg1[0]; reg1[0]=num; dot1[3]=dot1[2]; dot1[2]=dot1[1]; dot1[1]=dot1[0]; dot1[0]=0; cap++; } else{ error(); } } voidstoretoreg2(intnum){ ready=1; if(cap==0){ clr(reg2); clr(dot2); } if(cap<4){ reg2[3]=reg2[2]; reg2[2]=reg2[1]; reg2[1]=reg2[0]; reg2[0]=num; dot2[3]=dot1[2]; dot2[2]=dot1[1]; dot2[1]=dot1[0]; dot2[0]=0; cap++; } else{ error(); } } /*************************显示小数点缓存函数**************************/ voidinputdot(){ if(cap==0&®index==0) { clr(reg1); clr(dot1); } elseif(cap==0&®index==1) { clr(reg2); clr(dot2); } if(dots==0){ dots=1; switch(cap){ case0: if(regindex==0){ reg1[0]=0; dot1[0]=1; cap++; } else{ dot2[0]=1; reg2[0]=0; cap++; } break; case1: if(regindex==0){ dot1[0]=1; } else{dot2[0]=1;} break; case2: if(regindex==0){ dot1[0]=1; } else{dot2[0]=1;} break; case3: if(regindex==0){ dot1[0]=1; } else{dot2[0]=1;} break; case4: if(regindex==0){ dot1[0]=1; } else{dot2[0]=1;} break; } } else{ error(); } } voidtranstodispreg(int*reg,int*dot){ inti; TF0=1; TR0=0; for(i=0;i<4;i++) { dispreg[i]=reg[i]; dispdot[i]=dot[i]; } TR0=1; } /*************************显示函数**************************/ voiddisplay(){ intn; TR0=0; if(dispreg[3]==0&&dispdot[3]==0){ P0=0xf0; P1=0; delay(); if(dispreg[2]==0&&dispdot[2]==0){ P0=0xb0; P1=0; delay(); if(dispreg[1]==0&&dispdot[1]==0){ P0=0x70; P1=0; delay(); P0=0x30; n=dispreg[0]; P1=duanma[n]+dispdot[0]; delay(); } else{ P0=0x70; n=dispreg[1]; P1=duanma[n]+dispdot[1]; delay(); P0=0x30; n=dispreg[0]; P1=duanma[n]+dispdot[0]; delay(); } } else{ P0=0xb0; n=dispreg[2]; P1=duanma[n]+dispdot[2]; delay(); P0=0x70; n=dispreg[1]; P1=duanma[n]+dispdot[1]; delay(); P0=0x30; n=dispreg[0]; P1=duanma[n]+dispdot[0]; delay(); } } else{ P0=0xf0; n=dispreg[3]; P1=duanma[n]+dispdot[3]; delay(); P0=0xb0; n=dispreg[2]; P1=duanma[n]+dispdot[2]; delay(); P0=0x70; n=dispreg[1]; P1=duanma[n]+dispdot[1]; delay(); P0=0x30; n=dispreg[0]; P1=duanma[n]+dispdot[0]; delay(); } TR0=1; } /*************************初始化函数**************************/ voidinitial(){ TR0=0; TMOD=0x10; TH0=0xe9;//重置初值 TL0=0x20; //EA=1; ET0=1; P0=0x01; clr(reg1); clr(reg2); clr(dot1); clr(dot2); clr(dispreg); clr(dispdot); cap=0;//输入的位数 operate=0; keyval=0; regindex=0; ge
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 位数 简易 计算器