课程设计模拟计算器设计Word文档下载推荐.docx
《课程设计模拟计算器设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程设计模拟计算器设计Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
TFT彩屏:
带触摸的TFT彩屏,3.2寸,分辨为240*320的真彩彩屏。
JLink仿真器:
使用JLinkv8仿真器,仿真器能够下载程序、在线仿真,便于程序编写与错误检查。
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"
键,就会关闭对话框。
之后再点下"
键后对话框优惠弹出来。
3、相关介绍说明
a)、STM32F103ZT6E介绍:
ARM32位Cortex-M3微处理器,72MHz频率,512kBFlash,64kBSRAM,灵活的静态存储器控制器存储器:
SRAM,PSRAM,NOR和NANDFlash,PLL,内置的RC正当频率为8MHz和32kHz,实时时钟,嵌套中断控制器,节电模式,JTAG和SWD两种模式,4个同步16位计时器与输入捕获,输出比较和PWM波,2个16位的高级定时器,2个16位的基本定时器,2个16位的看门狗定时器,系统时钟定时器,3个SPI/I2S模块,2个I2C模块,5个USART模块,一个USB2.0全速接口,一个CAN2.0BActive,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年美国嵌入式系统专家JeanJ.Labrosse在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把μC/OS的源码发布在该杂志的BBS上。
μ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以源代码的形式发布,但并不意味着它是开源软件。
你可以将其用于教学和私下研究(peacefulresearch);
但是如果你将其用于商业用途,那么你必须通过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_STKMainTask1Stk[MAXSTKSIZE];
OS_STKTask1Stk[MAXSTKSIZE];
/*两个任务函数*/
voidMainTask1(void*pdata);
voidTask1(void*pdata);
/*主函数,建立两个任务*/
intmain()
{
OSInit();
//OS初始化
OSTaskCreate(MainTask1,(void*)0,&
MainTask1Stk[MAXSTKSIZE-1],1);
//建立任务
OSTaskCreate(Task1,(void*)0,&
Task1Stk[MAXSTKSIZE-1],2);
OSStart();
}
/*任务一:
初始化板子,初始化液晶,建立计算器图像界面*/
voidMainTask1(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);
//响应控件
}
/*任务二:
专门为触屏和控件的更新而建立的任务*/
voidTask1(void*pdata)
{
WM_Exec();
//更新窗口
GUI_TOUCH_Exec();
//更新触屏
OSTimeDly(10);
b)、计算器图形界面的相关代码
/*GUI相关变量*/
EDIT_Handleedit;
BUTTON_Handlenum0,num1,num2,num3,num4,num5,num6,num7,num8,num9;
//数字0~9,
BUTTON_HandlenumPoint,numPlus,numSub,numMul,numDiv;
//小数点,加号,减号,除号,乘号
BUTTON_Handleclear,inverse,square,equal,about;
//清除,倒数,平方,等于
/*图形界面函数*/
voidWidgetCreate(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'
//创建数字4的按钮
BUTTON_SetFont(num4,&
BUTTON_SetText(num4,"
4"
BUTTON_SetTextColor(num4,0,GUI_WHITE);
BUTTON_SetBkColor(num4,0,GUI_DARKBLUE);
num1=BUTTON_Create(15,150,50,35,'
1'
//创建数字1的按钮
BUTTON_SetFont(num1,&
BUTTON_SetText(num1,"
1"
BUTTON_SetTextColor(num1,0,GUI_WHITE);
BUTTON_SetBkColor(num1,0,GUI_DARKBLUE);
num0=BUTTON_Create(15,195,110,35,'
0'
//创建数字0的按钮
BUTTON_SetFont(num0,&
BUTTON_SetText(num0,"
0"
BUTTON_SetTextColor(num0,0,GUI_WHITE);
BUTTON_SetBkColor(num0,0,GUI_DARKBLUE);
num8=BUTTON_Create(74,60,50,35,'
8'
//创建数字8的按钮
BUTTON_SetFont(num8,&
BUTTON_SetText(num8,"
8"
BUTTON_SetTextColor(num8,0,GUI_WHITE);
BUTTON_SetBkColor(num8,0,GUI_DARKBLUE);
num5=BUTTON_Create(74,105,50,35,'
5'
//创建数字5的按钮
BUTTON_SetFont(num5,&
BUTTON_SetText(num5,"
5"
BUTTON_SetTextColor(num5,0,GUI_WHITE);
BUTTON_SetBkColor(num5,0,GUI_DARKBLUE);
num2=BUTTON_Create(74,150,50,35,'
2'
//创建数字2的按钮
BUTTON_SetFont(num2,&
BUTTON_SetText(num2,"
2"
BUTTON_SetTextColor(num2,0,GUI_WHITE);
BUTTON_SetBkColor(num2,0,GUI_DARKBLUE);
num9=BUTTON_Create(133,60,50,35,'
9'
//创建数字9的按钮
BUTTON_SetFont(num9,&
BUTTON_SetText(num9,"
9"
BUTTON_SetTextColor(num9,0,GUI_WHITE);
BUTTON_SetBkColor(num9,0,GUI_DARKBLUE);
num6=BUTTON_Create(133,105,50,35,'
6'
//创建数字6的按钮
BUTTON_SetFont(num6,&
BUTTON_SetText(num6,"
6"
BUTTON_SetTextColor(num6,0,GUI_WHITE);
BUTTON_SetBkColor(num6,0,GUI_DARKBLUE);
num3=BUTTON_Create(133,150,50,35,'
3'
//创建数字3的按钮
BUTTON_SetFont(num3,&
BUTTON_SetText(num3,"
3"
BUTTON_SetTextColor(num3,0,GUI_WHITE);
BUTTON_SetBkColor(num3,0,GUI_DARKBLUE);
numPoint=BUTTON_Create(133,195,50,35,'
.'
//创建小数点.的按钮
BUTTON_SetFont(numPoint,&
BUTTON_SetText(numPoint,"
."
BUTTON_SetTextColor(numPoint,0,GUI_WHITE);
BUTTON_SetBkColor(numPoint,0,GUI_DARKBLUE);
numDiv=BUTTON_Create(192,60,50,35,'
/'
//创建除号/的按钮
BUTTON_SetFont(numDiv,&
BUTTON_SetText(numDiv,"
/"
numMul=BUTTON_Create(192,105,50,35,'
*'
//创建乘号*的按钮
BUTTON_SetFont(numMul,&
BUTTON_SetText(numMul,"
*"
numSub=BUTTON_Create(192,150,50,35,'
-'
//创建减号-的按钮
BUTTON_SetFont(numSub,&
BUTTON_SetText(numSub,"
-"
numPlus=BUTTON_Create(192,195,50,35,'
+'
//创建加好+的按钮
BUTTON_SetFont(numPlus,&
BUTTON_SetText(numPlus,"
+"
clear=BUTTON_Create(251,60,50,35,'
c'
//创建清除键clear的按钮
BUTTON_SetFont(clear,&
BUTTON_SetText(clear,"
clear"
BUTTON_SetBkColor(clear,0,GUI_YELLOW);
inverse=BUTTON_Create(251,105,50,35,'
i'
//创建倒数1/X的按钮
BUTTON_SetFont(inverse,&
BUTTON_SetText(inverse,"
square=BUTTON_Create(251,150,50,35,'
s'
//创建平方X^2的按钮
BUTTON_SetFont(square,&
BUTTON_SetText(square,"
equal=BUTTON_Create(251,195,50,35,'
='
//创建等号=的按钮
BUTTON_SetFont(equal,&
BUTTON_SetText(equal,"
="
BUTTON_SetBkColor(equal,0,GUI_YELLOW);
about=BUTTON_Create(249,20,57,30,'
a'
//创建说明信息about的按钮
BUTTON_SetFont(about,&
BUTTON_SetText(about,"
BUTTON_SetBkColor(about,0,GUI_LIGHTGRAY);
c)、按键响应代码
/*按钮响应函数*/
voidKeyCallback(EDIT_Handleobj)
/*重画边框,因为控件在最上层,会把下层的图案覆盖掉*/
switch(GUI_WaitKey())
case'
:
if(operaFlag==1)//如果是刚操作完运算符号后的数,先把编辑框清掉
{
EDIT_SetText(obj,NULL);
operaFlag=0;
}
EDIT_GetText(obj,editBuf,10);
if((*editBuf!
))//保证不会出现001这样的情况
{