当前位置: 首页 > article >正文

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

文章目录

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


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使动态数码管、矩阵按键、蜂鸣器等。
主要功能:
系统运行后,数码管默认显示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//传入的数据为0
		buf[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;
					else
						sys_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.kler.cn/a/160979.html

相关文章:

  • DICOM图像知识:DICOM图像排序与坐标系解析
  • Springboot+Vue+mysql前后端分离的Java项目部署教程
  • 【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台
  • Debezium系列之:Debezium3版本增量快照和只读增量快照应用的变化
  • 【Vue】重定向和跳转的实现
  • RBF 网络的学习算法:原理、实现与应用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • 什么是堆内存?参数如何设置?
  • 【LeetCode】2621. 睡眠函数
  • ETLCloud详解,如何实现最佳实践及问题排查
  • 代码随想录算法训练营第五十八天 | 793.每日温度,496.下一个更大元素 I
  • LabVIEW开发自适应降噪ANC
  • vue的propsData
  • 04 ECharts基础入门
  • MySQL和MongoDB简介以及它们之间的区别
  • ThinkPHP6使用Validate验证表单字段唯一
  • 【每日一题】重新规划路线
  • 【C++初阶】六、类和对象(初始化列表、static成员、友元、内部类)
  • 脉冲压缩及MATLAB仿真
  • 数组常用方法
  • 剧本杀小程序搭建:打造线上剧本杀新体验
  • HTML 块级元素与行内元素有哪些以及注意、总结
  • EasyExcel如何读取全部Sheet页数据方法
  • leetcode刷题:611.有效三角形的个数(双指针实现)
  • C++中单引号‘‘和双引号““的区别
  • Linux内核上游提交完整流程及示例