课程设计—模拟计算器设计

合集下载

模拟计算器课程设计报告

模拟计算器课程设计报告

合肥学院计算机科学与技术系课程设计报告2009~2010学年第二学期课程JAVA语言课程设计课程设计名称模拟计算器专业班级07网络工程(1)姓名舒业超指导教师许强张贯虹2010年9月一、需求分析程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入‘=’ 符号后,窗口显示出结果。

故需先定义一个类,继承Frame类,来实现一个窗口的显示,还需添加两个文本框,一个用于输入运算表达式,另一个显示运算结果,并以等‘=’号为表达式结束符,并触发运算的开始,所以还需设置一个键盘监听器,监听‘=’号的输入。

该计算器还要两个C(清除)、A(全清除)按钮,并予以监听,触发后进行相应操作。

如果用户输入的表达式不合法,需判别出来并给出相应的错误提示。

二. 设计1.设计思想:该程序有较好的用户操作界面,组件布局采用手动布局,并对相应组件设置监听器,触发后执行相应操作。

该程序主要的算法功能是如何利用栈实现运算符优先级的比较。

先是定义申请两个堆栈,一个作为运算数栈,另一个作为运算符栈,这两个堆栈是扫描表达式时的存储容器,在扫描过程中,扫描的单位是一个字符,扫描到的运算数入数栈,运算符入运算符栈,待比较优先级后,运算数出栈进行运算。

对于表达式的非法性判断,通过捕获异常来处理,捕获到异常后,弹出一个错误提示对话框,提示表达式的非法,并要求用户全清除后重新输入正确并完整的表达式。

2.功能设计定义一个myframe类来继承Frame类,实现窗口的显示,并在其中进行手动布局,即添加一个表达式输入文本框、一个结果显示文本框、C(清除)以及A(全清除)按钮。

在表达式文本框中输入完整表达式之后按下‘=’号后,通过键盘监听器的监听,开始进行运算。

运算过程如下:先在窗口类中将表达式提取出来,此时表达式为串字符串,需通过一个方法将其进行切割,切割成字符数组形式,然后将字符数组传递给一个Calculator类中的Calculator1方法(即运算引擎)进行表达式的计算,在这个方法执行结束时可返回运算的结果,接着将结果显示在结果文本框中即可。

proteus仿真计算器课程设计

proteus仿真计算器课程设计

proteus仿真计算器课程设计一、课程目标知识目标:1. 学生能理解Proteus仿真软件的基本原理和操作流程;2. 学生能掌握利用Proteus进行简单计算器电路设计与仿真;3. 学生能了解并描述计算器电路中的基本电子元件及其功能;4. 学生掌握基本的数字电路知识,如逻辑门、触发器等。

技能目标:1. 学生能独立使用Proteus软件进行电路设计;2. 学生能通过Proteus软件进行电路仿真,并对结果进行分析;3. 学生能运用已学知识解决实际计算器电路设计中遇到的问题;4. 学生能通过团队协作,共同完成一个具有基本功能的计算器电路设计。

情感态度价值观目标:1. 学生培养对电子技术的兴趣,激发创新意识和实践欲望;2. 学生在团队合作中学会沟通、协作,培养团队精神和责任感;3. 学生通过动手实践,体验成功的喜悦,增强自信心;4. 学生树立正确的价值观,认识到科技发展对国家和社会的重要性。

本课程针对高年级学生,结合电子技术课程内容,以Proteus仿真软件为载体,使学生掌握基本电子元件和数字电路知识。

课程注重实践操作和团队协作,旨在提高学生的实际动手能力和创新能力,为后续深入学习电子技术打下坚实基础。

通过本课程的学习,学生将能够独立完成一个简单计算器电路的设计与仿真,并在过程中培养良好的情感态度和价值观。

二、教学内容1. 计算器电路设计基础理论:- 简介计算器电路的组成和原理;- 学习基本电子元件:电阻、电容、二极管、三极管等;- 了解并掌握数字电路基础知识:逻辑门、触发器、计数器等。

2. Proteus仿真软件操作:- 学习Proteus软件的基本界面和功能;- 掌握Proteus软件的电路设计、仿真和调试方法;- 学习如何利用Proteus软件绘制电路图、设置元件参数等。

3. 计算器电路设计与仿真:- 根据计算器功能需求,设计电路原理图;- 利用Proteus软件进行电路仿真,观察并分析仿真结果;- 针对仿真过程中出现的问题,进行调试和优化。

MFC课程设计报告—模拟计算器

MFC课程设计报告—模拟计算器

计算机MFC课程设计报告——模拟计算器姓名:学号:02011227联系电话:指导教师:东南大学机械工程学院2012年10月14日模拟计算器摘要摘要内容:以课本简单计算器为基础,首先实现了加、减、乘、除、求倒数和平方根的混合运算,并能进行清屏及倒退操作,然后自行完善了书中未能实现的乘、除运算的连续操作,最后自行设计并完成了lg、ln 、sin、cos、^、.、pi、e八个按钮控件的消息映射及程序代码的添加和修改。

从中学会了制作简单的基于对话框的小工具、掌握了常用控件的使用、明白了消息映射及消息处理、提高了VC++编程水平。

关键词:四则运算小数点计算器Analog calculatorAbstractContent of abstract: Simple calculator in textbooks as the foundation, first realized the addition, subtraction, multiplication, division, and reciprocal and square root of the mixed operation, and can clear screen and reverse operation, and then to improve the book failed to realize the multiplication, division operation of continuous operation, and finally to be designed and completed the eight button control news mapping and program code to add and modify. Learnt how to make simple dialog-based small tools, mastered the use of commonly used controls, see news mapping and information processing, improve the level of programming.Key word: arithmetic Decimal point Calculator本计算器是基于VC++的MFC编程,可完成大多数简单操作,其运行后界面如下图:以课本简单计算器为基础,首先实现了加、减、乘、除、求倒数和平方根的混合运算,并能进行清屏及倒退操作,然后自行完善了书中未能实现的乘、除运算的连续操作,最后自行设计并完成了lg、ln 、sin、cos、^、.、pi、e 八个按钮控件的消息映射及程序代码的添加和修改。

Java课设 模拟科学计算器

Java课设 模拟科学计算器

Java课程设计设计题目模拟科学计算器班级计本1120班姓名王XX 学号 1162042000一、设计目的《Java课程设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。

其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力,提高自身的应用能力。

二、设计任务模拟科学计算器要求:界面模拟Windows中的计算器程序。

实现基本数学运算、函数等功能:加、减、乘、除、阶乘、正弦、余弦和指数运算。

实现要点:添加相关组件并进行按钮事件处理。

三、课题设计思想对于此计算器程序,首先要设计其GUI界面,总体界面有一个文本框,22个按钮,总体界面用BorderLayout布局。

文本框放置在最north,然后0到9以及+,-,×,÷,.,!的按钮放置到一个面板Panel中,添加到整体布局的center,最后sin,cos,^,=的按钮放在最south,界面设计完成。

本项目用到了Java中的GUI界面和swing组件以及awt布局,所以简单易用,它能完成如下的几个小功能:点击按钮中的数字键和运算符键就能进行加、减、乘、除阶乘、正弦、余弦和指数运算。

还能通过用户自己在文本框中输入数字,进行简单运算;如果输入有误时可以按Clear撤销后重新输入新数据。

四、设计内容1.需求分析本项目需要实现一个具有四则运算的计算器,能够实现基本的加、减、乘、除运算,以及其他的辅助功能(阶乘、正弦、余弦、指数运算);界面简洁实用,模拟Windows中的计算器程序,要提供主要的设计思路、类的设计。

2.总体设计(1)包的描述本程序导入了java.awt.BorderLayout包,java.awt.Color包,java.awt.GridLayout包,java.awt.event.ActionEvent包,java.awt.event.ActionListener包,java.text.DecimalFormat包,javax.swing.JButton包,javax.swing.JFrame包,javax.swing.JPanel包,javax.swing.JTextField包(2)类的描述本程序共有五个类。

计算器模拟系统设计-毕业设计

计算器模拟系统设计-毕业设计

计算器模拟系统设计学生:XXX 指导教师:XXX内容摘要:本设计是基于51系列的单片机进行的简易计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除3位无符号数字的简单四则运算,并在LED 上相应的显示结果。

设计过程在硬件与软件方面进行同步设计。

硬件选择AT89C51单片机和74lS164,输入用4×4矩阵键盘。

显示用5位7段共阴极LED静态显示。

软件从分析计算器功能、流程图设计,再到程序的编写进行系统设计。

选用编译效率最高的Keil 软件用汇编语言进行编程,并用proteus仿真。

关键词:LED 计算器 AT89C51芯片 74LS164Calculator simulation system desig nAbstract:The design is a simple calculator based on 51 series microcontroller system design, to complete the calculator keyboard input, add, subtract, multiply, and in addition to three unsigned numeric simple four operations, and the corresponding result will be displayed on the LED.The design process of hardware and software aspects of the synchronous design. Hardware choose AT89C51 microcontroller and 74ls164--enter the 4 × 4 matrix keyboard. Static display with five 7-segment common cathode LED display. Software calculator function from the analysis, flow charts, design, and then program the preparation of system design. Selected to compile the most efficient Keil software in assembly language programming, and with proteus simulation.Keywords: LED calculator AT89C51 chip 74LS164目录前言 (1)1 设计任务和要求 (1)1.1 设计要求 (1)1.2 设计方案的确定 (2)2 单片机简要原理 (2)2.1 AT89c51介绍 (2)2.2 芯片74LS164介绍 (5)3 硬件设计 (6)3.1 键盘电路的设计 (6)3.2 显示电路的设计 (7)3.3 其他电路设计 (7)3.3.1 复位、时钟电路设计 (7)3.3.2 多位数码管电路显示的驱动电路 (8)4 软件设计 (9)4.1 主程序的设计 (9)4.2 显示、读键模块的设计 (10)4.3 其他内容说明 (11)4.3.1 定时查键的程序设计 (11)4.3.2 软件的可靠性设计 (12)4.4 源程序代码(见附录) (12)5 调试与仿真 (12)5.1 Keil C51单片机软件开发系统 (12)5.2 proteus的操作 (12)5.2.1 硬件电路图的接法操作 (12)5.2.2单片机系统PROTEUS设计与仿真过程 (13)6 结束语 (13)附录:计算器程序代码 (15)参考文献: (23)计算器模拟系统设计前言近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。

课程设计—模拟计算器设计

课程设计—模拟计算器设计

课程设计—模拟计算器设计void MainTask1(void *pdata) { pdata=pdata; BSP_Init ; //硬件初始化 GUI_Init ; //GUI初始化 GUI_SetBkColor(GUI_BLACK); //设置彩屏背景颜色为黑色GUI_Clear ; GUI_TOUCH_Calibrate(0,0,320,296,3854);GUI_TOUCH_Calibrate(1,0,240,249,3906); //屏幕校准 // GUI_CURSOR_Show ;//显示光标WidgetCreate ; //建立控件GUI_Exec ;//显示控件for(;;) { KeyCallback(edit); //响应控件 } }/*任务二:专门为触屏和控件的更新而建立的任务*/ void Task1(void *pdata) { pdata=pdata; for(;;) {WM_Exec ;//更新窗口GUI_TOUCH_Exec ; //更新触屏 OSTimeDly(10); } }b)、计算器图形界面的相关代码/*GUI相关变量*/ EDIT_Handle edit;BUTTON_Handle num0,num1,num2,num3,num4,num5,num6,num7,num8,num9;//数字0~9。

BUTTON_HandlenumPoint,numPlus,numSub,numMul,numDiv;//小数点,加号,减号。

除号,乘号BUTTON_Handle clear,inverse,square,equal,about; //清除,倒数,平方,等于/*图形界面函数*/void WidgetCreate(void) { /*画计算器边框*/6GUI_SetPenSize(3); GUI_SetColor(GUI_RED); GUI_DrawLine(7,0,7,239);GUI_DrawLine(311,0,311,239);GUI_DrawLine(7,238,311,238); GUI_DrawLine(7,1,311,1);//设置之前宽度为3个像素 //设置边框颜色为红色//画边框edit=EDIT_Create(15,5,225,50,'e',10,WM_CF_SHOW);//创建xx框 EDIT_SetFont(edit,&GUI_Font32B_ASCII); //设置xx框内容字体大小num7=BUTTON_Create(15,60,50,35,'7',WM_CF_SHOW);//创建数字7的按钮BUTTON_SetFont(num7,&GUI_Font24_ASCII); //设置字体24号BUTTON_SetText(num7,\ //按钮上显示7 BUTTON_SetTextColor(num7,0,GUI_WHITE); //设置字体颜色 BUTTON_SetBkColor(num7,0,GUI_DARKBLUE); //设置按钮背景颜色num4=BUTTON_Create(15,105,50,35,'4',WM_CF_SHOW);//创建数字4的按钮BUTTON_SetFont(num4,&GUI_Font24_ASCII);BUTTON_SetText(num4,\BUTTON_SetTextColor(num4,0,GUI_WHITE); BUTTON_SetBkColor(num4,0,GUI_DARKBLUE);num1=BUTTON_Create(15,150,50,35,'1',WM_CF_SHOW); //创建数字1的按钮BUTTON_SetFont(num1,&GUI_Font24_ASCII);BUTTON_SetText(num1,\BUTTON_SetTextColor(num1,0,GUI_WHITE); BUTTON_SetBkColor(num1,0,GUI_DARKBLUE);num0=BUTTON_Create(15,195,110,35,'0',WM_CF_SHOW);//创建数字0的按钮BUTTON_SetFont(num0,&GUI_Font24_ASCII);BUTTON_SetText(num0,\BUTTON_SetTextColor(num0,0,GUI_WHITE);BUTTON_SetBkColor(num0,0,GUI_DARKBLUE);num8=BUTTON_Create(74,60,50,35,'8',WM_CF_SHOW); //创建数字8的按钮BUTTON_SetFont(num8,&GUI_Font24_ASCII);BUTTON_SetText(num8,\BUTTON_SetTextColor(num8,0,GUI_WHITE); BUTTON_SetBkColor(num8,0,GUI_DARKBLUE);num5=BUTTON_Create(74,105,50,35,'5',WM_CF_SHOW); //创建数字5的按钮BUTTON_SetFont(num5,&GUI_Font24_ASCII);BUTTON_SetText(num5,\BUTTON_SetTextColor(num5,0,GUI_WHITE); BUTTON_SetBkColor(num5,0,GUI_DARKBLUE);num2=BUTTON_Create(74,150,50,35,'2',WM_CF_SHOW); //创建数字2的按钮BUTTON_SetFont(num2,&GUI_Font24_ASCII);BUTTON_SetText(num2,\BUTTON_SetTextColor(num2,0,GUI_WHITE);7钮钮按钮BUTTON_SetBkColor(num2,0,GUI_DARKBLUE);num9=BUTTON_Create(133,60,50,35,'9',WM_CF_SHOW); //创建数字9的按钮BUTTON_SetFont(num9,&GUI_Font24_ASCII);BUTTON_SetText(num9,\BUTTON_SetTextColor(num9,0,GUI_WHITE); BUTTON_SetBkColor(num9,0,GUI_DARKBLUE);num6=BUTTON_Create(133,105,50,35,'6',WM_CF_SHOW);//创建数字6的按钮BUTTON_SetFont(num6,&GUI_Font24_ASCII);BUTTON_SetText(num6,\BUTTON_SetTextColor(num6,0,GUI_WHITE); BUTTON_SetBkColor(num6,0,GUI_DARKBLUE);num3=BUTTON_Create(133,150,50,35,'3',WM_CF_SHOW); //创建数字3的按钮BUTTON_SetFont(num3,&GUI_Font24_ASCII);BUTTON_SetText(num3,\BUTTON_SetTextColor(num3,0,GUI_WHITE); BUTTON_SetBkColor(num3,0,GUI_DARKBLUE);numPoint=BUTTON_Create(133,195,50,35,'.',WM_CF_SHOW );//创建小数点.的按BUTTON_SetFont(numPoint,&GUI_Font24_ASCII); BUTTON_SetText(numPoint,\BUTTON_SetTextColor(numPoint,0,GUI_WHITE); BUTTON_SetBkColor(numPoint,0,GUI_DARKBLUE);numDiv=BUTTON_Create(192,60,50,35,'/',WM_CF_SHOW);/ /创建除号/的按钮BUTTON_SetFont(numDiv,&GUI_Font24_ASCII);BUTTON_SetText(numDiv,\numMul=BUTTON_Create(192,105,50,35,'*',WM_CF_SHOW); //创建乘号*的按钮BUTTON_SetFont(numMul,&GUI_Font24_ASCII);BUTTON_SetText(numMul,\numSub=BUTTON_Create(192,150,50,35,'-',WM_CF_SHOW); //创建减号-的按钮BUTTON_SetFont(numSub,&GUI_Font24_ASCII);BUTTON_SetText(numSub,\numPlus=BUTTON_Create(192,195,50,35,'+',WM_CF_SHOW); //创建加好+的按BUTTON_SetFont(numPlus,&GUI_Font24_ASCII);BUTTON_SetText(numPlus,\clear=BUTTON_Create(251,60,50,35,'c',WM_CF_SHOW); //创建清除键clear的BUTTON_SetFont(clear,&GUI_Font24_ASCII);BUTTON_SetText(clear,\BUTTON_SetBkColor(clear,0,GUI_YELLOW);8钮钮的按钮inverse=BUTTON_Create(251,105,50,35,'i',WM_CF_SHOW); //创建倒数1/X的按BUTTON_SetFont(inverse,&GUI_Font24_ASCII);BUTTON_SetText(inverse,\square=BUTTON_Create(251,150,50,35,'s',WM_CF_SHOW); //创建平方X^2的按BUTTON_SetFont(square,&GUI_Font24_ASCII);BUTTON_SetText(square,\equal=BUTTON_Create(251,195,50,35,'=',WM_CF_SHOW);//创建等号=的按钮BUTTON_SetFont(equal,&GUI_Font24_ASCII);BUTTON_SetText(equal,\BUTTON_SetBkColor(equal,0,GUI_YELLOW);about=BUTTON_Create(249,20,57,30,'a',WM_CF_SHOW); //创建说明信息aboutBUTTON_SetFont(about,&GUI_Font24_ASCII); BUTTON_SetText(about,\BUTTON_SetBkColor(about,0,GUI_LIGHTGRAY); }c)、按键响应代码/*按钮响应函数*/void KeyCallback(EDIT_Handle obj) { /*重画边框,因为控件在最上层,会把下层的图案覆盖掉*/ GUI_SetPenSize(3); GUI_SetColor(GUI_RED); GUI_DrawLine(7,0,7,239);GUI_DrawLine(311,0,311,239);GUI_DrawLine(7,238,311,238);GUI_DrawLine(7,1,311,1); switch (GUI_WaitKey ) { case '0': if(operaFlag==1) //如果是刚操作完运算符号后的数,先把xx框清掉{EDIT_SetText(obj,NULL); operaFlag=0;}EDIT_GetText(obj,editBuf,10); if((*editBuf!='0')) //保证不会出现001这样的情况{ EDIT_AddKey(obj,'0'); } break;9的情况case '1': if(operaFlag==1) { EDIT_SetText(obj,NULL); operaFlag=0; } EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.'))//保证不会出现.123这样{EDIT_SetText(obj,NULL);} EDIT_AddKey(obj,'1'); break; case '2': if(operaFlag==1) { EDIT_SetText(obj,NULL); operaFlag=0; } EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.')){ EDIT_SetText(obj,NULL); } EDIT_AddKey(obj,'2'); break; case '3': if(operaFlag==1) { EDIT_SetText(obj,NULL); operaFlag=0; } EDIT_GetText(obj,editBuf,10); if((*editBuf=='0')&&(*(editBuf+1)!='.')){ EDIT_SetText(obj,NULL); } EDIT_AddKey(obj,'3'); break; case '4': if(operaFlag==1) { EDIT_SetText(obj,NULL); operaFlag=0; } EDIT_GetText(obj,editBuf,10); if((*editBuf=='0')&&(*(editBuf+1)!='.')){ EDIT_SetText(obj,NULL); } EDIT_AddKey(obj,'4');10。

课程设计—模拟计算器设计..

课程设计—模拟计算器设计..

嵌入式课程设计课题:基于uCOS/uCGUI的模拟计算器实现报告:张昌世自动化091 109031027小组成员:刘锋自动化091 109031023陈奇英自动化091 109031001彭桂贤自动化091 109031002指导老师:陈才摘要:计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,但因其方便快捷的操作模式,已经被广泛应用于工程、学习、商业等日常生活中,极大的方便了人们对于数字的整合运算。

现今的计算器已经不仅仅停留在传统的硬件上,而是越来越软件化,它可以在手机里,在电脑上,在许许多的的电子产品上。

所以有必要在自己平时学习的开发板上做个带界面显示的计算器来证明下自己的能力。

引言:简单的计算器包括0~9的数字输入键,小数点输入键,+、-*、/、=运算键等,还可以加入其他运算:如三角运算(sin,cos,tan,cot等),一些当木运算(平方,开方,阶乘等)。

由于条件和能力有限,所以就做个能实现四则运算的简易计算器。

计算器的程序设计实际上富有一定的难度,虽然乍一想很简单,只要实现下加减乘除运算,然后显示出来就可以了,但实际上运算结果跟图像界面的数据交换,还有浮点数的处理等都很折腾人。

通过本次设计,体会到了学习的不易,还有自己能力上的不足!一、课题描述:在STM32开发板上实现简易的计算器。

计算器界面显示在TFT彩屏上,采用触摸屏上模拟按钮来实现数据及运算符的输入。

最后把运算的结果显示在彩屏。

最基本要求:有加减乘除运算,有带小数点的运算。

二、课题分析a)、硬件要求:处理器选择:STM32F103ZE,这款处理器具有512K的flash,64K的RAM,足够大的空间,可以让程序员的可以有更大的发挥空间,而不用为节省空间而上脑筋。

TFT彩屏:带触摸的TFT彩屏,3.2寸,分辨为240*320的真彩彩屏。

JLink仿真器:使用JLink v8仿真器,仿真器能够下载程序、在线仿真,便于程序编写与错误检查。

模拟计算器数字输入及显示课程设计

模拟计算器数字输入及显示课程设计

摘要本设计是一个实现加、减、乘、除的计算器,它的硬件主要由四部分组成,一个AT89C51单片机芯片,一个八位共阳极的数码管,一个4*4的键盘,一个排阻(10K)做P0口的上拉电阻(接线图在附录2),它可以实现结果低于65535的加、减、乘、除运算。

显示部分:采用动态显示,由八位共阳极数码管通过P0口,P2口与单片机相连,数码管的A,B,C,D,E,F,G,DP分别依次与单片机的P0.0—P0.7相连,P0口做为单片机的字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的P2.0—P2.7相连,P2口作为数码管的位控制端。

按键部分:采用4*4键盘。

采用软件识别键值并执行相应的操作,键盘的第0行到第3行依次与单片机的P3.4—P3.7管脚相连,键盘的第0列到第3列依次与单片机的P1.0—P1.3管脚相连,程序运行时依次扫描各行,查询是否有键按下,如果有则进入键盘识别处理程序,实现相应的运算,然后通过数码管输出结果,如果没有按键就调用显示程序显示一个0,等待按键按下,在进入按键扫描程序。

执行过程:开机即显示0,等待键入数值,当键入数字,将通过数码管显示出来,在键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当在键入数值后将显示键入的数值,按等号就会在数码管上输出运算结果。

注:结果不能超出65535。

(具体操作见后面仿真图)目录1 概述1.1MCS-51单片机在自动化仪表中的作用 (3)1.2掌握单片机仿真软件Proteus的使用方法 (3)1.3设计方法 (3)1.4基本功能 (4)2 系统总体方案及硬件设计2.1计算器总体思想 (5)2.2硬件的选择与连接 (6)3 软件设计3.1显示程序设计 (7)3.2键盘识别程序设计 (8)3.3运算程序设计 (10)3.4风鸣器程序设计 (10)4 Proteus软件仿真 (12)5课程设计体会 (16)参考文献 (18)附1:源程序代码 (19)附2:计算器模拟系统电路图 (31)1 概述1.1MCS-51单片机在自动化仪表中的作用单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

报告: 张昌世 自动化091 109031027 小组成员:刘锋 自动化091109031023 陈奇英 自动化091 109031001 彭桂贤 自动化091109031002指导老师:陈才 摘要:课题:嵌入式课程设计基于 uCOS/uCGUI 的模拟计算器实现计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,但因其方便快捷的操作模式,已经被广泛应用于工程、学习、商业等日常生活中,极大的方便了人们对于数字的整合运算。

现今的计算器已经不仅仅停留在传统的硬件上,而是越来越软件化,它可以在手机里,在电脑上,在许许多的的电子产品上。

所以有必要在自己平时学习的开发板上做个带界面显示的计算器来证明下自己的能力。

引言:简单的计算器包括0~9的数字输入键,小数点输入键,+、-*、人=运算键等,还可以加入其他运算:如三角运算(sin, cos,ta n,cot等),一些当木运算(平方,开方,阶乘等)。

由于条件和能力有限,所以就做个能实现四则运算的简易计算器。

计算器的程序设计实际上富有一定的难度,虽然乍一想很简单,只要实现下加减乘除运算,然后显示出来就可以了,但实际上运算结果跟图像界面的数据交换,还有浮点数的处理等都很折腾人。

通过本次设计,体会到了学习的不易,还有自己能力上的不足!一、课题描述:在STM32开发板上实现简易的计算器。

计算器界面显示在TFT彩屏上,采用触摸屏上模拟按钮来实现数据及运算符的输入。

最后把运算的结果显示在彩屏。

最基本要求:有加减乘除运算,有带小数点的运算。

二、课题分析a)、硬件要求:处理器选择:STM32F103ZE,这款处理器具有512K的flash,64K的RAM,足够大的空间,可以让程序员的可以有更大的发挥空间,而不用为节省空间而上脑筋。

TFT彩屏:带触摸的TFT彩屏,3.2寸,分辨为240*320的真彩彩屏。

JLink仿真器:使用JLink v8仿真器,仿真器能够下载程序、在线仿真,便于程序编写与错误检查。

b)、软件要求:操作系统:使用uC/OS嵌入式实时操作系统。

由于触屏要实时响应,所以需要使用操作系统,并给触屏专门建立一个任务。

CPU其他的操作组成一个任务。

程序在两个任务中相互切换。

图形软件:使用uCGUI嵌入式图形界面软件。

uCGUI是个小型的图形软件,包括有基本的图形显示,还有许多图形控件,如:按钮,编辑框,窗口,滚动条等等,而我们的计算器的制作就要用到其中的按钮、编辑框和窗口3个控件。

固件库:STM32编程,可以使用固件库,ST公司提供STM32处理器的固件库,以方便程序员编程,缩短了项目的编程周期。

C)、设计方案:界面布局:1 个编辑框:位于彩屏左上角,占整屏的1/5 左右,用于数据输入显示,运算符的输入显示。

编辑框内最大输入和显示的长度为10,这就限制了数据的范围。

11 个数子按钮:位于左下角开始向上向右的按钮队列,分别为:'1','2',‘3',‘ 4',‘ 5',‘ 6',‘ 7',‘ 8',‘ 9',‘ 0',‘ .'。

可以输入操作者任意想要的数据,进行运算。

6 个运算符按钮:位于屏幕偏右的数来第一列和第二列的位子上。

实现加减乘除倒数平方 6 个运算,对应的按钮分别为:‘+',‘ -',‘ * ',‘ /','1/X ' *2 '2 个操作按钮:位于屏幕右侧数来第一列的位子上。

功能分别为等号和清楚。

对应着’='和’clear'两个按钮。

等号得到计算得到的结果,清除键清楚编辑框上的数字和取消当前运算操作的功能1个说明按钮:位于屏幕的右上角。

对应’About '按钮,点击该按钮,就会跳出一个对话框,上面显示本课程设计的小组成员们名字。

1个对话框:当点击’About '按钮时,就会跳出来,对话框上显示四个课程设计小组成员的姓名,还有一个“ 0K “按钮,点击“ 0K ”按钮就会结束当前的对话框,关闭对话框。

功能说明:1、数字键被按下去时,在编辑框内显示输入的数,这里需要注意的是,编辑框内的内容时字符串的形式,例如按下12时,并不是表示数字12,而是字符串“ 12”,先是按下' 1'键,再按下' 2'键,按下第二个键的时候不能将编辑框的第一个数覆盖掉,而是要接到第一个数后面。

2、当运算符按钮被按下时,把按下去之前的编辑框的字符串转化成负浮点数形式保存在var[] 中,然后将编辑框显示 '+',如果运算符被按下了两次,表示之前已经有两个变量要进行了计算,直接显示结算结果。

3、当按下"1/X",和"X A2"时,并不增加变量的个数,只是将原先变量运算后的结果覆盖原先变量,参加后续的计算。

4、按下"About" 键是,会跳出一个对话框,该对话框支持移动,故可以将其拖到屏幕任意位子,点下对话框上的"OK" 键,就会关闭对话框。

之后再点下"About" 键后对话框优惠弹出来。

三、相关介绍说明a)、STM32F103ZT6E 介绍:ARM 32 位Cortex-M3 微处理器,72MHz 频率,512kB Flash, 64kB SRAM,灵活的静态存储器控制器存储器:SRAM, PSRAM, NOR 和NAND Flash,PLL,内置的RC正当频率为8MHz和32kHz,实时时钟,嵌套中断控制器,节电模式,JTAG和SWD两种模式,4个同步16位计时器与输入捕获,输出比较和PWM波,2个16位的高级定时器,2 个16位的基本定时器,2个16位的看门狗定时器,系统时钟定时器,3个SPI/I2S模块,2 个I2C 模块,5 个USART 模块,一个USB 2.0 全速接口,一个CAN 2.0B Active, 3 个112 位16通道A/D控制器,2个12位的D/A控制器,1个SDIO接口,快速的I/O 口。

b)、uCOS 介绍:Q/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。

它被广泛应用于微处理器、微控制器和数字信号处理器。

pC/OS-II的前身是Q/OS,最早出自于1992年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把P C/OS的源码发布在该杂志的 B B S上。

P C/OS和p C/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。

CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言|部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。

用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将p C/OS-II嵌入到开发的产品中。

P C/OS-II具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。

P C/OS-II已经移植到了几乎所有知名的CPU上。

严格地说uC/OS-ll只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。

没有提供输入输出管理,文件系统,网络等额外的服务。

但由于uC/OS-ll良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。

uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。

uC/OS-II以源代码的形式发布,但并不意味着它是开源软件。

你可以将其用于教学和私下研究(peaceful research );但是如果你将其用于商业用途,那么你必须通过Micrium获得商用许可。

c)、uCGUI 简介UCGUI是一种嵌入式应用中的图形支持系统。

它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境,并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。

它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。

| —UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。

UCGUI能够适应大多数的使用黑白或彩色LCD的应用,它提供非常好的允许处理灰度的颜色管理。

还提供一个可扩展的2D图形库及占用极少RAM的窗口管理体系。

UCGUI的设计目标是为使用LCD作为图形显示装置的应用提供高效的/与LCD控制器独立及处理器独立的图形用户接口。

它适合于单任务环境及多任务环境,如私用的操作系统或是商业的RTOS(实时操做系统。

UCGUI以C源码形式提供,并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。

它包含以下特_] 性:[1] 适用任何8/16/32位CPU,只要有相对应的标准 C 编译器.[2] 任何的控制器的LCD 显示器(单色,灰度,颜色),只要有适合的LCD 驱动可 用.[3] 在小模式显示时无须 LCD 控制器. [4] 所有接口支持使用宏进行配制 •[5] 显示尺寸可定制•[6] 字符和位图可在LCD 显示器上的任意起点显示,并不仅局限于偶数对齐的地址起点[10] 清晰的设计架构•[11] 支持虚拟 显示,虚拟显示可以比实际尺寸大(即放大).四、代码分析a )、uCOS 部分代码 建立两个任务/*OS 两个任务堆栈区*/OS_STK Main Task1Stk[MAXSTKSIZE]; OS_STK Task1Stk[MAXSTKSIZE]; /*两个任务函数*/void Mai nTask1(void *pdata); void Task1(void *pdata); /*主函数,建立两个任务 */ int mai n () {OSInit();//OS 初始化OSTaskCreate(Mai nTask1,(void *)0,&Mai nTask1Stk[MAXSTKSIZE-1],1);〃建立任务OSTaskCreate(Task1,(void *)0, &Task1Stk[MAXSTKSIZE-1],2); }OSStart();/*任务一:初始化板子,初始化液晶,建立计算器图像界面 void Main Task1(void *pdata ) {;8; ______ [9】 程序在大小和速度上都进行了优化 •编译时允许进行不同的优化 . 、、对于缓慢一些的LCD 控制器,LCD 显存可以映射到内存当中 ,从而减少访问次数到最小并达到更高的显示速度 *//* 任务二:专门为触屏和控件的更新而建立的任务 */void Task1(void *pdata){pdata=pdata; for(;;){WM_Exec();//更新窗口 GUI_TOUCH_Exec(); //更新触屏OSTimeDly(10);}}b)、计算器图形界面的相关代码/*GUI 相关变量 */ EDIT_Handle edit;BUTTON_Handle num0,num1,num2,num3,num4,num5,num6,num7,num8,num9;// 数字 0~9,BUTTON_Handle numPoint,numPlus,numSub,numMul,numDiv;// 小数点,加号,减号, 除号,乘号BUTTON_Handle clear,inverse,square,equal,about; // 清除,倒数,平方,等于 /* 图形界面函数 */void WidgetCreate(void){pdata=pdata; BSP_Init(); GUI_Init();GUI_SetBkColor(GUI_BLACK); GUI_Clear();GUI_TOUCH_Calibrate(0,0,320,296,3854); GUI_TOUCH_Calibrate(1,0,240,249,3906);// GUI_CURSOR_Show();WidgetCreate(); GUI_Exec(); for(;;){KeyCallback(edit);}}//硬件初始化 //GUI 初始化//设置彩屏背景颜色为黑色//屏幕校准 //显示光标 //建立控件 //显示控件//响应控件/* 画计算器边框 */ GUI_SetPenSize(3);GUI_SetColor(GUI_RED);//设置之前宽度为 3 个像素 //设置边框颜色为红色GUI_DrawLine(7,0,7,239);GUI_DrawLine(311,0,311,239); GUI_DrawLine(7,238,311,238); GUI_DrawLine(7,1,311,1);edit=EDIT_Create(15,5,225,50,'e',10,WM_CF_SHOW);// 创建编辑框 EDIT_SetFont(edit,&GUI_Font32B_ASCII); //设置编辑框内容字体大小 num7=BUTTON_Create(15,60,50,35,'7',WM_CF_SHOW);// 创建数字 7 的按钮 BUTTON_SetFont(num7,&GUI_Font24_ASCII); BUTTON_SetText(num7,"7");BUTTON_SetTextColor(num7,0,GUI_WHITE); BUTTON_SetBkColor(num7,0,GUI_DARKBLUE);num4=BUTTON_Create(15,105,50,35,'4',WM_CF_SHOW);// 创建数字 4 的按钮 BUTTON_SetFont(num4,&GUI_Font24_ASCII); BUTTON_SetText(num4,"4");BUTTON_SetTextColor(num4,0,GUI_WHITE); BUTTON_SetBkColor(num4,0,GUI_DARKBLUE);num1=BUTTON_Create(15,150,50,35,'1',WM_CF_SHOW); // 创建数字 1 的按钮 BUTTON_SetFont(num1,&GUI_Font24_ASCII); BUTTON_SetText(num1,"1");BUTTON_SetTextColor(num1,0,GUI_WHITE); BUTTON_SetBkColor(num1,0,GUI_DARKBLUE);num0=BUTTON_Create(15,195,110,35,'0',WM_CF_SHOW);// 创建数字 0 的按钮 BUTTON_SetFont(num0,&GUI_Font24_ASCII); BUTTON_SetText(num0,"0");BUTTON_SetTextColor(num0,0,GUI_WHITE); BUTTON_SetBkColor(num0,0,GUI_DARKBLUE); num8=BUTTON_Create(74,60,50,35,'8',WM_CF_SHOW); // 创建数字 8 的按钮BUTTON_SetFont(num8,&GUI_Font24_ASCII); BUTTON_SetText(num8,"8");BUTTON_SetTextColor(num8,0,GUI_WHITE); BUTTON_SetBkColor(num8,0,GUI_DARKBLUE);num5=BUTTON_Create(74,105,50,35,'5',WM_CF_SHOW); // 创建数字 5 的按钮 BUTTON_SetFont(num5,&GUI_Font24_ASCII); BUTTON_SetText(num5,"5");BUTTON_SetTextColor(num5,0,GUI_WHITE); BUTTON_SetBkColor(num5,0,GUI_DARKBLUE);num2=BUTTON_Create(74,150,50,35,'2',WM_CF_SHOW); // 创建数字 2 的按钮 BUTTON_SetFont(num2,&GUI_Font24_ASCII); BUTTON_SetText(num2,"2");BUTTON_SetTextColor(num2,0,GUI_WHITE); BUTTON_SetBkColor(num2,0,GUI_DARKBLUE);//画边框//设置字体 24 号 //按钮上显示 7 //设置字体颜色 //设置按钮背景颜色num9=BUTTON_Create(133,60,50,35,'9',WM_CF_SHOW); // 创建数字9 的按钮BUTTON_SetFont(num9,&GUI_Font24_ASCII);BUTTON_SetText(num9,"9");BUTTON_SetTextColor(num9,0,GUI_WHITE);BUTTON_SetBkColor(num9,0,GUI_DARKBLUE);num6=BUTTON_Create(133,105,50,35,'6',WM_CF_SHOW);// 创建数字6 的按钮BUTTON_SetFont(num6,&GUI_Font24_ASCII);BUTTON_SetText(num6,"6");BUTTON_SetTextColor(num6,0,GUI_WHITE);BUTTON_SetBkColor(num6,0,GUI_DARKBLUE);num3=BUTTON_Create(133,150,50,35,'3',WM_CF_SHOW); // 创建数字3 的按钮BUTTON_SetFont(num3,&GUI_Font24_ASCII);BUTTON_SetText(num3,"3");BUTTON_SetTextColor(num3,0,GUI_WHITE);BUTTON_SetBkColor(num3,0,GUI_DARKBLUE);钮numPoint=BUTTON_Create(133,195,50,35,'.',WM_CF_SHOW);// 创建小数点.的按BUTTON_SetFont(numPoint,&GUI_Font24_ASCII);BUTTON_SetText(numPoint,".");BUTTON_SetTextColor(numPoint,0,GUI_WHITE);BUTTON_SetBkColor(numPoint,0,GUI_DARKBLUE);numDiv=BUTTON_Create(192,60,50,35,'/',WM_CF_SHOW);// 创建除号/的按钮BUTTON_SetFont(numDiv,&GUI_Font24_ASCII);BUTTON_SetText(numDiv,"/");numMul=BUTTON_Create(192,105,50,35,'*',WM_CF_SHOW);// 创建乘号* 的按钮BUTTON_SetFont(numMul,&GUI_Font24_ASCII);BUTTON_SetText(numMul,"*");numSub=BUTTON_Create(192,150,50,35,'-',WM_CF_SHOW);// 创建减号-的按钮BUTTON_SetFont(numSub,&GUI_Font24_ASCII);BUTTON_SetText(numSub,"-");钮numPlus=BUTTON_Create(192,195,50,35,'+',WM_CF_SHOW); // 创建加好+的按BUTTON_SetFont(numPlus,&GUI_Font24_ASCII);BUTTON_SetText(numPlus,"+");clear=BUTTON_Create(251,60,50,35,'c',WM_CF_SHOW); // 创建清除键clear 的按钮BUTTON_SetFont(clear,&GUI_Font24_ASCII);BUTTON_SetText(clear,"clear");BUTTON_SetBkColor(clear,0,GUI_YELLOW);钮inverse=BUTTON_Create(251,105,50,35,'i',WM_CF_SHOW); // 创建倒数1/X 的按BUTTON_SetFont(inverse,&GUI_Font24_ASCII);case '1':if(operaFlag==1){EDIT_SetText(obj,NULL);BUTTON_SetText(inverse,"1/X");square=BUTTON_Create(251,150,50,35,'s',WM_CF_SHOW);〃 创建平方 X A 2 的按钮BUTTON_SetFont(square,&GUI_Font24_ASCII); BUTTON_SetText(square,"XA2");equal=BUTTON_Create(251,195,50,35,'=',WM_CF_SHOW);// 创建等号 =的按钮 BUTTON_SetFont(equal,&GUI_Font24_ASCII); BUTTON_SetText(equal,"=");BUTTON_SetBkColor(equal,0,GUI_YELLOW);about=BUTTON_Create(249,20,57,30,'a',WM_CF_SHOW); // 创建说明信息 about 的按钮BUTTON_SetFont(about,&GUI_Font24_ASCII); BUTTON_SetText(about,"About");BUTTON_SetBkColor(about,0,GUI_LIGHTGRAY);}c)、 按键响应代码/* 按钮响应函数 */void KeyCallback(EDIT_Handle obj){/*重画边框,因为控件在最上层,会把下层的图案覆盖掉 GUI_SetPenSize(3);GUI_SetColor(GUI_RED); GUI_DrawLine(7,0,7,239);GUI_DrawLine(311,0,311,239); GUI_DrawLine(7,238,311,238); GUI_DrawLine(7,1,311,1); switch (GUI_WaitKey()){*/case '0': if(operaFlag==1) //如果是刚操作完运算符号后的数,先把编辑框清掉 { EDIT_SetText(obj,NULL); operaFlag=0;}EDIT_GetText(obj,editBuf,10); if((*editBuf!='0')) //保证不会出现 001 这样的情况 EDIT_AddKey(obj,'0');}break;课程设计—模拟计算器设计operaFlag=0;}EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.'))// 保证不会出现.123 这样的情况{EDIT_SetText(obj,NULL);}EDIT_AddKey(obj,'1');break;case '2':if(operaFlag==1){EDIT_SetText(obj,NULL);operaFlag=0;}EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.')){EDIT_SetText(obj,NULL);}EDIT_AddKey(obj,'2');break;case '3':if(operaFlag==1){EDIT_SetText(obj,NULL);operaFlag=0;}EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.')){EDIT_SetText(obj,NULL);}EDIT_AddKey(obj,'3');break;case '4':if(operaFlag==1){EDIT_SetText(obj,NULL);operaFlag=0;}EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.')){EDIT_SetText(obj,NULL);}EDIT_AddKey(obj,'4');break;case '5':if(operaFlag==1){case '9': if(operaFlag==1){EDIT_SetText(obj,NULL);case '6': case '7': case '8': EDIT_SetText(obj,NULL); operaFlag=0; } EDIT_GetText(obj,editBuf,10); if((*editBuf=='0')&&(*(editBuf+1)!='.')) { EDIT_SetText(obj,NULL); } EDIT_AddKey(obj,'5'); break; if(operaFlag==1) { EDIT_SetText(obj,NULL); operaFlag=0;}EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.')) { EDIT_SetText(obj,NULL); } EDIT_AddKey(obj,'6'); break; if(operaFlag==1) { EDIT_SetText(obj,NULL); operaFlag=0;}EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.')){ EDIT_SetText(obj,NULL); }EDIT_AddKey(obj,'7'); break;if(operaFlag==1){ EDIT_SetText(obj,NULL);operaFlag=0;} EDIT_GetText(obj,editBuf,10); if((*editBuf=='0')&&(*(editBuf+1)!='.')) {EDIT_SetText(obj,NULL); } EDIT_AddKey(obj,'8');break;{ operaFlag=0;}EDIT_GetText(obj,editBuf,10);if((*editBuf=='0')&&(*(editBuf+1)!='.')) {EDIT_SetText(obj,NULL);}EDIT_AddKey(obj,'9');break;case '.':if(operaFlag==1){EDIT_SetText(obj,NULL); operaFlag=0; } EDIT_GetText(obj,editBuf,10); if(*editBuf!=NULL) { EDIT_AddKey(obj,'.'); } break; case 'i': //倒数 operaFlag=1; var[varCnt]=StoF(); var[varCnt]=1/var[varCnt]; result=var[varCnt]; FtoS(); EDIT_SetText(obj,editBuf); break; case 's': //平方 operaFlag=1; var[varCnt]=StoF(); var[varCnt]=var[varCnt]*var[varCnt]; result=var[varCnt]; FtoS(); EDIT_SetText(obj,editBuf); break; case '+': //加法 typeFlag='+'; var[varCnt++]=StoF(); //把输入到编辑框内的内容,转化成浮点数,保存在 var[] 中{ result=var[0]+var[1]; FtoS(); EDIT_SetText(obj,editBuf); if(numDir==0) // 判断结果正负填满,可以做运算操作了EDIT_SetText(obj,"+"); operaFlag=1; if(varCnt==2) //编辑框显示运算符 //varCnt=2, 表示 var[] 已经被 // 保证不会出现 .123 情况EDIT_SetCursorAtChar(obj,0);//EDIT_AddKey(obj,'-');}varCnt=0;}break;case '-': //减法typeFlag='-';operaFlag=1;var[varCnt++]=StoF();EDIT_SetText(obj,"-");if(varCnt==2){result=var[0]-var[1];FtoS();EDIT_SetText(edit,editBuf);if(numDir==0){EDIT_SetCursorAtChar(obj,0);EDIT_AddKey(obj,'-');}varCnt=0;}break;case '*': // 乘法typeFlag='*';operaFlag=1;var[varCnt++]=StoF();EDIT_SetText(obj,"*");if(varCnt==2){result=var[0]*var[1];FtoS();EDIT_SetText(edit,editBuf);if(numDir==0){EDIT_SetCursorAtChar(obj,0);EDIT_AddKey(obj,'-');}varCnt=0;}break;case '/': //除法typeFlag='/';operaFlag=1;var[varCnt++]=StoF();EDIT_SetText(obj,"/");if(varCnt==2)result=var[0]/var[1];FtoS();如果是符号//在编辑框数值最前面加'-'号{EDIT_SetText(edit,editBuf); if(numDir==0) {EDIT_SetCursorAtChar(obj,0);EDIT_AddKey(obj,'-');}varCnt=0;}break;case '=': // 等于operaFlag=1; var[varCnt++]=StoF(); switch(typeFlag) {case '+':result=var[0]+var[1]; break;result=var[0]-var[1]; break;result=var[0]*var[1]; break;result=var[0]/var[1];break; default:break;}typeFlag=0;FtoS();EDIT_SetText(edit,editBuf); if(numDir==0){EDIT_SetCursorAtChar(obj,0);EDIT_AddKey(obj,'-');}varCnt=0; break;case 'c': //清除operaFlag=1;EDIT_SetText(obj,NULL);break;case 'a': //关于ExecDialog();// 执行对话框default:break;}}d )、函数从编辑框读取字符串或把字符串写入到编辑框的,浮点数到字符串,和字符 串到浮点数的相关代码:/* 字符串转浮点数 */ float StoF(void){float tranf=0.0,a=0.0; int i,p=0;for(i=0;i<10;i++){editBuf[i]=0;}i=0;EDIT_GetText(edit,editBuf,11);tranf=editBuf[i]-'0';if(strstr(editBuf,".")!=NULL){case '-': case '/':while((editBuf[++i]!='.')&&i<10){tranf*=10;tranf=tranf+(editBuf[i]-'0');}}else{while((editBuf[++i]!='\0')&&i<10){tranf*=10;tranf=tranf+(editBuf[i]-'0');}}for(i=0;i<10;i++){if(editBuf[i]=='.'){p=i;break;}}if(p>0){for(i=9;i>p;i--){if(editBuf[i]!=0)a+=(editBuf[i]-'0'); a/=10;}}tranf=tranf+a;return tranf;}/* 浮点数转字符串*/int FtoS(void){int s1=0,sum=0,p=0,i=1;float s2;for(i=0;i<10;i++){editBuf[i]=0;}i=1;if(result<0){result=-result;numDir=0;}else{numDir=1;}s1=(int)result; s2=(float)((int)(result*10000-s1*10000))/10000;while(s1){s1/=10;sum++;}if(s1>10){EDIT_SetText(edit,"Overflow");return 0;}s1=(int)result;if(s2!=0) //说明有小数{if(sum==0){editBuf[sum]='0';sum+=1;}editBuf[sum]='.';while(s2!=0) //小数部分{if(sum+i<10){s2*=10;p=(int)s2; //取整editBuf[sum+i]=p+'0';s2=(s2*10000-p*10000)/10000;//取小数部分i++;}elsebreak;{}}else // 没有小数{editBuf[sum+1]=0;editBuf[sum+2]=0;editBuf[sum+3]=0;}while(sum--!=0) // 整数部分{editBuf[sum]=s1%10+'0';s1=s1/10;}return 1;}e)、关于dialog对话框的显示代码/*建立一个对话框dialog,存放组员信息*/static const GUI_WIDGET_CREATE_INFO DialogList[]={{FRAMEWIN_CreateIndirect,"GroupMember:",'f',60,60,190,120,FRAMEWIN_CF_MOVEABLE,0},{BUTTON_CreateIndirect,"OK",GUI_ID_OK, 68,60,60,20,0,0},{TEXT_CreateIndirect," 张昌世", '1',40,10,75,25,TEXT_CF_LEFT,0},{TEXT_CreateIndirect," 刘锋", '2',100,10,75,25,TEXT_CF_LEFT,0},{TEXT_CreateIndirect," 陈奇英", '3',40,40,75,25,TEXT_CF_LEFT,0}, {TEXT_CreateIndirect," 彭桂贤", '4',100,40,75,25,TEXT_CF_LEFT,0}, };/* 执行对话框*/void ExecDialog(void){WM_SetDesktopColor(GUI_BLACK);// 设置背景颜色GUI_ExecDialogBox(DialogList,GUI_COUNTOF(DialogList),&Callback,0,0,0);/*GUI_COUNTOF(DialogList): 计算DialogList 大小,后面3个0表示:第一个0表示没有父窗口,故后面为(0,0)*/}/*对话框的响应函数*/void Callback(WM_MESSAGE *pMsg){int NCode,Id;WM_HWIN text1,text2,text3,text4; WM_HWIN hWin=pMsg->hWin;if(pMsg->MsgId==WM_INIT_DIALOG){text1=WM_GetDialogItem(hWin,'1'); //获得对话框内控件的句柄text2=WM_GetDialogItem(hWin,'2');text3=WM_GetDialogItem(hWin,'3');text4=WM_GetDialogItem(hWin,'4');TEXT_SetFont(text1,&GUI_FontHZ_SimSun_14);// 设置TEXT 字体TEXT_SetFont(text2,&GUI_FontHZ_SimSun_14);TEXT_SetFont(text3,&GUI_FontHZ_SimSun_14);TEXT_SetFont(text4,&GUI_FontHZ_SimSun_14);}if(pMsg->MsgId==WM_NOTIFY_PARENT){Id=WM_GetId(pMsg->hWinSrc);NCode=pMsg->Data.v;if(NCode==WM_NOTIFICATION_RELEASED){if(Id==GUI_ID_OK) //响应按钮{GUI_EndDialog(hWin,0); //结束对话框}}FRAMEWIN_SetFont(hWin, &GUI_Font24B_ASCII);// 设置窗体的题目大小}}五、程序不足与分析程序一路写下来,遇到许许多多的瓶颈,让我曾一度放弃编写计算器第一个问题:从编辑框获取文本存储失败。

相关文档
最新文档