一、主要结构与制作特点
①此计算器采用模块化的设计思想,主要分为键盘模块;运算与显示模块。②使用了1 28×64点阵式大尺寸LCD来做显示,输入的所有步骤均显示在LCD上。③输入数据的步骤全部按照人们的书写习惯。打个比方:我们计算 普通计算器的输入顺序通常是这样的:
而这个计算器却是这样使用:
④汇编与C混合使用,取长补短。⑤双CPU的模块化设计,方便扩展。⑥自己设计并制作双面感光电路板。
二、键盘模块
上图和下图是键盘模块的原理图和PCB图,需要注意的是,按键“RESET”并不是键盘模块的复位按钮,而是用在计算模块上的。“RESET”键一方面是作为计算部分的复位,另一个功能就是归零。从键盘的输入方式上,我用的是“直驱”。
即不使用较为普遍的行列扫描方式,而是将按键一端直接接地另一端接在MCU的I/O端口上。
下面介绍一下制作过程。
首先取一张菲林,并用打印机将PCB图打印在上面,再拿一片双面感光板,揭下保护膜后将两张PCB图贴在感光板的两面并用有机玻璃板压紧(顶层和底层的图一定要对齐,不然在钻孔的时候,由于顶,底焊盘没有完全重叠,顶层的孔虽然钻在了焊盘的中心,但底层焊盘却没有。)然后在阳光下放置大概15分钟,曝光就结束了;之后放在显影液中显影,最后用蚀刻液腐蚀即可。
键盘模块的软件方面详见下图。这部分其实很简单,一般不会出现什么错误,只是波特率需要和计算模块一样否则数据不能够正常接收。
二、计算模块
上图下图分别是PCB和原理图,硬件原理很简单,实在没什么难以理解的,只是要注意一定要在PO端口加上上拉电阻,阻值在1K到10K之间均可。另外就是LCD屏的引脚方向,按照习惯我们常从左往右计数,但是12864屏的引脚顺序是从右往左的。这些都是在我实际制作PCB时遇到的“绊脚石”,希望读者们在设计电子作品时加以注意,减少不必要的返工。在连接方面,最麻烦的就是运算和键盘部分左右两侧的排针了。
一方面,由于计算板和键盘板是叠加在一起的,数据收发依靠两边的排针来连接,如果两块板子的排针间距稍有偏差就会对接不上。解决的办法是用AliumDesinger6的PCB设计向导设计出宽度相等的板子,然后测量板子边到插针的距离并调整,使两块板相同即可。另一方面,为了PCB布线合理,左侧的排针第一引脚在上面,右侧的排针第一引脚在下面。顺序刚好颠倒过来。不仔细看还真看不出来。我就曾经在这个小问题上犯下了错误,结果查了两天才发现,最后不得不重做板子,损失惨重呀!
硬件完成后,将进行计算代码的设计了。本来我是想用流程图来说明的,可是想来想去怎么都不能表达清楚。最后决定还是用自然语言来表达,其实我在设计的时候也没有画流程图,基本是将想法,实现方法,注意的地方等写在纸上,然后直接写程序。
由于用的是C语言编程,运算上一般不会出现大问题,大多数具体的运算如开方,平方等都可以在KEIL软件的帮助文件中查到相应的函数的用法并且可以直接调用。最麻烦的倒是数据的输入输出。也就是说你想输入236,但计算器并不知道你输入的是236,只会认为你输入的是一堆ASCII代码,即2,3,6这三个数。不过我们可以这样设计算法:(输入值2)×100+(输入值3)×10+(输入值6)×1。用类似的方法也可以将数据输出到显示屏,比如同样是236,当程序检测到这是一个大于99且小于1000的数字即三位数字时,程序可以这样运行:首先将2取出:
236/100=2.36然后将2.36赋给一个char类型的变量即可,此时程序自动将小数部分去掉。然后取出3,3的提取需要先将百位数的2去掉,可以用取余数的方法即:236%100=36,剩下的步骤和取2的步骤相同。
同样的道理,你肯定知道个位数的6怎么取了吧。有了这些单个的数字,显示不就不成问题了吗?