2024西电A测:计算器设计

2024秋季西电线上A测-题目3-网信院专享测试❤

c5a7b6c420b84a31a9c5d27634281ed0.png

本想“都大四了还折磨人随便水水算了”,直接看csdn前人栽树就好——

结果你院保密意识一级强,隔壁计院年年有人发资料这里却鸦雀无声


一、题目要求

软件环境:推荐采用 Proteus 8.9 SP2 及以上仿真软件,Arduino IDE。
软件获取可以左转隔壁:
实现功能:使用 Arduino UNO 微控制器,实现一个简易计算器。
系统框图如下:
58ee7245aa804728a2aa0cee8c94eb0a.png
功能:简易计算器通过键盘输入整数和计算符号,Arduino UNO 进行处理,在
LCD 上显示输入的整数、计算符号以及计算结果。
规定:学生自己学号的最左端位为第 1 位。
LCD 第一行显示 自己学号最左端第 1、2 位组成的两位数*学号第 5、6 位组成
的两位数-学号第 9、10、11 位组成的三位数=
LCD 第二行显示 计算结果
两行 LCD 显示均在最右端
示例:学号为 20009101215,LCD 第一行显示: 20*91-215=
LCD 第二行显示: 1605
第一行的“ =”和第二行的“ 5”对齐,并且在最右端

二、设计思路

步骤依次为:(1)连接电路

(2)根据连接的引脚号,在Arduino IDE 设计相应的代码

(3)仿真软件中,对Arduino UNO指定对应的程序,执行仿真

1. 电路连接

打开 Proteus,使用题目提供的模板文件,双击绿色圆圈,填写对应的引脚号,即可完成无实线连接。

命名范围为IO2-IO19

例如:LED从左到右依次为IO10-IO5

纵行填写IO18-IO15; 横行为IO14-IO11

97c7b097c6ad48a381b2407fd4d65367.png

并将你填写的序号替换接下来的源码部分

9254002b276143e0843da70ad6a71857.png

2. 设计代码

这一步是核心,也是需要读者自行学习并操作的地方,(因为A测有查重

我们先分析需求:

(1)  使用 Keypad.h【非自带库,需要下载】识别键盘按键,并更新表达式;
(2)  按下等号后解析整个表达式并计算,麻烦之处在于有多个运算符;
(3)  通过 LiquidCrystal.h【自带库】将输入的表达式和计算结果显示在
16x2【16字符一行,两行】的 LCD 显示屏上,结果需要右对齐

2.1 Arduino IDE的使用

1. 点击File---Preferences

2dcb0cf966e14efb9618cddf9f612398.png

1f22864960ef4fecadbc03452650e8ff.png

2. 点击工具--管理库:

5ce134dca32e4375b4b27e71b34dea39.png

搜索keypad进行安装:

c3626a1970a34340a14d98745043344e.png

3. 指定开发板:选择COM1,UNO型号。

9d419ebf0af04cb0988fa9b2d3594a30.png

7ef87449d34a4771b1a8ecaa21f1cde9.png

2.2 计算器源码实现

计算表达式函数需要读者自行实现,方法为利用操作数栈以及运算符栈,先计算乘除,再计算加减。

它没有自带Stack.h (虽然可以下载),可以使用数组模拟栈

可参考以下文章或chatGPT

栈(stack)-栈实现简单计算器-CSDN博客

#include <LiquidCrystal.h> 
#include <Keypad.h>


LiquidCrystal lcd(10, 9, 8, 7, 6, 5); // 绑定LCD屏幕在电路图上的注脚,从左往右

const byte ROWS = 4; //这一部分通过阅读KeyPad.h官方文档配置即可。
const byte COLUMNS = 4;
char keys[ROWS][COLUMNS] = {
    {'7', '8', '9', '/'},
    {'4', '5', '6', '*'},
    {'1', '2', '3', '-'},
    {'C', '0', '=', '+'} }; // 键盘键位映射
byte pin_rows[ROWS] = {18, 17, 16, 15}; // 绑定键盘纵向注脚,从上到下
byte pin_columns[COLUMNS] = {14, 13, 12, 11};  // 绑定键盘横向注脚,从左到右
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_columns, ROWS, COLUMNS); // 写入键盘数据

double lastResult = 0; // 存储上次计算的结果
String input = ""; // 存储运算式


void setup() { //setup是开机时执行一次的代码
  lcd.begin(16, 2);
  lcd.setCursor(9, 0);   // 设置字符最左端的位置,这里是第0行,第9格
  lcd.print("GENSHIN");  // 开机时会在lcd上显示,16-9=7,右对齐
  Serial.begin(9600);  // 串口端号9600不用改
}


void loop() { //loop是每一次按下键盘都会循环一次的代码
    char key = keypad.getKey();
    if (!key) {// 如果没有按键被按下,那么保留原状
        return; 
    }

    if (key == 'C') { //清除
        // 清除输入
        input = "";
        lcd.clear();
        return;
    }

    if (key == '=') {
        // 当按下等号时,计算结果
        if (input.length() > 0) {
            lastResult = evaluate(input);  // 调用函数计算表达式结果
        }
        // 清除之前的输入并显示结果
        input += key;
        lcd.clear();
        lcd.setCursor(16 - String(input).length(), 0); // 右端对齐
        lcd.print(input);

        
        if (lastResult == (int)lastResult) { // 分类讨论,如果结果是整数,按整数输出
          lcd.setCursor(16 - String((int)lastResult).length(), 1);
          lcd.print((int)lastResult);
        }else { // 否则输出浮点数
          lcd.setCursor(16 - String(lastResult).length(), 1);
          lcd.print(lastResult);
        }
        return;
    }
    // 上面两个大if,处理键位为清除/计算的逻辑
    // 不是的话,就添加数字

    input += key; // 添加到表达式中
    //每一次循环都需要先清除屏幕,然后显示新的内容
    lcd.clear();
    lcd.setCursor(16 - String(input).length(), 0); // 让游标从16-length开始,即可右对齐
    lcd.print(input); // 显示当前输入的表达式
}

double evaluate(String expression){ // 这里请读者自行编写
……
}

2.3 编译并生成文件

6f92761709b94fb09bb519f79607a5c8.png

在完成源代码evaluate()的编写后

先编译,如果语法无报错,再点这里面的“导出已编译的二进制文件”

在终端里找到对应的目录(由于在appData里,是隐藏文件夹)

9ae59b94823149469c34f375b06f25d7.png

在仿真软件中,双击UNO芯片,将程序文件选为获取到的.ino.hex文件路径。


三. 执行仿真

点击仿真软件左下角的执行:

7a7874474a6b4f1698dc55d81d9c3952.png

那么这时候可能会出现一些问题,最常见的是

1.键盘荧幕亮,但不显示初始化字符——

(1)荧幕接线和源代码内的设定没有一一对应

(2)实际填写范围是IO2-IO19(初始文章版本写的是IO0-IO19)

2.荧幕亮,且显示初始化字符,但点了键盘没反应——

(1)键盘接线和源代码内的设定没有一一对应

3. 得不到正确计算结果

(1)evaluate()编写不正确

77357380f5654e3dbb35a60a81ed3a69.png

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值