




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.(威海) 课 程 设 计基本信息学生姓名: 学号: 院系名称: 信息与电气工程学院 课程设计名称: 用CVI设计一个普通的计算器 课程设计地点: H408 课程设计时间:2012年11月5日至11月10日 同组人姓名: 课程设计内容目录 页码1、 课程设计题目与任务书.22、 课程设计用仪器设备名称. 3、 课程设计过程. 4、 课程设计心得、建议等. 教师评语及课程设计成绩 评语: 成绩: 教师签字:年 月 日一、课程设计题目与任务书课程设计(论文)任务书专 业测控技术与仪器班 级0902203学 生徐明珠指导教师王玲题 目虚拟仪器课程设计子 题用CVI设计一个普通的计算器设计时间2012年11月5日至2011年11月10日 共 1 周设计要求用CVI设计一个普通标准型计算器(参考操作系统中的计算器)1、 实现简单的加减乘除四则运算;2、 实现开方,百分数转化,取倒数运算;3、 可以实现清屏,清寄存器的功能;4、 实现计算器内部寄存器的存储,读取,加减,清寄存器的功能5、 菜单栏的复制,粘贴,退出等功能;指导教师签字: 系(教研室)主任签字:年 月 日二、课程设计用仪器设备名称 计算机一台、NI Labwindows CVI 软件;三、课程设计过程课程设计总体设计概述:题目要求我们使用CVI设计一个简易的计算器,由于功能应与操作系统中的计算器类似,因而我们首先应了解系统自带的计算器的功能。在了解了系统计算器的功能之后,我们便能使用CVI首先设计出计算器的用户界面,在生成源代码之后,为计算器每个按钮设计相对应的回调函数,通过不断的调试,使之满足设计要求,最后,我们还为设计的计算器添加了菜单,力求尽可能地与系统自带的计算器做到一样。3.1 了解系统计算器功能 图1 系统计算器操作系统自带的计算器如图1所示,下面分述各个按钮的功能1、 数字键09对应数字,小数点为插入小数点2、 加减乘除对应各自的功能,=号将运算结果显示出来3、 sqrt开方键,将显示的数直接开方,并显示4、 1/x 倒数键,将显示的数取倒数,并显示5、 % 百分号,将按百分比显示运算结果,如50+25%=62.56、 退格键,删除当前显示数字的最后一位7、 CE 清屏8、 C 清除当前的计算,包括显示的数和存储的数字和运算9、MS 将显示的数保存在内存中10、MR 将内存中存储的数显示出来11、MC 清除内存中存储的数12、M+ 将显示的数与内存中存储的数相加,并存储在寄存器中12、M将显示的数与内存中存储的数相减,并存储在寄存器中参照系统计算器,在CVI用户界面窗口设计了如图2的计算器面板。图2 CVI设计的计算器3.2 各按钮及回调函数介绍加减乘除运算程序介绍:1、数字键:当19的按键按下后,其对应的回调函数会读取相应按键的标题值,并与显示框的字符串连接后重新显示在文本框中,字符串用字符串数组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语言编写简单的计算器程序,熟悉了labwindows CVI的开发环境,基本掌握了编程方法。在实验中,我在数据的连续运算过程中遇到了困难,但通过分析,利用几个标志位来分别标志:是否是第一次进行运算的标志xflag,两次输入数据后是否有等号按下的标志equalflag,基本解决了连续运算的问题。总之,本次实验留给我的编程方法和思考方式,给了我很大的影响,我相信,在未来的学习中,这次实验将给予我产生巨大的指导附:/*/ Labwindows/cvi2009 实现了计算器的基本功能/*#include #include #include #include #include #include toolbox.h#include jisuanqi.h/*static int panelHandle,aboutpanelhandle;static int menubarhandle;static char str120; / 参数1的字符串static char str220; / 参数2的字符串static char str320; static char str420; static double strvalue1;/ 参数1的值static double strvalue2;/ 参数2的值static double strvalue3;/ 运算结果static double strvalue4;/ 计算器存储用变量static double strvalue5;/ 粘贴板用变量static double strvalue6;/static double strvalue7;/static int flag;/ 加减乘除的标志static int equalflag=1;/ 输完2个数后是否按下“=”标志static int mflag;static int xflag=1; int i;/*void setvalue (void);/*int main (int argc, char *argv)if (InitCVIRTE (0, argv, 0) = 0)return -1;/* out of memory */if (panelHandle = LoadPanel (0, jisuanqi.uir, PANEL) 0)return -1;DisplayPanel (panelHandle);menubarhandle = GetPanelMenuBar (panelHandle); /获取菜单栏的句柄RunUserInterface ();DiscardPanel (panelHandle);return 0;/* / 面板的函数/*int CVICALLBACK panelcb (int panel, int event, void *callbackData,int eventData1, int eventData2)switch (event)case EVENT_RIGHT_CLICK: / 弹出式的菜单RunPopupMenu (menubarhandle, MENUBAR_EDIT, panelHandle, eventData1, eventData2, 0, 0, 0, 0);break;case EVENT_CLOSE:QuitUserInterface (0);break;return 0;/*/清显示int CVICALLBACK cmd_ce (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT: SetCtrlVal (panelHandle, PANEL_STRING, 0); SetCtrlVal (panelHandle, PANEL_STRING_2, 0);break;return 0;/*/清字符串 int CVICALLBACK clear (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:str10=0;str20=0;str30=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;return 0;/* /按键输入/*int CVICALLBACK cmd_0 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_0, ATTR_LABEL_TEXT, labeltext);/ 读取控件的标题显示值strcat (str1, labeltext);/ 字符串连接,将此数值控件的标题显示值加到参数1的后面setvalue ();/显示文本框显示实时的参数1break;return 0;/*int CVICALLBACK cmd_1 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_1, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_2 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_2, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_3 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_3, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_4 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_4, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0; /*int CVICALLBACK cmd_5 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_5, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_6 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_6, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_7 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT: GetCtrlAttribute (panelHandle, PANEL_CMD_7, ATTR_LABEL_TEXT, labeltext); strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_8 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_8, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_9 (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_9, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*int CVICALLBACK cmd_dot (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)char labeltext2;switch (event)case EVENT_COMMIT:GetCtrlAttribute (panelHandle, PANEL_CMD_DOT, ATTR_LABEL_TEXT, labeltext);strcat (str1, labeltext);setvalue ();break;return 0;/*/if(equalflag=0)/strvalue4=strvalue4+strvalue1;/Fmt (str4, %s%f, strvalue4); /SetCtrlVal (panelHandle, PANEL_STRING, str4); / */*int CVICALLBACK cmd_plus (int panel, int control, int event, /运算符按下,表示第一个参数输入完毕void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT: if(equalflag=1)|(xflag=1)/有等号按下或者清零后第一次运算 GetCtrlVal (panelHandle, PANEL_STRING, str1);/从文本显示框获取参数1的值SetCtrlVal (panelHandle, PANEL_STRING, ); /输入数据行清空SetCtrlVal (panelHandle, PANEL_STRING_2, str1);/数据显示 Fmt (&strvalue1, %f%s, str1);/将参数1由字符串转化为double型数据,赋给strvalue1 str10=0;/字符串1清零flag=1;/ 1表示加法equalflag=0;/之前等号无效xflag=0; else GetCtrlVal (panelHandle, PANEL_STRING, str1);/取当前文本显示框参数1的值Fmt (&strvalue6, %f%s, str1);/Fmt (&strvalue7, %f%s, str3);/strvalue7=strvalue7+strvalue6;Fmt (str3, %f, strvalue7);SetCtrlVal (panelHandle, PANEL_STRING_2, str3);/数据显示mflag=1;str10=0;/字符串1清零flag=1;/ 1表示加法 break;return 0;/*int CVICALLBACK cmd_minus (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:if(equalflag=1)|(xflag=1)/有等号按下或者清零后第一次运算 GetCtrlVal (panelHandle, PANEL_STRING, str1);/从文本显示框获取参数1的值SetCtrlVal (panelHandle, PANEL_STRING, ); /输入数据行清空SetCtrlVal (panelHandle, PANEL_STRING_2, str1);/数据显示 Fmt (&strvalue1, %f%s, str1);/将参数1由字符串转化为double型数据,赋给strvalue1 str10=0;/字符串1清零flag=2;/ 2表示减法equalflag=0;/之前等号无效xflag=0; else GetCtrlVal (panelHandle, PANEL_STRING, str1);/取当前文本显示框参数1的值Fmt (&strvalue6, %f%s, str1);/Fmt (&strvalue7, %f%s, str3);/strvalue7=strvalue7-strvalue6;Fmt (str3, %f, strvalue7);SetCtrlVal (panelHandle, PANEL_STRING_2, str3);/数据显示mflag=1;str10=0;/字符串1清零flag=2;/ 2表示减法 break;return 0;/*int CVICALLBACK cmd_mul (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:if(equalflag=1)|(xflag=1)/有等号按下或者清零后第一次运算 GetCtrlVal (panelHandle, PANEL_STRING, str1);/从文本显示框获取参数1的值SetCtrlVal (panelHandle, PANEL_STRING, ); /输入数据行清空SetCtrlVal (panelHandle, PANEL_STRING_2, str1);/数据显示 Fmt (&strvalue1, %f%s, str1);/将参数1由字符串转化为double型数据,赋给strvalue1 str10=0;/字符串1清零flag=3;/ 3表示乘法equalflag=0;/之前等号无效xflag=0; else GetCtrlVal (panelHandle, PANEL_STRING, str1);/取当前文本显示框参数1的值Fmt (&strvalue6, %f%s, str1);/Fmt (&strvalue7, %f%s, str3);/strvalue7=strvalue7*strvalue6;Fmt (str3, %f, strvalue7);SetCtrlVal (panelHandle, PANEL_STRING_2, str3);/数据显示mflag=1;str10=0;/字符串1清零flag=3;/ 3表示乘法 break;return 0;/*int CVICALLBACK cmd_div (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:if(equalflag=1)|(xflag=1)/有等号按下或者清零后第一次运算 GetCtrlVal (panelHandle, PANEL_STRING, str1);/从文本显示框获取参数1的值SetCtrlVal (panelHandle, PANEL_STRING, ); /输入数据行清空SetCtrlVal (panelHandle, PANEL_STRING_2, str1);/数据显示 Fmt (&strvalue1, %f%s, str1);/将参数1由字符串转化为double型数据,赋给strvalue1 str10=0;/字符串1清零flag=4;/ 4表示除法equalflag=0;/之前等号无效xflag=0; else GetCtrlVal (panelHandle, PANEL_STRING, str1);/取当前文本显示框参数1的值Fmt (&strvalue6, %f%s, str1);/Fmt (&strvalue7, %f%s, str3);/strvalue7=strvalue7/strvalue6;Fmt (str3, %f, strvalue7);SetCtrlVal (panelHandle, PANEL_STRING_2, str3);/数据显示mflag=1;str10=0;/字符串1清零flag=4;/ 4表示除法 break;return 0;/*开方,百分,倒数后直接显示,不用等号* int CVICALLBACK cmd_sqrt (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:Delay (1);GetCtrlVal (panelHandle, PANEL_STRING, str1);/从文本显示框获取参数1的值Fmt (&strvalue1, %f=0)SetCtrlVal (panelHandle, PANEL_STRING, ); /输入数据行清空SetCtrlVal (panelHandle, PANEL_STRING_2, str1);/数据显示str10=0;strvalue2=sqrt(strvalue1);/参数1经过开方运算结果赋给参数2strvalue2Fmt (str2, %s%f, strvalue2);/参数2由double型转化为字符型,用于文本显示SetCtrlVal (panelHandle, PANEL_STRING, str2);str20=0; else SetCtrlVal (panelHandle, PANEL_STRING, 输入负数,不能开方); str10=0;break;return 0;/*int CVICALLBACK cmd_percent (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:Delay (1);GetCtrlVal (panelHandle, PANEL_STRING, str1);Fmt (&strvalue1, %f%s, str1); SetCtrlVal (panelHandle, PANEL_STRING, ); /输入数据行清空SetCtrlVal (panelHandle, PANEL_STRING_2, str1);/数据显示str10=0;strvalue2=100*(strvalue1);Fmt (str2, %s%f, strvalue2);strcat (str2, %);/连接%用于显示SetCtrlVal (panelHandle, PANEL_STRING, str2);str20=0;break;return 0;/*int CVICALLBACK cmd_daoshu (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:Delay (1);GetCtrlVal (panelHandle, PANEL_STRING, str1);Fmt (&strvalue1, %f%s, str1); SetCtrlVal (panelHandle, PANEL_STRING, ); /输入数据行清空SetCtrlVal (panelHandle, PANEL_STRING_2, str1);/数据显示str10=0;strvalue2=1/(strvalue1);Fmt (str2, %s%f, strvalue2);SetCtrlVal (panelHandle, PANEL_STRING, str2);str20=0;break;return 0;/*int CVICALLBACK cmd_equal (int panel, int control, int event,/按下等号后参数1已经存放于strvalue1中,下面将字符串1输入结果放入strvalue2中void *callbackData, int eventData1, int eventData2)switch (event)case EVENT_COMMIT:equalflag=1;if(mflag=0)GetCtrlVal (panelHandle, PANEL_STRING, str1);Fmt (&strvalue2, %f%s, str1); /将参数1由字符串转化为double型数据,赋给strvalue2switch (flag)case 1:strvalue3=strvalue1+strvalue2;break;case 2:strvalue3=strvalue1-strvalue2;break;case 3:strvalue3=strvalue1*strvalu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程电梯安装施工方案
- 2025秋季学期国开电大法律事务专科《刑法学(2)》期末纸质考试名词解释题库珍藏版
- 各类建筑施工安全防护方案
- 研学基地团队协作与合作能力培养方案
- 幕墙施工现场安全与环境管理方案
- 水电站防汛应急知识培训课件
- 正常人体解剖学躯干骨的骨性标志88课件
- 脂溶性维生素维生素D86课件
- 二零二五年度建筑废弃物资源化承包合同范本
- 2025版能源行业设备采购代理合同
- GB/T 43137-2023土方机械液压破碎锤术语和商业规格
- 京东集团员工手册-京东
- 2023年苏州市星海实验中学小升初分班考试数学模拟试卷及答案解析
- GB/T 37915-2019社区商业设施设置与功能要求
- GB/T 31298-2014TC4钛合金厚板
- GB/T 27746-2011低压电器用金属氧化物压敏电阻器(MOV)技术规范
- GB/T 22237-2008表面活性剂表面张力的测定
- GB/T 13667.3-2003手动密集书架技术条件
- 导轨及线槽项目投资方案报告模板
- 复旦大学<比较财政学>课程教学大纲
- 书法的章法布局(完整版)
评论
0/150
提交评论