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

文章目录

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


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使动态数码管、矩阵按键、蜂鸣器等。
主要功能:
系统运行后,数码管默认显示0,输入对应的操作数进行四则运算,支持最大8位显示,支持显示小数点后2位数。


二、软件设计

/*
作者:嗨小易(QQVIP群2:570487280)*///将整数各位取出存放数组
//num:转换的整数
//buf:转换后存储到数组内
//返回值:整数的长度
u8 int_to_array(u32 num,u8 buf[])
{u8 i=0;u8 tempbuf[SMG_SHOW_BITNUM];char j=0;u8 cnt=0;if(num!=0)//传入的数据不为0{while(num!=0){tempbuf[i]=num%10;//将各个位的数赋值于数组tempbuf[i]num/=10;//现在数组tempbuf[i]记录的是各个位上的数的反序i++;//i记录这个数是几位数		}for(j=i-1;j>=0;j--){buf[cnt++]=gsmg_code[tempbuf[j]];	}	}else//传入的数据为0buf[cnt++]=gsmg_code[0];	return cnt;
}//计算结果并显示
void get_result_show(void)
{u8 smgbuf[SMG_SHOW_BITNUM];u8 bitnum=0;u8 key=0;u8 buf[3];//缓存显示小数的数据while(1){key=key_matrix_flip_scan();if(key==14)	//清除操作{sys_ctr_sys.equal=0;sys_ctr_sys.sign=0;sys_ctr_sys.curNum=0;sys_ctr_sys.preNum=0;sys_ctr_sys.dot=0;break;}//等号键、计算结果if(sys_ctr_sys.equal==SIGN_EQUAL){switch(sys_ctr_sys.sign){case SIGN_ADD: sys_ctr_sys.result=sys_ctr_sys.preNum+sys_ctr_sys.curNum;break;case SIGN_MIN: if(sys_ctr_sys.preNum<sys_ctr_sys.curNum)sys_ctr_sys.result=sys_ctr_sys.curNum-sys_ctr_sys.preNum;elsesys_ctr_sys.result=sys_ctr_sys.preNum-sys_ctr_sys.curNum;break;case SIGN_MUL: sys_ctr_sys.result=sys_ctr_sys.preNum*sys_ctr_sys.curNum;break;case SIGN_DIV: if(sys_ctr_sys.curNum!=0)sys_ctr_sys.result=(float)sys_ctr_sys.preNum/sys_ctr_sys.curNum;if(sys_ctr_sys.result!=(int)sys_ctr_sys.result)//有小数,保留小数后2位{sys_ctr_sys.result=sys_ctr_sys.result*100;sys_ctr_sys.dot=2;}break;}bitnum=int_to_array(sys_ctr_sys.result,smgbuf);if(sys_ctr_sys.dot)//有小数显示{if(sys_ctr_sys.result<10)//放大100倍结果小于10,比如0.01{buf[0]=0x3f|0x80;buf[1]=0x3f;buf[2]=smgbuf[0];smg_display(buf,SMG_SHOW_BITNUM-1-bitnum);			}else if(sys_ctr_sys.result<100)//放大100倍结果小于100,比如0.12{buf[0]=0x3f|0x80;buf[1]=smgbuf[0];buf[2]=smgbuf[1];smg_display(buf,SMG_SHOW_BITNUM-bitnum);	}else{smgbuf[bitnum-1-sys_ctr_sys.dot]|=0x80;smg_display(smgbuf,SMG_SHOW_BITNUM+1-bitnum);	}						}else	//无小数显示	smg_display(smgbuf,SMG_SHOW_BITNUM+1-bitnum);sys_ctr_sys.sign=0;					}else{sys_ctr_sys.equal=0;break;}	}
}//计算器控制系统
void cal_cotrol_sys(void)
{while(1){get_pre_num_show();//获取第1个计算数并显示	get_cur_num_show();//获取第2个计算数并显示get_result_show();//计算结果并显示}		
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述

联系作者

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

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

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

相关文章

JavaScript <关于逆向RSA非对称加密算法的案例(附原代码)>--案例(五)

前言: 趁热打铁,标记一下RSA的算法逆向...第二篇会有详解(本篇重在过程) 正文: 废话不说,直接分析步骤图: 到了这里,可以看到在登录的时候,需要验证码(本篇不教反验证码) 下面是正题--->逆他的pwd(密码) 总结: 问题:怎么确定一个密文数据是基于什么算法做出来的呢? 答:…

当初你问我为什么选择计算机?回头现在来总结就是穷

还记得当初自己为什么选择计算机&#xff1f; 当初你问我为什么选择计算机&#xff0c;我笑着回答&#xff1a;“因为我梦想成为神奇的码农&#xff01;我想像编织魔法一样编写程序&#xff0c;创造出炫酷的虚拟世界&#xff01;”谁知道&#xff0c;我刚入门的那天&#xff0…

NAS外网访问方案

基础流程 路由器开启端口映射&#xff08;如果有猫则要配置猫为转发模式&#xff0c;由路由器直接拨号即可使用第三方程序让内网ip发布到公网上&#xff08;如果有云服务器&#xff09;需要开启防火墙端口 好用的第三方程序 FRP穿透 优点&#xff1a;开源免费&#xff0c;速…

期末速成数据库极简版【创建】(1)

目录 前言 【1】T-SQL语句创建数据库 【2】T-SQL语句删除数据库 【3】T-SQL语句创建表 完整性约束 数据类型 例子 【4】T-SQL语句修改表 【5】T-SQL语句删除表 关于数据库&#xff0c;在我们学习Linux网络编程后面会详细学习到&#xff0c;为了应付期末考试&#xff0…

[MySQL] MySQL中的内置函数

本篇文章主要是对MySQL中常见的内置函数进行了详细解释。例如有日期类函数、字符串类函数、数学类函数等等。希望本篇文章会对你有所帮助。 文章目录 一、日期类函数 1、1 使用详解 1、2 实例演示 二、字符串函数 2、1 使用详解 2、2 实例演示 三、数学函数 四、其他函数 &…

销售如何开发客户?

在销售过程中&#xff0c;开发客户是至关重要的一环。只有拥有足够的客户群体&#xff0c;才能为公司带来更多的业务机会和收入。 现如今&#xff0c;不管是哪一行竞争都十分激烈&#xff0c;特别是那些本身没有核心竞争力和核心技术的传统 to b企业&#xff0c;正处于十分尴尬…

Leo赠书活动-12期 【Java程序员,你掌握了多线程吗?】文末送书

Leo赠书活动-12期 【Java程序员&#xff0c;你掌握了多线程吗&#xff1f;】文末送书 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1…

socket 套接字

1、套接字介绍 socket起源于Unix&#xff0c;遵循“一切皆文件”出发点&#xff0c;都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。 在设计模式中&#xff0c;Socket把复杂的TCP/IP协议族隐藏在Socket接口后面&#xff0c;Socket去组织数据&#xf…

Pytorch线性回归教程

import torch import numpy as np import torch.nn as nn import matplotlib.pyplot as plt生成测试数据 # 长期趋势 def trend(time, slope0):return slope * time# 季节趋势 def seasonal_pattern(season_time):return np.where(season_time < 0.4,np.cos(season_time * …

vue3 + mark.js 实现文字标注功能

效果图 安装依赖 npm install mark.js --save-dev npm i nanoid代码块 <template><!-- 文档标注 --><header><el-buttontype"primary":disabled"selectedTextList.length 0 ? true : false"ghostclick"handleAllDelete"…

Linux学习笔记2

web服务器部署&#xff1a; 1.装包&#xff1a; [rootlocalhost ~]# yum -y install httpd 2.配置一个首页&#xff1a; [rootlocalhost ~]# echo i love yy > /var/www/html/index.html 启动服务&#xff1a;[rootlocalhost ~]# systemctl start httpd Ctrl W以空格为界…

String、StringBuffer、StringBuilder

String类 特点&#xff1a; 1.类由final关键字修饰&#xff0c;不可被继承&#xff1b; 2.value是一个由final修饰的字符数组&#xff0c;即字符串的长度不可修改&#xff1b; 3.实现了Comparable<T>接口&#xff0c;可进行比较&#xff1b; StringBuffer 特点&#x…

almaLinux centos8 下载ffmpeg离线安装包、离线安装

脚本 # 添加RPMfusion仓库 sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm wget -ymkdir -p /root/ffmpeg cd /root/ffmpegwget http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpmyum instal…

排序算法介绍(一)插入排序

0. 简介 插入排序&#xff08;Insertion Sort&#xff09; 是一种简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常…

算法刷题之数组篇

题目一&#xff1a;两数之和 给出一个整型数组 numbers 和一个目标值 target&#xff0c;请在数组中找出两个加起来等于目标值的数的下标&#xff0c;返回的下标按升序排列。 &#xff08;注&#xff1a;返回的数组下标从1开始算起&#xff0c;保证target一定可以由数组里面2…

mybatis数据输出-驼峰命名规则设置

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

持续集成交付CICD:GitLabCI 实现Sonarqube代码扫描

目录 一、实验 1.GitLabCI 代码扫描 二、问题 1.GitLab 执行sonar-scanner命令报错 一、实验 1.GitLabCI 代码扫描 &#xff08;1&#xff09;打开maven项目 &#xff08;2&#xff09;maven项目流水线调用公共库 &#xff08;3&#xff09;项目组添加token认证 &#xf…

【C++】手撕string思路梳理

目录 基本思路 代码实现 1.构建框架&#xff1a; 2.构建函数重载 3.迭代器&#xff1a; 4.遍历string 5.resetve 开空间&#xff0c;insert任意位置插入push_back,append,(按顺序依次实现) 6.erase删除&#xff0c;clear清除&#xff0c;resize缩容 7.流插入&#xff0…

Java集合使用注意事项

目录 1. 集合判空 2. 集合转 Map 3. 集合遍历 4. 集合去重 5. 集合转数组 6. 数组转集合 1. 集合判空 《阿里巴巴 Java 开发手册》的描述如下&#xff1a; 判断所有集合内部的元素是否为空&#xff0c;使用 isEmpty() 方法&#xff0c;而不是 size()0 的方式。 这是因为…

FreeRTOS系统延时函数分析

一、概述 FreeRTOS提供了两个系统延时函数&#xff0c;相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始&#xff0c;延时指定的时间结束&#xff0c;绝对延时是指每隔指定的时间&#xff0c;执行一次调用vT…