51单片机计算机 原理图,51单片机计算机源码+proteus仿真图

本文介绍了一款嵌入式系统的计算器应用,使用C语言实现,能处理浮点数运算,并包含错误检查和输入解析功能。通过`keyscanf.h`、`calc.h`等库,实现了加减乘除运算及符号输入,同时展示了LCD12864屏幕显示和运算结果的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

#include

#include "keyscanf.h"

#include "calc.h"

#include "lcd12864.h"

#include

bit error = 0;

bit czfFlag = 0;                //当前输入是否为运算符

bit float_flag = 0;                //输入是否浮点数

bit fs_flag = 0;                //输入是否浮点数

unsigned char keyValue;                //按键码

unsigned char float_num = 0;        //浮点位数

float number1 = 0.0;

float number2 = 0.0;

float tempNum = 0.0;        //等待运算的数

unsigned char caozuofu = add;

unsigned char tempczf = 'A';        //运算符和临时运算符

unsigned char charNum = 0;

unsigned char czsNum = 0;        //操作数数量

unsigned char weishu = 0;

float rest = 0;

unsigned int sbuf1[255] = {0};

unsigned char jieguo[255] = {0};

void loop111()

{

clac_loop1();

if (error == 1)

{

lcd_showStr(0,0,"卢某提醒:错误",14);

}

else

{

if (charNum > 0)

lcd_showInt(0,0,sbuf1,charNum);

if (caozuofu == 40)

lcd_showChars(1,0,jieguo,9);

}

}

void clac_loop1()

{

keyValue = getkey();

if (keyValue < 10)

{

float temp = 0.0;

float czstemp = czsNum == 0 ? number1 : number2;

sbuf1[charNum] = keyValue;

charNum++;

czstemp = czfFlag == 1 ? 0.0 : czstemp;

if (float_flag == 0)

{

czstemp *= 10;

czstemp += keyValue;

}

else

{

float_num++;

temp = (float)keyValue / (pow(10,float_num));

}

czstemp += temp;

if (tempczf == 'A')

{

if (czsNum == 0)

number1 = czstemp;

else

number2 = czstemp;

}

else

{

tempNum = czstemp;

}

czfFlag = 0;

weishu++;

return ;

}

//        防止重复符号

if (keyValue > 9 && keyValue != 999)

{

if (czfFlag == 1)

return ;

}

//        防止第一个操作数是符号

if (keyValue != 999 &&  keyValue > 6 && charNum == 0)

{

return ;

}

// + -

if (keyValue == 11 || keyValue == 22)

{

sbuf1[charNum] = keyValue == 11 ? 10 : 11;

charNum++;czsNum++;

czfFlag = 1;

//核心

if (isCzf(tempczf))

{

number2 = js(number2, tempNum, tempczf);

tempczf = 'A';

czsNum--;

}

if (czsNum == 2)

{

number1 = js(number1, number2, caozuofu);

czsNum--;

number2 = 0.0;

}

caozuofu = keyValue;

}

// * /

if (keyValue == 33 || keyValue == 43)

{

sbuf1[charNum] = keyValue == 33 ? 12 : 13;

charNum++;

czsNum++;

czfFlag = 1;

if ((tempczf == dvi && tempNum <= 0)|| (caozuofu == dvi && number2 <= 0))

{

error = 1;

}

//核心

if (isCzf(tempczf))

{

number2 = js(number2, tempNum, tempczf);

tempczf = 'A';

czsNum--;

}

if (czsNum == 2)

{

tempczf = keyValue;

}

else

caozuofu = keyValue;

}

//小数点

if (keyValue == 42)

{

//防止输入两个小数点

if (float_flag == 1)

{

return ;

}

float_flag = 1;

sbuf1[charNum] = 14;

charNum++;

}

//等于号

if (keyValue == 40)

{

if ((tempczf == dvi && tempNum <= 0)|| (caozuofu == dvi && number2 <= 0))

{

error = 1;

}

//核心

if (isCzf(tempczf))

{

number2 = js(number2, tempNum, tempczf);

tempczf = 'A';

czsNum--;

}

rest = js(number1, number2, caozuofu);

sbuf1[charNum] = 15;

charNum++;

//结果转换成字符数组

sprintf(jieguo,"%f",rest);

caozuofu = 40;

float_flag = 0;

float_num = 0;

}

if (rest > 99999999 || float_num > 8 || weishu > 8)

{

error = 1;

return;

}

//复位

if (isCzf(keyValue))

{

float_flag = 0;

float_num = 0;

weishu = 0;

}

}

bit isCzf(unsigned char n)

{

return (bit)(n == add || n == sub || n == mul || n == dvi || n == equal);

}

float js(float a, float b, unsigned char c)

{

switch (c)

{

case add:

return a+b;

case sub:

return a-b;

case mul:

return a*b;

case dvi:

return a/b;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值