怎么设计一个电子计算器。如何计划一个电子计算器。

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

相关文章

admin

网站地图xml地图