怎筹划一个电子计算器。如何统筹一个电子计算器。

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

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

  作者:窗户

  QQ:6679072

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

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

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

  首先,不要误会,我这里的计算器是凭借硬件的计算器,至于纯软件的计量程序,乃至有高等功能的,比如可求解方程甚至只是编程之类,我后来找个日子的话说。这点儿天看有人在博问里问类似之问题,原问是怀念设计一个拥有数管、有着4×4键盘的硬件里之程序,不明了他现实想做什么,只是于了部分建议。联想到还有计算器这个事物,这应当好易当电子工程或者微电子专业的一个学业的形式出现。以前我招实习生的当儿,似乎为都被该促成了计算器。这里为来一些方案,以供参考。

  首先,不要误会,我此的计算器是依靠硬件的计算器,至于纯软件之盘算程序,乃至有尖端功能的,比如可求解方程甚至可编程之类,我后找个时刻来说说。这半上看到有人以博问里发问类似之题目,原问是怀念设计一个负有数管、有着4×4键盘的硬件里的顺序,不知底他现实想做啊,只是为了部分提议。联想到还有计算器这个东西,这应挺轻当电子工程要微电子专业的一个功课的款式出现。以前自己招实习生的时光,似乎为曾深受该落实了计算器。这里被起一些方案,以供应参考。

 

 

  硬件

  硬件

     
 图片 1

     
 图片 2

  框图如达到,主要有4死模块,电源、控制、按键矩阵、数码管。

  框图如齐,主要有4万分模块,电源、控制、按键矩阵、数码管。

  电源有多种方案,简单点可就此电池或usb,这里不作详细谈论。

  电源有多方案,简单点得据此电池或usb,这里不作详细讨论。

  数码管使一块阴或共阳,每一样各一个片选,选个6员的,一共14只引脚,都衔接在控制模块IO引脚上,注意控制信号电平,必要之上阳级接上拉电阻。

  数码管采用一块阴或共阳,每一样各项一个片选,选个6各之,一共14单引脚,都衔接在支配模块IO引脚上,注意控制信号电平,必要之时光阳级接上拉电阻。

图片 3

图片 4

  键盘矩阵则是以下电路这样的事物,由同堆放按键组成,键盘矩阵对外8只信号还接在支配模块的引脚上。另外,如果决定模块的引脚无法配备达到拉还是下拉电阻,那么PD0/PD1/PD2/PD3还是PD4/PD4/PD6/PD7/PD8就算使对接上拖累电阻,这事关到键盘矩阵的检测原理。

  键盘矩阵则是以下电路这样的事物,由同样积按键组成,键盘矩阵对外8独信号还衔接在控制模块的引脚上。另外,如果决定模块的引脚无法安排达到拖累还是下拉电阻,那么PD0/PD1/PD2/PD3还是PD4/PD4/PD6/PD7/PD8即假设接入上拉电阻,这提到到键盘矩阵的检测原理。

  图片 5

  图片 6

  控制模块,就看朝思暮想用什么编程了,如果想用单片机,可以择经典的51独自片机、AVR单片机、PIC单片机都得以,STM32理所当然可以,只是ARM可以开多较之复杂的事情,没必要杀鸡用牛刀。当然,想学学ARM特别是STM32的编程,可以就此STM32。PIC单片机和51仅仅片会本身独自打了汇编,不过本单片机支持C语言都支持之那个不错,建议要C语言编程。

  控制模块,就看想就此啊编程了,如果想就此单片机,可以挑选经典的51单纯片机、AVR单片机、PIC单片机都可以,STM32本好,只是ARM可以举行多较这个纷繁的事务,没必要杀鸡用牛刀。当然,想学学ARM特别是STM32底编程,可以用STM32。PIC单片机和51独自片会自只有玩了汇编,不过本单片机支持C语言都支持的良不错,建议还是C语言编程。

  当然,也产生想耍数字设计的,那么cpld对于这个需求是适用的,没必要上FPGA,可以为此特别早以前的,价格也有益于。对于资源多少并未握住的讲话,你啊堪优先做数字设计,再来选器件。

  当然,也有想念玩数字设计的,那么cpld对于此需要是适当的,没必要上FPGA,可以用特别早以前的,价格也方便。对于资源多少并未把的口舌,你吗可以预先开数字设计,再来选器件。

 

 

  固件

  固件

  硬件设计好了下,需要规划固件。

  硬件设计好了今后,需要统筹固件。

  如果决定模块选用的凡单片机,那么我们一般是以裸机下编程,对于这几舒缓单片机我似乎只是玩了汇编,但现在犹21世纪了,我怀念起码为理应据此C语言来打。

  如果决定模块选用的凡单片机,那么我们一般是于裸机下编程,对于这几乎暂缓单片机我像只是玩过汇编,但现还21世纪了,我思至少为相应据此C语言来打。

  我们第一要明数码管和键盘矩阵的规律:

  我们第一使知道数码管和键盘矩阵的原理:

图片 7

图片 8

  数码管相对简便易行有,一般的话,数码管各一样位显示的数字都未等同。如我贪图备受的联合阴6位数码管,当要显示某位的时节,片选信号选择是关低,其他片选拉大,然后又将要来得的数字所假设点亮的无的引脚拉高,这样,要来得的就等同各即展示出了数字,而其余的几乎号尚未另外显示。然后很快切换,每一样员都显得该显示的数字,那么根据视觉暂留,我们即便看了完全的来得。

  数码管相对简单有,一般的话,数码管各一样号显示的数字还不等同。如自贪图备受之一头阴6位数码管,当要展示某位的下,片选信号选择是拉低,其他片选拉大,然后再度将要显的数字所假设点亮的凭的引脚拉高,这样,要显的当即无异于各项就是展示出了数字,而另外的几乎号没有任何显示。然后快速切换,每一样个都显得该显示的数字,那么根据视觉暂留,我们虽看了完全的展示。

图片 9

图片 10

  键盘矩阵可能使复杂那么一些。首先,我们如果我们这边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只引脚每次仅中间一个出口低电平的时刻,其他三独无克出口高电平,而该是高阻,否则,如果生个别个按键被准下,则为绿灯状态!

  键盘矩阵可能只要复杂那么有些。首先,我们如果我们这边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秒内未另行判断按键被准下。

  另外要考虑按键的颠簸问题,有多种解决办法,比如可以以认清及同软按键按下后0.3秒内不还判断按键被据下。

  既然数码管的显得得定时去切换显示位,而键盘矩阵也需要定时去切换输入,那么我们虽足以设置一个定时器,把这点儿个硬件的拍卖还挂于与一个定时中断例程上作驱动层,其论理下上述的原理来落实,可以每次中断给一个循环计数作为状态,做一个moore机简单明了,至于0.3秒内无重复在竞相里体现即可。程序中贯彻驱动层和应用层的层系分离,无论从调试硬件还是设计固件来说还是必需之,当然你啊得分开的再次细致,比如HAL层。当然,非要是于这边拿所有的漫天糅合在一起也是能够最后搞定的,但层次感差很多,并且一个初师真的设计不好一个老的状态机。

  既然数码管的显得得定时去切换显示位,而键盘矩阵也欲定时去切换输入,那么我们就算得设置一个定时器,把这半单硬件的拍卖还悬挂于跟一个定时中断例程上作驱动层,其论理下上述的原理来促成,可以每次中断给一个循环计数作为状态,做一个moore机简单明了,至于0.3秒内无重复在竞相里体现即可。程序中落实驱动层和应用层的层系分离,无论由调试硬件还是设计固件来说都是少不了之,当然你为可分的重复细,比如HAL层。当然,非要当此处将装有的成套糅合在一起也是会最后搞定的,但层次感差很多,并且一个新专家真的设计不好一个格外之状态机。

  设计片全局变量用来应用层和叫层交互显示数据和所按照按键。

  设计有全局变量用来应用层和叫层交互显示数据以及所按照按键。

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

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

  unsigned char
flag;//flag=0的下,驱动层可以设置key,并拿flag设为1;flag=1的早晚,应用层可以读取key,并将flag设置为0

  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

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

  以上数据有冗余,在RAM极端受限的图景下,可以剪数据。

  以上数据产生冗余,在RAM极端受限的事态下,可以推数据。

  而关于计算器所假设落实之嵩6位加减乘除,很爱实现,根本未需要数计算,结合显示与按键,构成应用层程序,想想一个计算器的效力,你应有挺轻的写生流程图,不是啊?

  而至于计算器所假设促成之参天6位加减乘除,很轻实现,根本未需数计算,结合显示与按键,构成应用层程序,想想一个计算器的效应,你应该非常易之画有流程图,不是也?

  如果作为学生,你挑选的凡cpld/fpga,我呢支撑您,我觉得一个得自己独自做下的生该还是对的,但为和事先处理器的程序实现类似:分别计划键盘驱动模块、数码管驱动模块、计算模块,最后中间有一个骨干模块以一个状态机形式存在,与任何三单模块都不止。当然,每个模块内部也可分小模块,比如数码管模块里面最好好将解码器单独实现一个有点模块,而计量模块里加减乘除都是独自的微模块。

  如果当学生,你选的凡cpld/fpga,我呢支撑而,我觉得一个好团结独自做下的学生该要不错的,但也同事先处理器的程序实现类似:分别计划键盘驱动模块、数码管驱动模块、计算模块,最后中间产生一个中心模块以一个态机形式存在,与另三只模块都不断。当然,每个模块内部也可分小模块,比如数码管模块里面最好好将解码器单独实现一个不怎么模块,而计量模块里加减乘除都是独立的小模块。

  图片 11

  图片 12

 

 

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

本身之博客即将搬运一头到腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

相关文章