2024秋季西电线上A测-题目3-网信院专享测试❤
本想“都大四了还折磨人随便水水算了”,直接看csdn前人栽树就好——
结果你院保密意识一级强,隔壁计院年年有人发资料这里却鸦雀无声
一、题目要求
二、设计思路
步骤依次为:(1)连接电路
(2)根据连接的引脚号,在Arduino IDE 设计相应的代码
(3)仿真软件中,对Arduino UNO指定对应的程序,执行仿真
1. 电路连接
打开 Proteus,使用题目提供的模板文件,双击绿色圆圈,填写对应的引脚号,即可完成无实线连接。
命名范围为IO2-IO19
例如:LED从左到右依次为IO10-IO5
纵行填写IO18-IO15; 横行为IO14-IO11
并将你填写的序号替换接下来的源码部分
2. 设计代码
这一步是核心,也是需要读者自行学习并操作的地方,(因为A测有查重
我们先分析需求:
2.1 Arduino IDE的使用
1. 点击File---Preferences
2. 点击工具--管理库:
搜索keypad进行安装:
3. 指定开发板:选择COM1,UNO型号。
2.2 计算器源码实现
计算表达式函数需要读者自行实现,方法为利用操作数栈以及运算符栈,先计算乘除,再计算加减。
它没有自带Stack.h (虽然可以下载),可以使用数组模拟栈。
可参考以下文章或chatGPT
#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 编译并生成文件
在完成源代码evaluate()的编写后
先编译,如果语法无报错,再点这里面的“导出已编译的二进制文件”
在终端里找到对应的目录(由于在appData里,是隐藏文件夹)
在仿真软件中,双击UNO芯片,将程序文件选为获取到的.ino.hex文件路径。
三. 执行仿真
点击仿真软件左下角的执行:
那么这时候可能会出现一些问题,最常见的是
1.键盘荧幕亮,但不显示初始化字符——
(1)荧幕接线和源代码内的设定没有一一对应
(2)实际填写范围是IO2-IO19(初始文章版本写的是IO0-IO19)
2.荧幕亮,且显示初始化字符,但点了键盘没反应——
(1)键盘接线和源代码内的设定没有一一对应
3. 得不到正确计算结果
(1)evaluate()编写不正确