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