怎么设计一个电子计算器

  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/8185972.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

  首先,不要误会,我那边的统计器是指硬件的统计器,至于纯软件的计量程序,乃至有高级功用的,比如可以求解方程甚至可编程之类,我然后找个时刻以来说。那二日看到有人在博问里问类似的题材,原问是想设计一个兼有数码管、有着4×4键盘的硬件里的程序,不明白他具体想做如何,只是给了部分提议。联想到还有计算器这么些事物,那应当很不难作为电子工程依然微电子专业的一个学业的花样出现。以前我招实习生的时候,似乎也早就叫其得以完毕过统计器。那里给出一点方案,以供参考。

 

  硬件

     
 美学原理 1

  框图如上,首要有4大模块,电源、控制、按键矩阵、数码管。

美学原理,  电源有多种方案,简单点可以用电池或者usb,那里不作详细谈论。

  数码管拔取共阴或共阳,每一位一个片选,选个6位的,一共14个引脚,都接在控制模块IO引脚上,注意控制信号电平,需求的时候阳级接上拉电阻。

美学原理 2

  键盘矩阵则是以下电路那样的东西,由一堆按键组成,键盘矩阵对外8个信号都接在控制模块的引脚上。其余,假使决定模块的引脚不可能安排上拉或下拉电阻,那么PD0/PD1/PD2/PD3或者PD4/PD4/PD6/PD7/PD8就要接上拉电阻,这关乎到键盘矩阵的检测原理。

  美学原理 3

  控制模块,就看想用什么编程了,如若想用单片机,可以选拔经典的51单片机、AVR单片机、PIC单片机都足以,STM32当然可以,只是ARM可以做远比那一个纷纷的政工,没需要杀鸡用牛刀。当然,想学学ARM尤其是STM32的编程,可以用STM32。PIC单片机和51单片机本身只玩过汇编,可是现在单片机协助C语言都帮忙的蛮不错,提出照旧C语言编程。

  当然,也有想娱乐数字设计的,那么cpld对于那个须要是适当的,没要求上FPGA,可以用很早在此以前的,价格也方便。对于资源多少并未把握的话,你也得以先做数字设计,再来选器件。

 

  固件

  硬件设计好了后来,需求统筹固件。

  假使控制模块选取的是单片机,那么大家一般是在裸机下编程,对于这几款单片机我如同只玩过汇编,但现行都21世纪了,我想至少也理应用C语言来娱乐。

  我们先是要明白数码管和键盘矩阵的法则:

美学原理 4

  数码管相对简便易行一些,一般的话,数码管每一位显示的数字都不等同。如我图中的共阴6位数码管,当要显得某位的时候,片选信号选取是拉低,其余片选拉高,然后再把要来得的数字所要点亮的管的引脚拉高,那样,要显示的这一位就显得出了数字,而其它的几位没有其余彰显。然后快捷切换,每一位都显示该显示的数字,那么根据视觉暂留,大家就看看了一体化的显得。

美学原理 5

  键盘矩阵可能要复杂那么一些。首先,我们假如大家这里PD5、PD6、PD7、PD8都被我们接了上拉电阻,并且IO都为高阻接收状态,而不出口。大家这里只考虑一个键的辨别,其实键盘矩阵也可以识别几个键。大家想一想,如若某个键按下去,比如左上角的S3按下之后,会时有暴发哪些。在按下去之前,PD1、PD2、PD3、PD4和PD5、PD6、PD7、PD8中间并不联通。但当S3按下去,PD1和PD4连在了一道。若是控制模块把PD4的输出射为高阻状态,那么只要PD0输入低电平,那么PD4读取出来的相应为低电平,否则为高电平。于是我们把PD1、PD2、PD3、PD4那4个引脚每回只中间一个出口低电平,其他多少个出口高阻状态,每一次都去读取PD5、PD6、PD7、PD8,那么就能够根据数值来判定究竟是哪位按键被按下。注意,此处PD1、PD2、PD3、PD4这4个引脚每便只中间一个出口低电平的时候,其余七个不可能出口高电平,而应该是高阻,否则,借使有三个按键被按下,则为堵塞状态!

  其它要考虑按键的振荡问题,有多种化解措施,比如可以在认清到一次按键按下之后0.3秒内不重复判断按键被按下。

  既然数码管的来得须求定时去切换展现位,而键盘矩阵也须求定时去切换输入,那么我们就可以安装一个定时器,把那七个硬件的处理都挂在同一个定时中断例程上作为驱动层,其论理使用上述的原理来落到实处,可以每一遍中断给一个循环计数作为气象,做一个moore机简单明了,至于0.3秒内不重复在交互里显示即可。程序中已毕驱动层和应用层的层次分离,无论从调试硬件仍然设计固件来说都是必备的,当然你也可以分的更细,比如HAL层。当然,非要在那边把具备的成套糅合在联合也是力所能及最后搞定的,但层次感差很多,并且一个初专家真的设计不佳一个大的状态机。

  设计有些全局变量用来应用层和驱动层交互显示数据和所按按键。

  unsigned char
num[6] ;//应用层写,驱动层读,用于6位数据的展示

  unsigned char
flag;//flag=0的时候,驱动层能够安装key,并把flag设为1;flag=1的时候,应用层能够读取key,并把flag设置为0

  unsigned char
key;//以表示是哪个键按下,分别给0、1、2、3、4、5、6、7、8、9、+、-、*、/、=、退格编码为0~15

  以上数据有冗余,在RAM极端受限的境况下,可以裁剪数据。

  而关于总结器所要已毕的万丈6位加减乘除,很简单落成,根本不需求运气总括,结合展现和按键,构成应用层程序,想想一个总计器的效果,你应有很简单的画出流程图,不是吗?

  尽管作为学生,你挑选的是cpld/fpga,我也帮忙您,我认为一个可以友善单独做出来的学童应该照旧不错的,但也和从前处理器的程序落成类似:分别安排键盘驱动模块、数码管驱动模块、总结模块,最终中间有一个为主模块以一个景况机格局存在,与任何八个模块都不断。当然,每个模块内部也得以分小模块,比如数码管模块里面最好把解码器单独完结一个小模块,而计量模块里加减乘除都是独立的小模块。

  美学原理 6

 

自家的博客即将搬运一头至腾讯云+社区,邀请咱们一同入驻:https://cloud.tencent.com/developer/support-plan