CVI计算器设计报告.docx
《CVI计算器设计报告.docx》由会员分享,可在线阅读,更多相关《CVI计算器设计报告.docx(38页珍藏版)》请在冰点文库上搜索。
CVI计算器设计报告
课程设计
基本信息
学生姓名:
学号:
院系名称:
信息与电气工程学院
课程设计名称:
用CVI设计一个普通的计算器
课程设计地点:
H408
课程设计时间:
2012年11月5日至11月10日同组人姓名:
课程设计内容目录页码
1、课程设计题目与任务书...……………………………………………......[2]
2、课程设计用仪器设备名称...……………………………………………..[]
3、课程设计过程……...……………………………………………………..[]
4、课程设计心得、建议等……...…………………………………………..[]
教师评语及课程设计成绩
评语:
成绩:
教师签字:
年月日
一、课程设计题目与任务书
课程设计(论文)任务书
专业
测控技术与仪器
班级
0902203
学生
徐明珠
指导教师
王玲
题目
虚拟仪器课程设计
子题
用CVI设计一个普通的计算器
设计时间
2012年11月5日至2011年11月10日共1周
设计要求
用CVI设计一个普通标准型计算器(参考操作系统中的计算器)
1、实现简单的加减乘除四则运算;
2、实现开方,百分数转化,取倒数运算;
3、可以实现清屏,清寄存器的功能;
4、实现计算器内部寄存器的存储,读取,加减,清寄存器的功能
5、菜单栏的复制,粘贴,退出等功能;
指导教师签字:
系(教研室)主任签字:
年月日
二、课程设计用仪器设备名称
计算机一台、NILabwindowsCVI软件;
三、课程设计过程
课程设计总体设计概述:
题目要求我们使用CVI设计一个简易的计算器,由于功能应与操作系统中的计算器类似,因而我们首先应了解系统自带的计算器的功能。
在了解了系统计算器的功能之后,我们便能使用CVI首先设计出计算器的用户界面,在生成源代码之后,为计算器每个按钮设计相对应的回调函数,通过不断的调试,使之满足设计要求,最后,我们还为设计的计算器添加了菜单,力求尽可能地与系统自带的计算器做到一样。
3.1了解系统计算器功能
图1系统计算器
操作系统自带的计算器如图1所示,下面分述各个按钮的功能
1、数字键0—9对应数字,小数点为插入小数点
2、加减乘除对应各自的功能,=号将运算结果显示出来
3、sqrt开方键,将显示的数直接开方,并显示
4、1/x倒数键,将显示的数取倒数,并显示
5、%百分号,将按百分比显示运算结果,如50+25%=62.5
6、←退格键,删除当前显示数字的最后一位
7、CE清屏
8、C清除当前的计算,包括显示的数和存储的数字和运算
9、MS将显示的数保存在内存中
10、MR将内存中存储的数显示出来
11、MC清除内存中存储的数
12、M+将显示的数与内存中存储的数相加,并存储在寄存器中
12、M—将显示的数与内存中存储的数相减,并存储在寄存器中
参照系统计算器,在CVI用户界面窗口设计了如图2的计算器面板。
图2CVI设计的计算器
3.2各按钮及回调函数介绍
加减乘除运算程序介绍:
1、数字键:
当1~9的按键按下后,其对应的回调函数会读取相应按键的标题值,并与显示框的字符串连接后重新显示在文本框中,字符串用字符串数组str1[]存储。
2、符号键:
当+,—,*,/,键按下后,会当做运算的第一个数已经输入完毕并存于str1中,将其转化为double型数据存储进strvalue1,并置运算符号的标志位,便于等号处理。
3、等号键:
当等号键按下后表明运算的第二个数已经输入完毕,将当前的输入数据转化为double型数据,并存储于strvalue2中,依据符号标志位值进行相应的操作,将运算结果存储在strvalue3中,并转化为字符串送文本框显示。
(注:
此计算器可以实现连续运算:
equalflag为输入完参加运算的两个数后是否有等号按下;若有等号按下equalflag=1,则进行有等号的正常运算操作,若没有等号按下equalflag=0,则表明有连续运算,在相应的连续运算的符号的回调函数中进行相应的运算,相当于在符号控件的回调函数中有等号运算操作)
其他按键介绍:
5、开方键:
当第一个数输入完毕后,当按下开方键后,在相应的回调函数
中将第一个数由字符串转化为double型数据存储在strvalue1中,并strvalue2=sqrt(strvalue1),将strvalue2转化为字符串并送文本框显示结果。
6、百分键:
当第一个数输入完毕后,当按下百分键后,在相应的回调函数
中将第一个数由字符串转化为double型数据存储在strvalue1中,并strvalue2=100*(strvalue1),将strvalue2转化为字符串str2,并连接%后,送文本框显示结果。
7、倒数键:
当第一个数输入完毕后,当按下倒数键后,在相应的回调函数
中将第一个数由字符串转化为double型数据存储在strvalue1中,并strvalue2=1/(strvalue1),将strvalue2转化为字符串str2,送文本框显示结果。
8、后退键:
当数输入完毕后,当按下后退键后,在相应的回调函数里,
获取当前文本框的字符串,并获取当前字符串的长度,对字符串的最后字符置零。
并送文本框显示。
9、清屏键:
当数输入完毕后,当按下清屏键后,在相应的回调函数里,
将文本框送“”显示。
10、清运算结果键:
当数输入完毕后,当按下C键后,在相应的回调
函数里将字符串数组,存储器清0。
11、当前显示数据存储键MS:
MS键将当前显示数据存储在寄存器中。
12、之前存储数据读取键MR:
MR键将之前存储在寄存器中的数据读取,并显示在文本框。
13、存储数据运算键M+(—):
将之前MS存储数据与当前数据加,减后放到文本框显示。
14、请存储键MC:
将存储器里的数据清0。
附加菜单介绍:
15、复制菜单:
将当前显示的数据复制到系统粘贴板上。
16、粘贴菜单:
将系统粘贴板上数据粘贴到当前文本框中。
四、课程设计心得
通过本次虚拟仪器课设,我学到了如何用C语言编写简单的计算器程序,熟悉了labwindowsCVI的开发环境,基本掌握了编程方法。
在实验中,我在数据的连续运算过程中遇到了困难,但通过分析,利用几个标志位来分别标志:
是否是第一次进行运算的标志xflag,两次输入数据后是否有等号按下的标志equalflag,基本解决了连续运算的问题。
总之,本次实验留给我的编程方法和思考方式,给了我很大的影响,我相信,在未来的学习中,这次实验将给予我产生巨大的指导
附:
//*********************************************************
//Labwindows/cvi2009实现了计算器的基本功能
//*********************************************************
#include
#include
#include
#include
#include
#include"toolbox.h"
#include"jisuanqi.h"
//*********************************************************
staticintpanelHandle,aboutpanelhandle;
staticintmenubarhandle;
staticcharstr1[20];//参数1的字符串
staticcharstr2[20];//参数2的字符串
staticcharstr3[20];
staticcharstr4[20];
staticdoublestrvalue1;//参数1的值
staticdoublestrvalue2;//参数2的值
staticdoublestrvalue3;//运算结果
staticdoublestrvalue4;//计算器存储用变量
staticdoublestrvalue5;//粘贴板用变量
staticdoublestrvalue6;//
staticdoublestrvalue7;//
staticintflag;//加减乘除的标志
staticintequalflag=1;//输完2个数后是否按下“=”标志
staticintmflag;
staticintxflag=1;
inti;
//*********************************************************
voidsetvalue(void);
//*********************************************************
intmain(intargc,char*argv[])
{
if(InitCVIRTE(0,argv,0)==0)
return-1;/*outofmemory*/
if((panelHandle=LoadPanel(0,"jisuanqi.uir",PANEL))<0)
return-1;
DisplayPanel(panelHandle);
menubarhandle=GetPanelMenuBar(panelHandle);//获取菜单栏的句柄
RunUserInterface();
DiscardPanel(panelHandle);
return0;
}
//*********************************************************
//面板的函数
//*********************************************************
intCVICALLBACKpanelcb(intpanel,intevent,void*callbackData,
inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_RIGHT_CLICK:
//弹出式的菜单
RunPopupMenu(menubarhandle,MENUBAR_EDIT,panelHandle,eventData1,eventData2,0,0,0,0);
break;
caseEVENT_CLOSE:
QuitUserInterface(0);
break;
}
return0;
}
//*********************************************************
//清显示
intCVICALLBACKcmd_ce(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
SetCtrlVal(panelHandle,PANEL_STRING,"0");
SetCtrlVal(panelHandle,PANEL_STRING_2,"0");
break;
}
return0;
}
//*********************************************************
//清字符串
intCVICALLBACKclear(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
{
str1[0]='\0';
str2[0]='\0';
str3[0]='\0';
strvalue1=0;
strvalue2=0;
strvalue3=0;
strvalue4=0;
strvalue5=0;
strvalue6=0;
strvalue7=0;
flag=0;
equalflag=0;
mflag=0;
xflag=1;//清零或启动后第一次运算的标志
SetCtrlVal(panelHandle,PANEL_STRING,"0");
SetCtrlVal(panelHandle,PANEL_STRING_2,"0");
break;
}
}
return0;
}
//*********************************************************
//按键输入
//*********************************************************
intCVICALLBACKcmd_0(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_0,ATTR_LABEL_TEXT,labeltext);//读取控件的标题显示值
strcat(str1,labeltext);//字符串连接,将此数值控件的标题显示值加到参数1的后面
setvalue();//显示文本框显示实时的参数1
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_1(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_1,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_2(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_2,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_3(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_3,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_4(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_4,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_5(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_5,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_6(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_6,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_7(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
{
GetCtrlAttribute(panelHandle,PANEL_CMD_7,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_8(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_8,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_9(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
charlabeltext[2];
switch(event)
{
caseEVENT_COMMIT:
GetCtrlAttribute(panelHandle,PANEL_CMD_9,ATTR_LABEL_TEXT,labeltext);
strcat(str1,labeltext);
setvalue();
break;
}
return0;
}
//*********************************************************
intCVICALLBACKcmd_dot(intpanel,intcontrol,int