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

相关文章

网站地图xml地图