当前位置:文档之家› 课程设计—模拟计算器设计..

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

嵌入式课程设计课题:基于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仿真器,仿真器能够下载程序、在线仿真,便于程序编写与错误检查。

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’,’X^2’。

2个操作按钮:位于屏幕右侧数来第一列的位子上。

功能分别为等号和清楚。

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

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

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

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

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

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

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

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介绍:μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。

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

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

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

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

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

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

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

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

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

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

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显示器上的任意起点显示,并不仅局限于偶数对齐的地址起点.[7] 程序在大小和速度上都进行了优化.[8] 编译时允许进行不同的优化.、、[9] 对于缓慢一些的LCD控制器, LCD显存可以映射到内存当中, 从而减少访问次数到最小并达到更高的显示速度.[10]清晰的设计架构.[11]支持虚拟显示, 虚拟显示可以比实际尺寸大(即放大).四、代码分析a)、uCOS部分代码建立两个任务/*OS两个任务堆栈区*/OS_STK MainTask1Stk[MAXSTKSIZE];OS_STK Task1Stk[MAXSTKSIZE];/*两个任务函数*/void MainTask1(void *pdata);void Task1(void *pdata);/*主函数,建立两个任务*/int main(){OSInit(); //OS初始化OSTaskCreate(MainTask1,(void *)0,&MainTask1Stk[MAXSTKSIZE-1],1); //建立任务OSTaskCreate(Task1,(void *)0,&Task1Stk[MAXSTKSIZE-1],2);OSStart();}/*任务一:初始化板子,初始化液晶,建立计算器图像界面*/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_Handle numPoint,numPlus,numSub,numMul,numDiv;//小数点,加号,减号,除号,乘号BUTTON_Handle clear,inverse,square,equal,about; //清除,倒数,平方,等于/*图形界面函数*/void WidgetCreate(void){/*画计算器边框*/GUI_SetPenSize(3); //设置之前宽度为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);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); //设置字体24号BUTTON_SetText(num7,"7"); //按钮上显示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);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);BUTTON_SetText(inverse,"1/X");square=BUTTON_Create(251,150,50,35,'s',WM_CF_SHOW);//创建平方X^2的按钮BUTTON_SetFont(square,&GUI_Font24_ASCII);BUTTON_SetText(square,"X^2");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;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');break;case '5':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,'5');break;case '6':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;case '7':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;case '8':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;case '9':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,'9');break;case '.':if(operaFlag==1){EDIT_SetText(obj,NULL);operaFlag=0;}EDIT_GetText(obj,editBuf,10);if(*editBuf!=NULL) //保证不会出现.123情况{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[]中EDIT_SetText(obj,"+"); //编辑框显示运算符operaFlag=1;if(varCnt==2) //varCnt=2,表示var[]已经被填满,可以做运算操作了{result=var[0]+var[1];FtoS();EDIT_SetText(obj,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 '/': //除法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;case '-':result=var[0]-var[1];break;case '*':result=var[0]*var[1];break;case '/':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){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++;}else{break;}}}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);//设置窗体的题目大小}}五、程序不足与分析程序一路写下来,遇到许许多多的瓶颈,让我曾一度放弃编写计算器第一个问题:从编辑框获取文本存储失败。

相关主题