嵌入式实验cortex-M3计算器
基于32bit Cortex-M3的嵌入式实验教学系统

和彩 色 、 度渐变 。 呼吸灯 亮 效果 。 “ ” 一 , + 键灯 键 + “ ” 按“ ” 亮度加一等级 , “ ” L D 按 一键 E 减一等级 。 2 . 计时秒表 : 按键K 按下 启动, 再按停 止 ,F 触屏显 TT 示 x .X s精确 到 1ms XX m , 0 级
3用手机发短信 , . 经过S 模块 在T 屏显示 出来 , MS 丌、 并控制 防空报警音启动或停止 。 4环境温 度 网络 化监控一 M : . S S 使用D 1B 0 I , S8 2 ̄ 温 ] 通 过手机短信查 询温度 , 装置通过 S S M 短信 回复 , 报告 当前 温度 。 5 自制体温计 : S 8 2  ̄ ,F 屏显示 图形化温 . D 1B 0 N温 T T 度计刻度 , 颜色 可变 。 6G S .P 定时定位 : P 捕获 当前时 间 、 纬度和速度 GS 经 信 息 , 屏显示出来 , 以乘汽车或火车验证 。 T 可 7密码 锁 :* 键 盘 , . 44 密码 对则 L D流水灯 全亮 , E 否
圈3
4 . 实验教学 中实验系统 的使用 。在实验教学 中 , 教 学老师 只提供实 验系统P B C 以及根 据学生 自主设计 的 实验提供相应模块 的电子元器件 ,由学生 自己将其焊 接成形 , 从而锻炼学生的焊接基础 能力 。本实验系统 的 各种外设模 块可 以单个进行操作 ,也 可 以进行相互 结 合完成 更多功能更加复杂 的实 验设 计 ,充分发挥学 生
计。 二、 试验 系统软件设计
1 软件环境 。①综合开发环境 ( e u io3 。 . K i V s n ) l i K i 司 的u io 3 e公 l Vs n 是一个 窗 口化 的软件 开发平 台 , i 它 集成 了功 能强 大的源代码编辑器 、 富的设 备数据库 、 丰 高速C U 片上外设 模拟器 、该级G I 口 ̄l h P及 D接 Fa 编程 s 器 、完善 的开发 工具手册 、设备数据 手册和用户 向导 等 。 e u io 3 在K i Vs n 开发平 台中建立好工程 , 编写好 l i 并 C 言程序 文件 后 ,利 用开 发平 台生成 It H X 语 ne l E 文
ARM Cortex-M3处理器简介

ARM 白皮书
——ARM Cortex-M3 处理器简介 Shyam Sadasivan October 2006
广州周立功单片机发展有限公司 地址:广州市天河北路 689 号光大银行大厦 15 楼 F1
ARM 白皮书
目录
目录
第 1 章 简介 ....................................................................................................................................1 1.1 通过提高效率来提高性能................................................................................................1 1.2 快速有效的应用程序开发源于简易的使用方法 ............................................................1 1.3 针对敏感市场降低成本和功耗........................................................................................1 1.4 集成的调试和跟踪功能推进上市的步伐........................................................................2 1.5 从ARM7TM升级为Cortex-M3 可获取更佳的性能和功效 ..............................................2
第 5 章 针对无线网络实现了更低的功耗...................................................................................15 5.1 时钟门控和内置睡眠模式可以降低功耗......................................................................15 5.2 通过灵活的工作方式来增加处于睡眠模式的时间 ......................................................15 5.3 真正实现省电..................................................................................................................16
arm cortex — m3程序运行机制

Arm Cortex-M3程序运行机制1. 引言在当今科技快速发展的时代,嵌入式系统在各个领域都有着广泛的应用。
而Arm Cortex-M3处理器作为一款低功耗、高性能的嵌入式处理器,其程序运行机制尤为重要。
本文将详细探讨Arm Cortex-M3程序运行机制,以帮助读者更深入地理解这一主题。
2. 程序运行机制概述在开始深入探讨Arm Cortex-M3程序运行机制之前,我们先来了解一下其基本概念。
Arm Cortex-M3处理器采用哈佛结构,将指令和数据存储在不同的存储器中,这有利于提高处理器的并行度和性能。
而其程序运行机制主要包括指令获取、指令解码、指令执行和结果写回等步骤。
3. 指令获取在程序运行过程中,处理器首先需要从存储器中获取指令。
Arm Cortex-M3处理器采用了高速缓存和预取技术,以提高指令获取的效率。
处理器还会根据指令的位置区域生成预取请求,以确保能够及时获取到所需的指令。
4. 指令解码当指令被获取到后,处理器需要对指令进行解码,以确定其具体的操作。
Arm Cortex-M3处理器采用了精简指令集(RISC)架构,使得指令解码的过程更加高效。
处理器还会根据指令类型和操作数的位置等信息,对指令进行进一步的解析和处理。
5. 指令执行在指令解码完成后,处理器会根据指令的类型和操作数,执行相应的操作。
对于不同类型的指令,处理器会采用不同的执行单元和执行流水线,以确保指令的高效执行。
处理器还会根据需要进行寄存器操作和内存访问等操作,以完成指令的执行过程。
6. 结果写回在指令执行完成后,处理器会将计算的结果写回寄存器或存储器中。
处理器还会更新程序计数器(PC)的值,以指向下一条需要执行的指令。
这样,整个程序运行的过程就完成了一次循环,从而实现了指令的连续执行。
7. 总结和回顾通过以上对Arm Cortex-M3程序运行机制的全面探讨,我们可以看到其采用了一系列高效的技术和方法,以确保程序能够高效地运行。
Cortex-M3 权威指南

Cortex-M3权威指南J oseph Yiu 著宋岩 译译序我接触ARM的历史约4年,早期是很欣赏这类处理器,到了后来切身使用它们的机会越来越多,慢慢地有了感觉,也更加喜欢了。
在偶然听说Cortex‐M3后,我就冥冥地感到它不寻常。
只是因为其它工作一直没有去了解它,直到今年初才进一步学习,很快就觉得相知恨晚。
当时只能看ARM官方的重量级资料,在看到这本书的英文原稿后,更感觉被电到了一样,于是突然有了把它翻译成中文的冲动。
经过累计约150个小时的奋战,终于有了此译稿。
在翻译过程中,我始终采用下列指导思想:1.尽量使用短句,并且把句子口语化。
我认为高深的道理不一定要用高级的语法句型才能表达。
想想看,即使是几位博士互相聊天讨论一个课题,也还是使用口语吧,而且火花往往就是在这种讨论中产生呢!2.多用修辞方法,并且常常引用表现力强的词汇——甚至包括网络用语和脍炙人口的歌词。
另外,有时会加工句子,使得风格像是对话。
这样做的目的是整个文风更鲜活——有点像为写出高分作文而努力的样子。
这点可能与很多学术著作的“严肃、平实”文风不同,也是一次大胆的尝试。
还希望读者不吝给予反馈。
3.在“宏观”上直译,在“微观”上意译。
英语不仅单一句子的语法和汉语不同,并且句子的连贯方式也与汉语不同。
因此在十几个到几十个单词的范围内,我先把它们翻译成脑子里的“中间语言”,再把中间语言翻译成汉语。
这样,就最大地避免了贻笑大方的“英式汉语”。
4.有些术语名词不方便翻译成汉语,或者目前的翻译方式不统一,或者与其它术语翻译的结果很接近,如error和fault,就只能用英语意会。
此时我就保留英文单词,相信这样比硬生生地翻译成汉语还好。
这些词汇主要是:retarget, fault, region等。
另外,英文中有一个很能精练表达“两者都”意思的单词及其用法:”both”,我也常常保留之。
5.图表对颜色的使用比较丰满,尤其是比较大型的插图,相信这样能帮助读者分析和理解。
嵌入式--计算器--实验报告

计算器设计实验报告一、实验设计主要分工04009320 文斌:算法设计,LCD显示。
04** 张希:界面(按钮控件)设计,文件内容读取。
共同调试、完善设计。
二、程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。
优先级由高到低一次为括号运算、乘除运算、加减运算。
(3)支持键盘输入和触摸屏输入;(4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。
程序任务开始后,等待键盘或触摸屏的输入。
输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。
每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD 屏幕上显示相应字符。
当输入'del'键时,屏幕显示去掉最后一位字符。
当输入'='号后,得出计算结果,结果显示于表达式的下一行。
若是除零错误,则结果显示为“/0ERROR!”。
若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!!”。
若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。
当输入'clear'键时,情况显示区域。
当输入'read'键时,从指定目录文本文件中读取表达式并计算。
将表达式内容和计算结果显示在LCD上。
三、程序算法实现1、计算算法首先将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量cal[number]中,表达为中缀表达式。
用void str2repol()函数,将输入字符串cal[number]转换成逆波兰表达式并存于全局数组char repol[maxs]中。
str2repol()函数中缀表达式转成逆波兰后缀表达式算法如下:(1)首先构造一个运算符栈stack[maxs],此运算符在栈内遵循越往栈顶优先级越高的原则。
基于Cortex-M3的嵌入式PLC设计

遮盐威 墨日
梯 形图命令执 行模式时 ,处 理器 的主要 工作则是从 F L A S H 中读取梯形 图 的命令代 码 ,并根 据不 同的操 作码和操作 数
完成相 应的解 释工作 , 继而实现 了梯形 图命令的执行嘲 。
2 梯 形图程序下载
三 菱P L C的编程 口通 讯协议 由四个普 通命 令 、四个 扩 展命令 以及五个标 示构成 。各命 令与相应 的命令代码 一一 对应 。进行编程 口通讯时 ,命令 和数据 以9 6 0 0 的波特率 以 A S C I I 码 的形式进行传输。 上位机软 件和嵌 入式P L C 进行下 载通信 时会 以固定 的 通信 帧格式进行传输 ,其帧格式如下所示 :
根据传统P L C 的工作原理 ,该嵌入 式P L C 的工作工程是
一
)
个 不断 扫描 的过程 。每一次扫描 过程都包 括输 入采样 、
程序 执行和输 出刷新3 个 阶段 。嵌 入式P L C 工作于梯形 图程
3 . 2 软元件在 内存 单元中的分 配和寻址
在P L C 的运行 过程 中会 涉及 到X、Y、S 、T 、M、C 等各
始 命 令 首地址 位数 数据 终 和校验
S UM S T X C MD G ROU P A DDR E S S B YT E S DA T A E T X
梯形 图程 序下载时 由固定 的开 头通讯块 和写程序到嵌 入式P L C 两块完成 。在 固定 的开头通讯块 ,S T M3 2 会完 成与
码 ;指令 的 的第一 字节 ( B y t e 1)则 是操 作数 。元件 代码 和 操作 数 即决 定 了具 体对 哪个 软 元件 进 行操 作 。元 件代
个 软元件 的操作 ,该嵌入 式P L C 在设计过 程 中将 这些 软元
嵌入式实验cortex-M3计算器

《嵌入式系统及应用》实验报告(2014— 2015学年第一学期)题目:简易科学计算器班级:电子科学与技术(1)班姓名:学号:指导教师:2015 年 1 月10 日目录1.设计内容 (3)2重点要解决的问题及创新性; (3)3.概要设计3.1中断控制部分 (3)3.2显示函数编写 (4)3.3运算符函数编写 (6)4.详细设计 (9)4.1驱动程序头文件 (9)4.2显示界面编写调试 (10)4.3控件程序 (21)4.3.1数字按钮对应函数 (21)4.3.2运算符号对应函数 (26)5.实验、调试及测试结果与分析。
………………………………………31.6.用户使用说明 (31)7.结论 (32)8.参考文献 (32)一、设计内容:本次设计主要以LM3S9B92开发板作为主要的开发平台,首先在这里对开发板的结构,和最重要的Cortex-M3微处理器,以及搭载的触摸屏液晶显示模块。
设计一个简易计算器,能够实现以触摸界面的形式给出简易计算器的操作界面,能实现简单的加、减、乘、除操作,并且将运算步骤都呈现在显示屏上。
二、重点要解决的问题及创新性:重点:1.设计计算器界面,将计算机控件布局到开发板上。
2.添加计算器控件的相应代码,使得计算器能够实现加减乘除基本功能。
3.创新性:1.界面的创新2.计算器实现的运算过程显示在结果输入框内,使得能够记录运算过程。
三、概要设计(说明设计系统的组成及主要实现方法,并采用流程图等图形方式形象化说明);软件设计基本包括了以下三个部分的内容:中断控制部分、显示部分和运算部分3.1中断控制部分中断控制功能的实现是在驱动程序当中,因为是与硬件功能连接十分紧密的一个能实现。
但在实际应用中又与操作紧密相关,是软件设计中十分重要的部分。
其根本编程原理是由Cortex-M3提供了一套中断控制器所提供的API。
中断控制器API 提供了一组函数,用来处理嵌套向量中断控制器(NVIC)。
这些函数执行以下功能:使能和禁止中断、注册中断处理程序和设置中断的优先级。
一种基于Cortex-M3核心的密集架嵌入式控制器设计

:
‘
‘
s
▲
一
。 ‘
’
图2 . 3 H 桥 电路
询状态命令, 并返回本列信息给固定列 ; 等待
H 桥式 电路 由四个M O S 管组 成。当导通对角线上 的一对M O S 固定列下发的控制命令, 接收到命令动作 , 驱动 电机 运动: 调试
管时, 电机才能 正常动转, 当Q 4 和Q 5 导通时, 电机正 向旋转, 当 L E D 灯灭 。 本系统投入到实际的运用中, 达到了预期的效果。 Q 3 和Q 6 导通 时, 电机反 向旋转。 因此 , 通过M O S 管导通与断 开控 4 结束语 制 电机 的转 向, 通过 脉宽的大小调节 电机的旋转速 度, 达到对 本系统设计的控制板可靠性 高, 还扩展出了C A N 模块 , 提高 了串口通信稳 定性 , 此控制板扩展 出了S T M 3 2 的各 个模块 , 不仅 2 . 4信息 掉 电保存设 计 仅局限于智能移动 货架 , 还可以应 用到其它控制领域 , 有 工业 系统在运行过程中可能会遇到突然断电的情况, 因此 设计 控制 中常用的隔离模块 , 以太网控制模 块, 串口通信模块等 , 使 了掉电保护功能 , 采用A T 2 4 C 0 2 扩展T2 K 的存储空间。 控制器 内 用者 也可 以根 据 自己的需要 去配制 , 也可以移植U C O S I I 系 统来 部集 成了I I C 模块, 采用I I C 与A T 2 4 C 0 2 通信, 相应电路如图2 . 4 所 控制各个模 块的进程 , 作为更深层次 的开发和运 用, 可 以使本
( 上接第1 4 2 页)
2 . 3电机驱动模块
块, 控制 器与触摸 屏通信 的串口模块 , 固定列和移动列之 间通
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《嵌入式系统及应用》实验报告(2014— 2015学年第一学期)题目:简易科学计算器班级:电子科学与技术(1)班姓名:学号:指导教师:2015 年 1 月10 日目录1.设计内容 (3)2重点要解决的问题及创新性; (3)3.概要设计3.1中断控制部分 (3)3.2显示函数编写 (4)3.3运算符函数编写 (6)4.详细设计 (9)4.1驱动程序头文件 (9)4.2显示界面编写调试 (10)4.3控件程序 (21)4.3.1数字按钮对应函数 (21)4.3.2运算符号对应函数 (26)5.实验、调试及测试结果与分析。
………………………………………31.6.用户使用说明 (31)7.结论 (32)8.参考文献 (32)一、设计内容:本次设计主要以LM3S9B92开发板作为主要的开发平台,首先在这里对开发板的结构,和最重要的Cortex-M3微处理器,以及搭载的触摸屏液晶显示模块。
设计一个简易计算器,能够实现以触摸界面的形式给出简易计算器的操作界面,能实现简单的加、减、乘、除操作,并且将运算步骤都呈现在显示屏上。
二、重点要解决的问题及创新性:重点:1.设计计算器界面,将计算机控件布局到开发板上。
2.添加计算器控件的相应代码,使得计算器能够实现加减乘除基本功能。
3.创新性:1.界面的创新2.计算器实现的运算过程显示在结果输入框内,使得能够记录运算过程。
三、概要设计(说明设计系统的组成及主要实现方法,并采用流程图等图形方式形象化说明);软件设计基本包括了以下三个部分的内容:中断控制部分、显示部分和运算部分3.1中断控制部分中断控制功能的实现是在驱动程序当中,因为是与硬件功能连接十分紧密的一个能实现。
但在实际应用中又与操作紧密相关,是软件设计中十分重要的部分。
其根本编程原理是由Cortex-M3提供了一套中断控制器所提供的API。
中断控制器API 提供了一组函数,用来处理嵌套向量中断控制器(NVIC)。
这些函数执行以下功能:使能和禁止中断、注册中断处理程序和设置中断的优先级。
同时在驱动文件中,重写了一些关于中断控制的函数。
在操作中,对触屏操作时,会产生一个软件中断,然后对所进行操作后,例如触摸屏的触点X,Y值进行锁存。
然后对锁存的数据进行读取,通过LCD显示相关的API函数,将得到的数值进行转化成对应函数操作,或显示,或运算等等。
最后将相关操作的结果,反映到LCD显示屏。
其流程图如图4.1所示。
图4.1中断控制流程图3.2显示函数编写显示功能,显示功能实现流程是如图4.2所示,将按键结果显示在LCD上的。
图3.2 LCD读/写操作流程在具体的实现过程中,本实验平台搭载的触摸屏,在软件上是靠一个WIDGET队列处理系统来接受显示资源,即主界面上的功能按钮,边框和显示区域等。
在声明了类似canvas (…)等画图,画按钮等方法后,在main函数中调用该方法。
并调用函数WidgetAdd(…函数名,函数名…),添加到消息队列中。
最后用一个死循环,循环执调用WidgetMessageQueueProcess()这么一个函数,完成LCD上显示输出所需要的内容。
所以在完成显示输出时,要调用画图的方法,再在主函数中,将画图的方法添加到消息队列,然后循环输出即可。
而在完成运算功能后的显示输出理论上是一样的,只是改变了内存当中的变量。
调用Canvas(…)函数作为一个变量显示区域,将完成计算后的结果从内存中取出,利用sprintf(变量名,显示格式,变量名)这样一个函数将输出结果存入对应Canvas的变量名中。
调用CanvasTextSet(…) 改变Canvas(…)内变量的值,重新放入消息队列WidgetPaint((tWidget *)&g_Result),完成一个显示输出的功能。
另一方面,显示效果的更改,是利用更新好的Canvas进行对前一次的输出结果的覆盖。
为了保证不会有显示前次效果的问题,则对显示的长度进行有一定位数的预留,每次显示相同长度。
如果数字长度不足,则同样预留了长度,这样可以对前次的显示结果完成一个覆盖的效果,避免显示错误。
同时对输入的数字有位数长度的限定,即当位数达到一定时,则只显示当前输入的数字,而不能继续输入。
方便确定运算结果的位数,也可以使得最后输出结果时不会因长度不足而又被覆盖不完全的错误。
总结,显示输出软件编写上是在不断调用消息队列WidgetMessageQueueProcess()时候,更新消息中的内容,并且重写覆盖已经显示的内容,达到完成显示所需数字和运算结果这样的效果。
3.3运算符函数编写除了显示部分,本次设计另一大块的设计部分是函数运算模块的设计。
作为一个计算器,除了显示输入数字外,更重要的是得到所需要的计算结果。
所以,在完成数字显示结果的同时,应该考虑的是将输入数字,按照对应的按钮进行计算,输出结果。
函数运算编写包含几个部分:第一,在能显示输入的数字以后,我们要将不断输入的数字变成对应的数进行输出。
图3.3 数字组合成数显示流程图如图所示,输入数字转化成数,关键是要记录两个部分,一个是存储当前输入数字,和已经输出的数。
将已经输出的数乘10和当前数字相加则成为一个新的数输出。
有小数点的数一样,在按下小数点后,改变一个标记位,同时声明一个新的计数器,每输入一个数字后乘以10的负计数次方,再加上已输出的数后,成为一个新的数。
一个数输入完毕后,将数放入一个数组中,以便在之后运算过程中读取输入结果。
对数的显示输出完成后,是按下相应运算符后进行对应的运算。
基本运算输出流程图如图3.4图3.4根据运算符号输出结果流程图完成运算符结果运算和显示的有两个要点,其一要在运算函数中传入已输入数字,和已存在的之前的预算结果,这两个数利用两个变量进行保存。
为了方便对两个变量进行操作,所以两个变量定义成全局变量来保存两者的值,方便在整个循环过程中调用,能够更简单和直观的对变量进行读取,存放运算结果。
第二,要定义符号的标志位,再按下按钮后,利用switch –case-default语句来根据标志位对运算符号进行判断。
根据对应的运算符号,对之前的两组数字进行预算。
即根据符号,将传进来的前一次预算结果和当前输入的数进行对应的加减乘除预算,运算完毕后将运算结果输出显示在显示屏上,显示方法相同,不再详述。
最后,在实际操作过程中,在一次运算计算完毕后,或者对当前输入有错误,将要重新输入的时候,要有一个对已保存的数据进行擦出,或者当前输入的数字进行取消的操作。
结束一次运算,根本上就是将运算结果置零,显示在屏幕上,并且之前内存中保存的运算结果和输入数置零,计数器清零。
这样回收已经占用的数组空间,可以节约内存,提升一定的运算效率。
而清除一次输入结果,只要将当前输入的数清零,计数器自减,显示结果置零,输出即可。
四、详细设计(各模块的设计分析、程序流程图等内容)4.1驱动程序头文件我们在编写程序的时候,要写入相应的头文件,并且加载相应的驱动程序文件,然后才能调用相关的驱动程序中初始化函数,和中断控制函数等,实现相关功能。
图4.1 相关头文件加载4.2显示界面编写调试显示界面部分,分为三大块,即计算器边框,算数结果输出区域,和计算器按钮三大部分。
每个部分使用了对应的API函数。
4.2.1算数结果输出区域调用了Canvas 函数,是一个算数结果输出区域设置区域的实现功能函数。
Canvas(//Name //pParent //pNext//pChildg_Result, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 0, 0,//lWidth //lHeight //ulStyle320, 50, CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT |CANVAS_STYLE_TEXT_RIGHT | CANVAS_STYLE_TEXT_OPAQUE,//填充颜色//外边框颜色//文字颜色//字体ClrBlack, ClrWhite, ClrWhite,&g_sFontCm22b,//pcText //pucImage//pfnOnPaint"0", 0, 0 );4.2.2计算机边框使用Container()函数Container(//Name //pParent //pNext//pChildg_NumberContainer, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 0, 50,//lWidth //lHeight //ulStyle320, 189, CTR_STYLE_OUTLINE,//填充颜色//外边框颜色//文字颜色//字体0, ClrWhite, 0, 0,//pcText);4.2.3计算器按键使用RectangularButton函数,共设置“0-9”,“+”,“—”,“*”,“/”,“=”,“c”,“CE”,“.”这17个按键。
相应代码:RectangularButton(//Name //pParent //pNext//pChildg_Num1Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 50, 55,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "1", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num2Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 105, 55,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "2", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num3Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 160, 55,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "3", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num4Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 50, 101,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "4", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num5Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 105,101,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "5", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num6Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 160,101,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "6", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num7Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 50, 146,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "7", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num8Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 105,146,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "8", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num9Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 160,146,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "9", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_Num0Button, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 50, 193,//lWidth //lHeight //ulStyle100, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrGreen, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "0", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnNumber);RectangularButton(//Name //pParent //pNext//pChildg_PointButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 160,193,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrBlue, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, ".", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnPoint);RectangularButton(//Name //pParent //pNext//pChildg_AddButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 215, 55,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT |PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrBlue, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "+", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnCalculate);RectangularButton(//Name //pParent //pNext//pChildg_SubtractButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 215, 101,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrBlue, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "-", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnCalculate);RectangularButton(//Name //pParent //pNext//pChildg_MultiplyButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 215, 146,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrBlue, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "*", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnCalculate);RectangularButton(//Name //pParent //pNext//pChildg_DivideButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 215, 193,//lWidth //lHeight //ulStyle50, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrBlue, ClrRed, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "/", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnCalculate);RectangularButton(//Name //pParent //pNext//pChildg_CButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 275, 55,//lWidth //lHeight //ulStyle40, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrRed, ClrYellow, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "C", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnReset);RectangularButton(//Name //pParent //pNext//pChildg_CEButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 275, 101,//lWidth //lHeight //ulStyle40, 41, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrRed, ClrYellow, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "CE", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnReset);RectangularButton(//Name //pParent //pNext//pChildg_EqualButton, 0, 0, 0,//pDisplay //lX //lY&g_sKitronix320x240x16_SSD2119, 275, 146,//lWidth //lHeight //ulStyle40, 87, PB_STYLE_TEXT | PB_STYLE_OUTLINE | PB_STYLE_FILL,//填充颜色//按键填充颜色//外框颜色//文字颜色ClrRed, ClrYellow, ClrWhite,ClrWhite,//字体//pcText //pucImage//pucPressImage&g_sFontCm22b, "=", 0, 0,//usAutoRepeatDelay//usAutoRepeatRate //pfnOnClick0, 0, OnCalculate1);4.3控件程序4.3.1数字按钮对应函数void OnNumber(tWidget *pWidget){//第一次输入,和运算完毕后对屏幕进行输出的初始化if(isCalOff == true){WidgetRemove((tWidget *)&g_Result);strcpy(ucResult , " ");isCalOff = false;WidgetPaint(WIDGET_ROOT);}if (pWidget == (tWidget *) (&g_Num1Button)){slResult = 1;strcpy(ucNumber,"1");count++;}if (pWidget == (tWidget *) (&g_Num2Button)){slResult=2;strcpy(ucNumber,"2");count++;}if (pWidget == (tWidget *) (&g_Num3Button)){slResult=3;strcpy(ucNumber,"3");count++;}if (pWidget == (tWidget *) (&g_Num4Button)) {slResult=4;strcpy(ucNumber,"4");count++;}if (pWidget == (tWidget *) (&g_Num5Button)) {slResult=5;strcpy(ucNumber,"5");count++;}if (pWidget == (tWidget *) (&g_Num6Button)) {slResult=6;strcpy(ucNumber,"6");count++;}if (pWidget == (tWidget *) (&g_Num7Button)) {slResult=7;strcpy(ucNumber,"7");count++;}if (pWidget == (tWidget *) (&g_Num8Button)) {slResult=8;strcpy(ucNumber,"8");count++;}if (pWidget == (tWidget *) (&g_Num9Button)) {slResult=9;strcpy(ucNumber,"9");count++;}if (pWidget == (tWidget *) (&g_Num0Button)){slResult=0;strcpy(ucNumber,"0");count++;}if(count < 11 && isPointCheck == false){outputNumber = outputNumber *10 + slResult;if(outputNumber == 0){strcpy(ucResult," 0") ;count = 0;}else{strcat(ucResult,ucNumber);}}else if(pointCount < 7 && isPointCheck == true){pointCount++;outputNumber = outputNumber+(slResult*(pow(10,-pointCount)));strcat(ucResult,ucNumber);}len++;CanvasTextSet(&g_Result,ucResult);WidgetPaint((tWidget *)&g_Result);}//小数点按钮void OnPoint(tWidget *pWidget){//Put your codes hereif(isPointCheck == false){isCalOff = false;strcpy(ucNumber,".");}isPointCheck = true;strcat(ucResult,ucNumber);len++;}void OnReset(tWidget *pWidget)//两种重置按钮{if (pWidget == (tWidget *) (&g_CButton)){strcpy(ucNumber,"0");WidgetRemove((tWidget *)&g_Result);strcpy(ucResult," 0");CanvasTextSet(&g_Result,ucResult);WidgetPaint((tWidget *)&g_Result);}if (pWidget == (tWidget *) (&g_CEButton)){int i=len-1;while((ucResult[i]>='0') && (ucResult[i]<='9')){ucResult[i]=NULL;i--;}len=i+1;CanvasTextSet(&g_Result,ucResult);WidgetPaint((tWidget *)&g_Result);}isPointCheck = false;pointCount = 0;outputNumber = 0;count = 0;}4.3.2运算符号对应函数void OnCalculate(tWidget *pWidget){if (pWidget == (tWidget *) (&g_AddButton)){operators = 1;strcat(ucResult,"+");}if (pWidget == (tWidget *) (&g_SubtractButton)) {operators = 2;strcat(ucResult,"-");}if (pWidget == (tWidget *) (&g_MultiplyButton)) {operators = 3;strcat(ucResult,"*");}if (pWidget == (tWidget *) (&g_DivideButton)){operators = 4;strcat(ucResult,"/");}len++;count = 0;isPointCheck = false;pointCount = 0;outputNumber = 0;CanvasTextSet(&g_Result,ucResult);WidgetPaint((tWidget *)&g_Result);}void OnCalculate1(tWidget *pWidget){int a[20],b[20],count1=0,count2=0,num,i,j;b[0]=0;for(i=0;i<len;i++){if ((ucResult[i]>='0')&&(ucResult[i]<='9')) num=num*10+ucResult[i]-'0';else{int f,ff;switch (ucResult[i]){case '+':f=1;ff=1;break;case '-':f=2;ff=1;break;case '*':f=3;ff=2;break;case '/':f=4;ff=2;break;}if (ff>b[count2]){a[count1++]=num;b[count2++]=ff;num=0;}else{switch (f){case 1:a[count1]=a[count1]+num;b[count2]=f;break;case 2:a[count1]=a[count1]-num;b[count2]=f;break;case 3:a[count1]=a[count1]*num;b[count2]=f;break;case 4:a[count1]=a[count1]/num;b[count2]=f;break;}num=0;}}}a[count1++]=num;while (count2>0){switch (b[count2]){case 1:a[count1-1]=a[count1-1]+a[count2];break;case 2:a[count1-1]=a[count1-1]-a[count2];break;case 3:a[count1-1]=a[count1-1]*a[count1];break;case 4:a[count1-1]=a[count1-1]/a[count1];break;}count1--;count2--;}WidgetRemove((tWidget *)&g_Result);strcpy(ucResult , " ");for(i=0;a[count1]!=0;i++){s[i]=a[count1]%10;a[count1]=(a[count1]-s[i])/10;}for(j=0;j<=i;j++)ucResult[j]=s[i-j];CanvasTextSet(&g_Result,ucResult);WidgetPaint((tWidget *)&g_Result);}int main (void){tContext sContext;SysCtlLDOSet(SYSCTL_LDO_2_75V);SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ | SYSCTL_SYSDIV_4);PinoutSet();Kitronix320x240x16_SSD2119Init();GrContextInit(&sContext, &g_sKitronix320x240x16_SSD2119);TouchScreenInit();TouchScreenCallbackSet(WidgetPointerMessage);//widget消息队列内容添加WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Result);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num1Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num2Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num3Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num4Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num5Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num6Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num7Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num8Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num9Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_Num0Button);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_PointButton);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_AddButton);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_SubtractButton);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_MultiplyButton);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_EqualButton);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_CEButton);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_CButton);WidgetAdd((tWidget *)&g_NumberContainer, (tWidget *)&g_DivideButton);WidgetAdd(WIDGET_ROOT, (tWidget *)&g_NumberContainer);WidgetPaint(WIDGET_ROOT);//循环输出显示在LCD上while(1)WidgetMessageQueueProcess();}五、实验、调试及测试结果与分析。