基于LPC2124的简易计算器设计Word文档下载推荐.docx
《基于LPC2124的简易计算器设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于LPC2124的简易计算器设计Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
4.连续两个运算符用后面一个取代前面一个4.连续两个运算符用后面一个取代前面一个
6.取百分数6.取百分数
7.开方7.开方
5.算式显示5.算式显示
三、设计目标
实现上述的计算显示功能,并优化程序使程序结构明了,代码简洁。
实现上述的计算显示功能,并优化程序使程序结构明了,代码简洁。
四、硬件电路的设计
(一)控制芯片按要求选用飞利浦LPC2124处理器。
(一)控制芯片按要求选用飞利浦LPC2124处理器。
(二)由于要进行小数的加减乘除运算再加上清零键已经超出了16个键
(二)由于要进行小数的加减乘除运算再加上清零键已经超出了16个键因此选用PROCTUS自带的23键的键盘,如:
图一键盘。
此键盘为计算器功因此选用PROCTUS自带的23键的键盘,如:
此键盘为计算器功能的扩展提用了充足的案件资源。
能的扩展提用了充足的案件资源。
注意:
键盘默认电平为高电平所以要用高电平扫描。
注意:
1
图一键盘
键盘在程序中的的映射:
扫描程序返回值:
0,1,2,3,4,5,
6,7,8,9,10,11
12,13,14,15,16,17
18,19,20,21,22,23
code_keyvalue'
A'
'
7'
8'
9'
*'
/'
'
Q'
'
B'
4'
5'
6'
-
%'
1'
2'
3'
'
S'
C'
0'
.'
='
+'
D'
intkeyvalue[]14,7,8,9,16,20,intkeyvalue[]14,7,8,9,16,20,
11,4,5,6,17,21,11,4,5,6,17,21,
12,1,2,3,18,22,12,1,2,3,18,22,
13,0,10,15,19,2313,0,10,15,19,23
(三)显示部分采用课程中已经调试好的LM032L。
LM032L为20*2的液晶(三)显示部分采用课程中已经调试好的LM032L。
LM032L为20*2的液晶
显示屏,对于一个简易的计算器的显示部分完全满足要求,而且控制显示屏,对于一个简易的计算器的显示部分完全满足要求,而且控制
简单。
如:
图二液晶简单。
图二液晶
2
(四)总体电路设计:
用LPC2124的P0.0到P0.10十一个端口来对LM032L(四)总体电路设计:
用LPC2124的P0.0到P0.10十一个端口来对LM032L进行控制,其中P0.0到P0.7为数据线,P0.8到P0.10为控制线。
用LPC2124的进行控制,其中P0.0到P0.7为数据线,P0.8到P0.10为控制线。
用LPC2124的P0.16到P0.25十个端口来控制键盘进行扫描,来实现键盘值的读取,其中P0.16P0.16到P0.25十个端口来控制键盘进行扫描,来实现键盘值的读取,其中P0.16到P0.19送扫描数据,可以确定按下的键在矩阵键盘中的行,P0.20到P0.25读到P0.19送扫描数据,可以确定按下的键在矩阵键盘中的行,P0.20到P0.25读键盘的值来确定按下的键在矩阵键盘中的列。
连着结合起来就可以判断出所按键盘的值来确定按下的键在矩阵键盘中的列。
连着结合起来就可以判断出所按下的键的值。
总体电路如图三计算器电路下的键的值。
总体电路如图三计算器电路
图二计算器电路
五、软件的设计的设计
(一)键盘扫描程序的设计
扫描部分:
往四根行线依次送入高电平,从列线读取数据来扫描键盘
是否有键按下,并通过送出和读入的端口值来计算出一个返回值,利
用这个返回值查表可得出键盘对应的符号和对键盘的指代值。
延时去抖:
检测到右键按下时,按时10ms,再读键值,如果有键按
下,然后等待按键释放之后,对端口值进行分析。
键盘扫描程序基本结构,如图三键盘扫描程序框图
3
图三键盘扫描程序框图
相关函数:
voidDelay(uint32dly);
//延时函数
intKeyScan(void);
//键盘扫描函数
(二)LCD驱动程序的设计
先对控制LCD进行初始化设置。
然后通过相应的命令将要显示的
字符或字符串送到显示器。
voidChkBusy(void);
//LCD忙检测函数
voidWrOp(chardat);
//对LCD送命令函数
voidWrDat(chardat);
//对LCD送数据函数,显示一个字符
voidlcd_init(void);
//LCD初始化函数
voidDisText(charaddr,char*p);
//字符串显示函数
(三)计算程序的设计
程序的基本框架如下:
图三计算程序框图
4
程序的基本原理是采用3个字符型的数组来存放三个数据,2个sign空间来放运算符。
(1)有一个数据时可以进行单数据运算符的计算,如‘%’、开方等;
(2)有两个数据时,此时符号如果为‘*’或‘/’可以开始计算把这两个数计算成一个数储存,有‘=’时都得计算出来;
(3)有三个数据时判断两符号的优先级,总可以计算一级是数据变为两数据一运算符,经过第二步后剩下的前面的运算符肯定为‘-’或‘+’因此如果后面一个运算符为‘+’或‘-’时可以将前一运算符算出,如果后面一个运算符为‘*’或‘/’时可以将后一运算符算出。
从而可知数据一定在三个以内,运算符一定在两个以内。
计算过程如:
输入:
8*2+6/3+5=
输入过程计算过程
第一步:
8*2+16+
第二步:
8*2+616+6
第三步:
8*2+6/16+6/
第四步:
8*2+6/316+6/3
第五步:
8*2+6/3+16+2+
第六步:
8*2+6/3+518+5
第七步:
8*2+6/3+5=23
相关函数:
char*ClrArry(char*src);
//清空一个数组char*ClrArry(char*src);
//清空一个数组
5
voidstrcpyf(char*str1,char*str2);
//将一个字符串复制到voidstrcpyf(char*str1,char*str2);
//将一个字符串复制到
//另一个字符串中//另一个字符串中voidftoa(floatn,unsignedchardecimals,char*str)voidftoa(floatn,unsignedchardecimals,char*str)
//将浮点数转化为字符串函数//将浮点数转化为字符串函数voidcalculate(void);
//计算函数voidcalculate(void);
//计算函数
六(功能说明及实验结果:
六(功能说明及实验结果:
(一)浮点数的加减乘除
(一)浮点数的加减乘除
5.2*1.2=输入:
82.54/8.1=输入:
82.54/8.1=
4.23+82.1235=输入:
0.025-1.8=输入:
0.025-1.8=
(二)连续运算和优先级
(二)连续运算和优先级
1.2/3.2=+8.2=输入:
8.6*1.2+4=输入:
8.6*1.2+4=
6
2.3*5+1.2/2-5=输入:
2.3*5+1.2/2-5=
(二)开方取负百分数
(二)开方取负百分数
12*8.4=Q=(键“MRC”用Q表示代表开方)输入:
12*8.4=Q=(键“MRC”用Q表示代表开方)
45B+5=(键“+/-”用B表示代表开方)输入:
45B+5=(键“+/-”用B表示代表开方)
7
2.3S=(键“M-”用S表示代表求弧度正弦)输入:
2.3S=(键“M-”用S表示代表求弧度正弦)
3.1415926S=(如图右)输入:
3.1415926S=(如图右)
485.22%=输入:
485.22%=
(四)连续两个运算符用后面一个取代前面一个(四)连续两个运算符用后面一个取代前面一个
4+-*/8=(最后一运算符有效)输入:
4+-*/8=(最后一运算符有效)
七、总结
由于以前做过一个计算器,但那时没有自己写程序只是修改被人的程
序。
虽然如此对计算程序还是有一个大体的了解,因此决定完全不看别
人的程序也不查阅书籍就拿几张纸和一笔先规划出程序的框架然后再一
步一步实现。
其实框架比程序还要麻烦。
在程序设计时像三角函数、平方开方等类型都是选取其中一两个作为
代表。
其他的可以按相同的方式扩展。
在此过程中我和我的组员设计了总体的程序结构,开始是用两个数组
储存接收到的数据,然后用数据前的字符是不是字符来判断是否一个数
据输入完成达到数据个数的管理,在此基础上我们实现了比如:
按一下
键清除一位输入的数据或字符等功能。
后来发现大多计算器的设计没有
考虑到优先级,因此经过讨论改为用3个数组来存放输入的数据,2个单
元来存放运算符来达到运算符的优先级的运算。
这个计算程序还存在很多的不足,如采用的字符串转浮点数、浮点数
转字符串函数的过程中有的时候结果有0.00001数量级的偏差(转化过
程中采用小数点后6位精度)。
8
附件A附件A
硬件电路图硬件电路图
附件B附件B
软件代码:
软件代码:
(一)main.c文件
(一)main.c文件
9
(二)lcd.h文件
(二)lcd.h文件
10
11
(一)cal.h文件
(一)cal.h文件
12
13
14
15
16