【Proteus仿真】【Arduino单片机】简易计算器设计

news2024/12/23 13:49:18

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、4*4矩阵键盘等。
主要功能:
系统运行后,操作矩阵按键可实现简单四则运算。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/

#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

long x,time,timex,a,b,c;
int menu;/*定义变量*/

LiquidCrystal_I2C lcd(0x27,16,2);/*定义LCD地址*/ 
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = 
{
  {'1','2','3','+'},
  {'4','5','6','-'},
  {'7','8','9','*'},
  {'C','0','=','/'}
};
byte rowPins[ROWS] = {9,8,7,6}; 
byte colPins[COLS] = {5,4,3,2}; /*初始化4*4小键盘*/
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );/*定义4*4小键盘*/
void cleanxy(int x,int y)
{
  for(int i=0;i<x;i++)
  {
    lcd.setCursor(i,y);
    lcd.print(" ");
  }
}
void clean()
{
    b=0;
    a=0;
    c=0;
    Serial.println("clean");
    x=0;
    lcd.setCursor(0,0);
    lcd.print("                ");
    lcd.setCursor(0,1);
    lcd.print("                ");  
}
void compute(char key)
{
  if(key>='0'&&key<='9')
  {
    a=a*10+(key-'0');
    Serial.println(a);
    lcd.setCursor(0,0);
    lcd.print(a);
  }
  if(key=='+')
  {
    b=a;
    a=0;
    Serial.println("+");
    x=1;
    lcd.setCursor(12,0);
    lcd.print("+");
    cleanxy(11,0);
  }
  if(key=='-')
  {
    b=a;
    a=0;
    Serial.println("-");
    x=2;
    lcd.setCursor(12,0);
    lcd.print("-");
    cleanxy(11,0);
  }
  if(key=='*')
  {
    b=a;
    a=0;
    Serial.println("*");
    x=3;
    lcd.setCursor(12,0);
    lcd.print("*");
    cleanxy(11,0);
  }
  if(key=='/')
  {
    b=a;
    a=0;
    Serial.println("/");
    x=4;
    lcd.setCursor(12,0);
    lcd.print("/");
    cleanxy(11,0);
  }
  if(key=='=')
  {
    cleanxy(16,0);
    Serial.println("=");
    lcd.setCursor(0,1);
    lcd.print("=");
    if(x==1)
    {
      Serial.println(a+b);
      lcd.setCursor(1,1);
      lcd.print(a+b);
    }
    if(x==2)
    {
      Serial.println(b-a);
      lcd.setCursor(1,1);
      lcd.print(b-a);
    }
    if(x==3)
    {
      Serial.println(a*b);
      lcd.setCursor(1,1);
      lcd.print(a*b);
    }
    if(x==4)
    {
      Serial.println(b/a);
      lcd.setCursor(1,1);
      lcd.print(b/a);
    }
    a=0;
    b=0;
    x=0;
  }
  if(key=='C')
  {
      clean();
      lcd.setCursor(0,0);
      lcd.print("clean");
      delay(1000);
      clean();
  }
}
void compute2(char key)
{
  if(key>='0'&&key<='9')
  {
    a=a*10+(key-'0');
    Serial.println(a);
    lcd.setCursor(0,0);
    lcd.print(a);
  }
  if(key=='+')
  {
    b=a;
    a=0;
    Serial.println("^");
    x=1;
    lcd.setCursor(12,0);
    lcd.print("^");
    cleanxy(11,0);
  }
  if(key=='-')
  {
    b=a;
    a=0;
    Serial.println("sqrt");
    x=2;
    lcd.setCursor(0,0);
    lcd.print("stop input please");
    delay(2000);
    cleanxy(12,0);
    lcd.setCursor(12,0);
    lcd.print("sqrt");
  }
  if(key=='*')
  {
    b=a;
    a=0;
    Serial.println("sin");
    x=3;
    lcd.setCursor(0,0);
    lcd.print("stop input please");
    delay(2000);
    cleanxy(13,0);
    lcd.setCursor(13,0);
    lcd.print("sin");
  }
  if(key=='/')
  {
    b=a;
    a=0;
    Serial.println("tan");
    x=4;
    lcd.setCursor(0,0);
    lcd.print("stop input please");
    delay(2000);
    cleanxy(13,0);
    lcd.setCursor(13,0);
    lcd.print("tan");
  }
  if(key=='=')
  {
    cleanxy(16,0);
    Serial.println("=");
    lcd.setCursor(0,1);
    lcd.print("=");
    if(x==1)
    {
      Serial.println(pow(b,a));
      lcd.setCursor(1,1);
      lcd.print(pow(b,a));
    }
    if(x==2)
    {
      double sum;
      sum=sqrt(b);
      Serial.println(sum);
      lcd.setCursor(1,1);
      lcd.print(sum);
    }
    if(x==3)
    {
      Serial.println(sin(b));
      lcd.setCursor(1,1);
      lcd.print(sin(b));
    }
    if(x==4)
    {
      Serial.println(tan(b));
      lcd.setCursor(1,1);
      lcd.print(tan(b));
    }
    a=0;
    b=0;
    x=0;
  }
  if(key=='C')
  {
      clean();
      lcd.setCursor(0,0);
      lcd.print("clean");
      delay(1000);
      clean();
  }
}



三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1190401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【修车案例】一波形一案例(9)

故障车型&#xff1a;捷豹X-Type 故障现象&#xff1a;发动机故障指示灯点亮&#xff0c;加速时动力不足&#xff0c;扫描工具显示EGR阀和涡轮增压器增压控制位置传感器电路故障 示波器诊断&#xff1a;检测增压控制位置传感器电路的完整性 A通道 - 增压控制执行电机电源电压B通…

20行JS代码实现屏幕录制

在开发中可能有遇到过屏幕录制的需求&#xff0c;无论是教学、演示还是游戏录制&#xff0c;都需要通过屏幕录制来记录和分享内容。一般在App内H5页基于客户端能力实现的较多&#xff0c;现在浏览器中的 MediaRecorder 也提供了这种能力。MediaRecorder 是一种强大的技术&#…

【JS】scrollTop+scrollHeight+clientTop+clientHeight+offsetTop+offsetHeight

scrollTop、scrollHeight、clientTop、clientHeight、offsetTop以及offsetHeight 1. scrollTop 与 scrollHeight 1.1 scrollTop scrollTop 是这六个属性中唯一一个可写的属性。 Element.scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数。 一个元素的 scrollT…

2023年破圈:盘点11个新零售商业模式,永远不再打商业价格战

2023年破圈&#xff1a;盘点11个新零售商业模式&#xff0c;永远不再打商业价格战 前沿&#xff1a;纵观今年互联网各种类型项目&#xff0c;基本都是又短又快&#xff0c;但依然也有风靡的短跑冠军&#xff0c;那么互联网的项目能否跑的长久&#xff0c;是否是商业模式的原因&…

Linux学习第37天:Linux I2C 驱动实验:哥俩好

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 世界上的很多事物都是成双成对出现的。也包括在驱动开发的过程中&#xff0c;比如I2C中其实就是数据线和时钟线的相互配合才能完成的。 I2C常用于连接各种外设、…

开发知识点-Django

Django 1 了解简介2 Django项目结构3 url 地址 和视图函数4 路由配置5 请求及响应6 GET请求和POST请求查询字符串 7 Django设计模式及模板层8 模板层-变量和标签9 模板层-过滤器和继承继承 重写 10 url反向解析11 静态文件12 Django 应用及分布式路由创建之后 注册 一下 13 模型…

[MySQL] MySQL库的基础操作

文章目录 一、数据库的创建 1、1 库的创建 1、2 字符集与校验规则 1、2、1 查看字符集与校验规则 1、2、2 字符集与校验规则的设置 1、2、3 校验规则对数据库的影响 二、数据库的操作 2、1 查看数据库 2、2 删除数据库 2、3 修该数据库 2、4 数据库删除和备份 2、5 显示创建语…

基于OpenFOAM求解器二次开发

OpenFOAM&#xff08;Open Field Operation and Manipulation&#xff09;是一个开源的计算流体动力学&#xff08;CFD&#xff09;软件包。它提供了各种模拟和建模工具&#xff0c;用于研究和解决复杂的流体流动问题。 OpenFOAM提供了一个强大的求解器库&#xff0c;可以用于…

金融信贷行业如何准确——大数据精准定位获客渠道

通过大数据精准获客&#xff0c;不仅可以及时拦截网址浏览量&#xff0c;还可以访问移动贷款应用软件的高频活跃客户和新注册客户。此外&#xff0c;通过大数据进行准确的客户获取&#xff0c;还可以获得电话座机号码的实时通信记录&#xff0c;捕捉小程序应用程序和关键词搜索…

Kafka中遇到的错误:

1、原因&#xff1a;kafka是一个去中心化结果的&#xff0c;所以在启动Kafka的时候&#xff0c;每一个节点上都需要启动。 启动的命令&#xff1a;kafka-server-start.sh -daemon /usr/local/soft/kafka_2.11-1.0.0/config/server.properties

Windows 根据dll生成 lib文件

假设我们现在只有dll,没有lib ,因此有源码但是在Visual Studio 20XX中代码确编译不过去,因为缺少lib文件。 接下来,黄强老师来帮大家演示,如何从dll 反推 lib文件,打开这个工具 第一步,查看一下大概的函数,确认dll有你想要的函数 dumpbin /exports 你的.dll > f…

贺天下功夫酱酒闪耀亮相2023佛山秋色系列活动

11月1日至5日&#xff0c;2023年广东非遗周暨佛山秋色巡游系列活动在佛山举行&#xff0c;以“品味佛山 秋醉岭南”为主题&#xff0c;好戏连台。贵州贺天下酒业独家赞助佛山祖庙秋祭、乡饮酒礼&#xff0c;还全面参与佛山秋色巡游、佛山非遗美食展、佛山非遗音乐会等多个活动&…

vue3 - swiper插件 实现PC端的 视频滑动功能(仿抖音短视频)

swiper官网 ​​​​​​swiper属性/组件查询 vue中使用swiper 步骤&#xff1a; ① npm install swiper 安装 ② 基础模板&#xff1a; <div><swiper class"swiper-box" :direction"vertical":grabCursor"true" :mousewheel"tr…

强化学习中广义策略迭代

一、广义策略迭代 策略迭代包括两个同时进行的交互过程&#xff0c;一个使价值函数与当前策略保持一致&#xff08;策略评估&#xff09;&#xff0c;另一个使策略在当前价值函数下变得贪婪&#xff08;策略改进&#xff09;。在策略迭代中&#xff0c;这两个过程交替进行&…

在Word中优雅的给公式编号,且自动更新

本文适用情景&#xff1a; 使用Word插入公式&#xff1b;需要给公式增加编号&#xff1b;且在正文中引用&#xff0c;支持自动更新序号。 Word自带公式编号 1 Word自带公式编辑器1.1 问题1.2 原因完美解决 2 MathType公式编辑器end: 后记&#xff1a; 1 Word自带公式编辑器 或…

投资自己,成就未来——人大女王金融硕士助力您成为金融领域的佼佼者

在这个日新月异的时代&#xff0c;金融行业的发展日益繁荣&#xff0c;对于金融人才的需求也越来越大。为了应对这一挑战&#xff0c;越来越多的人选择投身金融领域&#xff0c;提升自己的专业素养。而中国人民大学女王金融硕士项目&#xff0c;正是为了满足这一需求而设立的&a…

接口测试系列之——接口安全测试

“开源 Web 应用安全项目”(OWASP)在 2019 年发布了 API 十大安全风险 《OWASP API 安全 Top10》&#xff1a;失效的对象级别授权、失效的用户身份验证、过 度的数据暴露、资源缺乏和速率限制、失效的功能级授权、批量分配、安全配置 错误、注入、资产管理不当、日志和监视不足…

进程管理(一)

程序执行分析及前趋图 前驱图是有向图。 P2的执行是以P1的执行完成为条件的,或者P2是依赖P1的。 P1的有向边指向P2。 程序顺序执行 程序并发执行 I输入,C计算,P输出 第二道程序的输入和第一道程序的计算是同时进行。斜着是一个程序。 进程的定义及特征 <

WMS仓储管理系统中常见的波次划分策略

在如今高度竞争的物流行业中&#xff0c;提高订单处理效率和资源利用率是企业追求的关键目标。为了实现这些目标&#xff0c;一种被广泛应用的方法是采用拣货波次计划。本文将详细解析拣货波次计划的概念、意义以及在WMS仓储管理系统中的实现过程。 拣货波次计划是一个将不同订…