怎么规划一个电子计算器

  版权申明:本文为博主窗户(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