电子系统设计实验课–计算器
这篇文章是我电子系统设计课的第一次大作业报告。老师要求从六个题目当中选一个做项目,我选择的是看起来最复杂的一个。因为其他的项目貌似只要修改我之前的万能电子钟的代码就好,简易计算器这个项目算是从零开始啦。
### 设计思路 单片机读键值和LCD显示的方法我们再熟悉不过了。这些都有已经构建好的底层文件,直接调用接口函数就好了。读键值的函数作用是有键按下,则返回一个unsigned char型数。所以我们首先需要做一次转换,目的是我定义一个键,按下它就为1或者2或者3等等,便于下一步的计算。第二个问题是,当我们依次按下了键1、键2,单片机会读入的值是1,接着又读入2,我们实际需要计算的值为12。我进行了第二次转换,即将上次读回的值乘10加这次读回的值。我们把完整的一次计算过程大致分为四步:输入第一个数,输入运算符号,输入第二个数,按等于号显示结果。
### 目前实现的功能和问题 功能:
- -32767至+32768之间的加减乘除整数运算。
- -32767至+32768之间的加减小数运算,仅能算一位小数,两位就bug,原因等下说。
- 可以清屏。
这样看起来功能确实挺弱智的,但是基本上满足了这次作业的要求,说实话做的时间不大够最近又很烦,就留了很多的bug没解决。
问题:
- 小数功能不完善是因为小数部分计算的算法不合理。我在这个计算器里开的所有变量几乎都是整型,51的话全用float会造成数据溢出。所以小数的计算其实是当成整数算的,输入等式为12.3+12.3的时候,程序的执行过程是12+12,3+3,得到24,6两个数,中间显示个小数点。这种太脑残的方法不适用于乘除,我又没空给乘除写单独的算法就把这bug暂且扔在那儿了。
- 小数位数限制还是因为这算法过于简单,12.3+12.31的算式在单片机中就算成了12+12,3+31,输出的结果就不正确了。
- 显示有一些问题。那个鬼畜的LCD1602有的时候会自动移位显示,有的时候会把我原来显示的东西覆盖掉,目前来看显示方面的bug基本被我改完了,基本不会出现显示算式不正确的情况。
硬件电路和实现效果图
代码部分
第一部分:底层/硬件-软件接口
这里是使用hc165芯片来读键值程序,使用hc_165()返回的就是键值。
这里是LCD显示的函数,主要实现的是送字符给LCD显示,还有确定LCD显示位置的函数。
老师给我们的实验板上有一块ZLG7920芯片,我们用它来做4*4矩阵键盘的读值。
这个芯片需要使用I2C总线,所以我们需要添加I2C总线的底层文件:
用户层
键值扫描的程序,使用hc165和zlg7290,读回键值并做一次转换。
计算器核心计算功能实现:
显示功能设计:
主函数:
小结
具体实现的思路大概就是前文讲的那样,可是程序结构的设计相当欠考虑,有很多做的不到位的地方,看起来很傻,耗费的时间太多。就这样。