广东科学技术职业学院广州学院
实训报告
20 11 年 6 月
一、 设计任务与要求
实训的任务是基于ARM平台下进行简易电子计算器的设计。实训设计要求是实现十以内数的加法,实现简单的加法运算,且具有清零功能和简单的报错功能。
二、 总体方案与说明
本系统功能是实现个位数的加法运算,即在键盘上按下一个数字键,在数码管上显示其对应的数值,按下+,再按下一个数字键,在数码管上显示其数值,按下=,则调用软件的运算模块,进行运算,并回显结果,输出到数码管显示器上。硬件电路应分为两个模块,一是键盘接口电路,(如下所示)二是LED显示模块。LED显示包含2对8段数码管(LED_CS2 、LED_CS3),以及流水灯LED_CS4。
4*4小键盘:
1 2 3 +
4 5 6 -
7 8 9 *
C 0 = ∕
三、 电路原理图
CPU电路图
使用旧版实验箱,其键盘电路图如下所示:
直入键盘电路图
矩阵键盘电路图
LED_CS2电路图
LED_CS3电路图
四、 软件主要模块流程图
主函数
五、 问题分析与解决方案
遇到的问题:
1、如何根据按键值显示相应的0到9。
2、在做运算编写时,烧写进去后,不能够正确显示对应的按键值。
3、按键对应的GPIO口的设置。
4、连续运算功能与显示的设置。
5、多位数值的显示设置。
解决方案:
1、根据所用的开发板的按键的键值,将其存放在一个数组key_code中,并且将对应键值的符号值存放在另一个数组key_val中,其对应映射显而易见。
2、先用常数代入display()函数中,看能否正常显示数值。如果能的话,确定display()函数没有出错。然后,在直入和矩阵键盘判断处,将display()函数中得到的变量的值用常量来替换,在烧写进去,查看是否有错误,这样逐步排错。
3、首先由键盘的硬件电路图查找硬件对应按键部位的输入输出,再根据输入输出在270手册里在GPIO单元根据其是输入输出功能查找相应的GPIO口,找到口后,即可查看相应口的具体设置。
4、连续运算功能,一种是连续按下“=”键,程序会自动执行“上次的结果加、减、乘、除第二个数”这种功能;或者是运算完一次,就继续按运算符号和需要进行运算的数,最后显示运算结果。使用变量,每次运算之后,将结果赋给第一个数和第二个数,这样,每次执行的都会是第一个数的结果与第二个数的运算,从而实现连续运算的功能。
5、显示多位数值,是要根据数值的位数进行计算判断,编写if语句判断输入数值的位数,如果是一位,则直接显示数值;如果是两位数,则个位由数值余十得到,十位由数值除十得到,并对应相应的位显示;如果是三位数,则个位由数值余十得到,十位由数值除十再余十得到,百位数则由数值除一百显示在LED_CS2中;如果是四位数值,其余位方法不变,千位由数值除一千再余十得到。
六、 实验体会
通过简易计算器的实训项目,对于arm的学习更有兴趣,理论的东西得到了实际的应用,自己也认识到自身的不足。实训的要求已经实现,通过查表、询问、操作等多种渠道完成。对于今后arm专业工作也有了一个初步的了解,虽然现在有很多不足,但自己也正朝这个方向不断的努力,相信自己能够做的更好!
第二篇:JAVA实训报告--计算器
《Java实训》设计报告
计算器
石家庄科技信息职业学院
信息工程系
20##年10月15日
项目名称
一、项目需求
本程序的主要功能:
(1)单击“计算器”上的数字按钮(0~9)可以设置参与计算的运算数。
(2)单击“计算器”上的运算符按钮(+、-、*、/、1/x、sqrt、%)可以选择运算符号。
(3)单击“计算器”上的“=”按钮显示计算结果。
(4)单击“计算器”上的“复位”按钮清空计算结果。
(5)单击“计算器”上的“删除”按钮删除输入的最后一个数字。
二、项目设计
在设计计算器时,编写2个Java源文件:CalculatorWindow.java、NumberButton.java计算器除了上述Java源文件所给出的类外,还需要Java系统提供的一些重要类,如JButton,JTextField等。
下面是2个Java源文件的总体设计。
(1)CalculatorWindow.java(主类)
CalculatorWindow类负责创建计算器的主窗口,该类含有main方法,计算器从该类开始执行。CalculatorWindow类有4种类型的对象,分别是:LinkedList<String>、NumberButton、JButton、JTextField。
(2)NumberButton.java
NumberButton类创建的对象是主类CalculatorWindow窗口的一个“数字”按钮。NumberButton有一个int类型的成员temp,用于标明所创建的按钮所含有的运算符号。NumberButton所创建的22个按钮被添加到CalculatorWindow窗口中。
1、CalculatorWindow类(主类)
(1)数据和方法
CalculatorWindow类是javax.swing包中JFrame的一个字类,并实现了ActionListener接口。类中有关数据和方法的详细说明。
1)成员变量
jbArray是NumberButton型数组,每个单元是一个NumberButton类创建的“数字按钮”对象,该数组长度为10。numberButton数组中的“数字按钮”含有的数字依次为0~9。每个“数字按钮”都注册有ActionEvent事件监听器。
2)方法
main(String args[])方法是计算器程序运行的入口方法。
CalculatorWindow()是构造方法,负责完成窗口的初始化。
(2)代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class jisuanqi extends JFrame implements ActionListener
{
private JTextField jtResult=new JTextField();
private JButton jb_clear=new JButton("复位");
private JButton jb_delete=new JButton("删除");
private static JButton[][] jbArray={{new JButton("7"),new JButton("4"),new JButton("1"),new JButton("0")},
{new JButton("8"),new JButton("5"),new JButton("2"),new JButton("+/-")},
{new JButton("9"),new JButton("6"),new JButton("3"),new JButton(".")},
{new JButton("/"),new JButton("*"),new JButton("-"),new JButton("+")},
{new JButton("sqrt"),new JButton("%"),new JButton("1/x"),new JButton("=")}
};
int first=0;
double qian;
String fuhao;
boolean clear=true,clickable=true;
public jisuanqi()
{
setFrame();
addListener();
}
public void setFrame()
{
this.setLayout(null);
this.setTitle("计算器");
jtResult.setBounds(120,100,310,30);
jtResult.setEditable(false);
jtResult.setHorizontalAlignment(JTextField.RIGHT);
this.add(jtResult);
jb_clear.setBounds(290,150,60,30);
this.add(jb_clear);
for(int i=0;i<jbArray.length;i++)
{
for(int j=0;j<jbArray[0].length;j++)
{
jbArray[i][j].setBounds(50+80*i,200+60*j,60,30);
this.add(jbArray[i][j]);
}
}
jb_delete.setBounds(370,150,60,30);
this.add(jb_delete);
this.setBounds(430,130,500,500);
this.setVisible(true);
}
public void addListener()
{
jtResult.addActionListener(this);
jb_clear.addActionListener(this);
jb_delete.addActionListener(this);
for(int i=0;i<jbArray.length;i++)
{
for(int j=0;j<jbArray[0].length;j++)
{
jbArray[i][j].addActionListener(this);
}
}
}
public void actionPerformed(ActionEvent e)
{
Object temp=e.getSource();
if(temp==jb_clear)
{
jtResult.setText("");
}
if(temp==jb_delete)
{
String s = jtResult.getText();
jtResult.setText("");
for (int i = 0; i < s.length() - 1; i++)
{
char a = s.charAt(i);
jtResult.setText(jtResult.getText() + a);
}
}
if(temp==jbArray[0][3])//点击"0"按钮
{
if(clear==false)//判断是否点击了符号位
jtResult.setText("");
jtResult.setText(jtResult.getText()+"0");
}
if(temp==jbArray[0][2])//点击"1"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"1");
clear=true;//第二次不在清空
}
if(temp==jbArray[1][2])//点击"2"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"2");
clear=true;
}
if(temp==jbArray[2][2])//点击"3"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"3");
clear=true;
}
if(temp==jbArray[0][1])//点击"4"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"4");
clear=true;
}
if(temp==jbArray[1][1])//点击"5"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"5");
clear=true;
}
if(temp==jbArray[2][1])//点击"6"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"6");
clear=true;
}
if(temp==jbArray[0][0])//点击"7"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"7");
clear=true;
}if(temp==jbArray[1][0])//点击"8"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"8");
clear=true;
}
if(temp==jbArray[2][0])//点击"9"按钮
{
if(clear==false)
jtResult.setText("");
jtResult.setText(jtResult.getText()+"9");
clear=true;
}
if(temp==jbArray[2][3])//点击"."按钮
{
clickable=true;
for (int i = 0; i < jtResult.getText().length(); i++)
if ('.' == jtResult.getText().charAt(i))
{
clickable=false;
break;
} //第一层判断是否里面含有小数点;
if(clickable==true)//第二坛判断
jtResult.setText(jtResult.getText()+".");
}
try
{
if(temp==jbArray[3][3])//点击"+"按钮
{
qian=Double.parseDouble(jtResult.getText());
fuhao="+";
clear=false;
}
if(temp==jbArray[3][2])//点击"-"按钮
{
qian=Double.parseDouble(jtResult.getText());
fuhao="-";
clear=false;
}
if(temp==jbArray[3][1])//点击"*"按钮
{
qian=Double.parseDouble(jtResult.getText());
fuhao="*";
clear=false;
}
if(temp==jbArray[3][0])//点击"/"按钮
{
qian=Double.parseDouble(jtResult.getText());
fuhao="/";
clear=false;
}
if(temp==jbArray[4][3])//点击"="按钮
{
double ss=Double.parseDouble(jtResult.getText());
jtResult.setText("");
if(fuhao=="+")
jtResult.setText(qian+ss+"");
if(fuhao=="-")
jtResult.setText(qian-ss+"");
if(fuhao=="*")
jtResult.setText(qian*ss+"");
if(fuhao=="/")
jtResult.setText(qian/ss+"");
clear=false;//要清空前一次的数据
}
if(temp==jbArray[4][0])//点击"sqrt"按钮
{
String s = jtResult.getText();
if(s.charAt(0) == '-')
{
jtResult.setText("负数不能开根号");
}
else
jtResult.setText(Double.toString(java.lang.Math.sqrt(Double.parseDouble(jtResult.getText()))));
clear=false;
}
if(temp==jbArray[4][2])//点击"1/x"按钮
{
if (jtResult.getText().charAt(0) == '0'&&jtResult.getText().length() == 1)
{
jtResult.setText("除数不能为零");
}
else
{
boolean isDec = true;
int i, j, k;
String s = Double.toString(1 / Double.parseDouble(jtResult.getText()));
for (i = 0; i < s.length(); i++)
if (s.charAt(i) == '.')
break;
for (j = i + 1; j < s.length(); j++)
if (s.charAt(j) != '0')
{
isDec = false;
break;
}
if (isDec == true)
{
String stemp = "";
for (k = 0; k < i; k++)
stemp += s.charAt(k);
jtResult.setText(stemp);
}
else
jtResult.setText(s);
}
clear=false;
}
if(temp==jbArray[4][1])//点击"%"按钮
{
jtResult.setText("0");
clear=false;
}
if (temp == jbArray[1][3]) //点击"+/-"按钮
{
boolean isNumber = true;
String s = jtResult.getText();
for (int i = 0; i < s.length(); i++)
if (! (s.charAt(i) >= '0'&&s.charAt(i) <= '9'||s.charAt(i) == '.'||s.charAt(i) == '-'))
{
isNumber = false;
break;
}
if (isNumber == true)
{
//如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉
if(s.charAt(0) == '-')
{
jtResult.setText("");
for (int i = 1; i < s.length(); i++)
{
char a = s.charAt(i);
jtResult.setText(jtResult.getText() + a);
}
}
//如果当前字符串第一个字符不是符号,则添加一个符号在首字母处
else
jtResult.setText('-' + s);
}
}
}
catch(Exception eee)
{
System.out.println("运算时,首先输入数字或字符");
jtResult.setText("运算出错");
clear=false;
}
}
public static void main(String args[])
{
new jisuanqi();
}
}
(3)效果图
CalculatorWindow创建的窗口效果如图1所示。
三、项目总结
本程序为JAVA中简单的计算器,主要实现简单的数学计算,删除,复位等功能。运用JAVA中的类,数组,成员变量等知识,有简单的界面,按钮等。
本程序还存在一定的缺陷,功能简单,界面还需美化等。
四、心得体会
编写一个程序,无论会实现什么功能,都必须掌握这门语言的要领、基本知识及工具的运用,同时别的辅助工具也要有一定的了解。因此要更好的运用Java语言编程还需更深入的学习,这样才能把一个程序的功能实现的淋漓尽致,界面才会更加美观。
同时编写这个程序让我更好的理解了数组、类的运用及事件的监听和获取等功能。