键盘矩阵对外8个信号都接在控制模块的引脚上,键盘矩阵对外8个信号都接在控制模块的引脚上

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

相关文章