msp430F149实验报告.doc_第1页
msp430F149实验报告.doc_第2页
msp430F149实验报告.doc_第3页
msp430F149实验报告.doc_第4页
msp430F149实验报告.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

0 微控制器应用及系统设计 课程设计报告 姓姓 名名 XXX学学 号号 091020XXXX 学院学院 系系 自动化学院 专专 业业 自动化 标标 题题 基于 MSP430F149 的算术游戏设计 指导老师指导老师吴益飞 南京理工大学 20012 年 4 月 1 目目 录录 1 引言引言 2 2 系统总体设计系统总体设计 2 2 1 系统组成结构和工作原理 2 2 2 系统工作流程 3 3 系统硬件设计系统硬件设计 5 3 1 4 位独立式按键电路设计 5 3 2 七段共阴极 LED 数码管电路设计 6 3 3 1602LCD 电路设计 7 3 4 ADC 转换电路设计 7 3 5 8 位流水灯电路设计 8 4 系统软件设计系统软件设计 8 4 1 ADC 转换实现从题库中随机选题程序设计 8 4 2 LCD 显示程序设计 10 4 3 按键实现确认键值程序设计 13 4 4 七段共阴极 LED 数码管实现显示题号 分数程序设计 13 4 5 8 位流水灯实现状态指示和流水灯效果程序设计 13 4 6 P1 端口中断实现选难度 选答案程序设计 14 4 7 TIMER A 中断实现游戏结束画面程序设计 14 5 调试过程中遇到的问题及解决方法调试过程中遇到的问题及解决方法 14 6 结论与心得体会结论与心得体会 15 7 参考文献参考文献 16 8 代码 2 1 引言引言 从上世纪 80 年代开始 随着 MCU 技术的成熟与大众生活的娱乐化 家庭游戏机开始 风靡全球 市场上最开始出现的是任天堂公司的 8 位游戏机 FC FamilyComputer 随着 MCU 技术更加蓬勃的发展 功能越来越强大的 MCU 投入到游戏机的生产中 到目前为止 功能最强大的游戏机例如 PS3 PlayStation3 已经是采用 Cell 处理器的 256 位游戏机了 此次我们将设计一个迷你游戏机 设计采用 TI 公司的 MSP430F149 超低功耗单片机 面向人群为刚接触算术运算的小学生 其实现的功能为 让玩家依据题目选择选项 如 1 1 A 1 B 2 此时我们选择 B 2 根据不同的对象选择不同的题库 如十以内的加 减法 一百以内的加减法 九九乘法表 一千以内的乘除法等等 此游戏机结合学习 游 戏为一体 让玩家可以在玩游戏的同时巩固最基本的算术运算 由于条件和时间的限制 我们此次只做了一个比较精简的版本 2 系统总体设计系统总体设计 2 1 系统组成结构和工作原理系统组成结构和工作原理 此系统以 MSP430F149 为核心 并结合有键盘 LED LCD ADC 流水灯等外围模 块 其组成架构如下图所示 ADC 模块 实现随机选题 按键模块 实 现选择 LED 模块 显示题号和分 数 流水灯模块 实现状态指示 和流水灯效果 LCD 模块 显示题目内容 MSP430F149 P1 端口中断 Timer A 中断 P6 0 P1 0 P1 3 P4 0 P4 7 P5 5 P6 6 P3 0 P3 2 P4 0 P4 7 P2 0 P2 7 图 2 1 1 系统组成结构 从图中可以看出 整个系统有 2 个输入模块 分别为 ADC 模块和独立式按键模块 ADC 模块将电压转换之后的数据作为 srand 函数的种子从而产生随机数 再通过此随机数 实现从题库中随机选题 只要转动电位器旋钮改变电压值即可产生不同的随机数 按键模 块是实现人机交互的平台 当玩家按下按键时 MSP430 会通过 P1 端口中断判断按下的是 哪个键 并执行相应的程序 另外还有 3 个输出模块 分别为 LED 模块 LCD 模块和流 水灯模块 LED 模块的功能有 2 个 一个功能是提醒玩家正在答第几题 此为静态显示模 式 另外一个功能是在游戏结束时显示玩家的得分 此为动态显示模式 LCD 模块用来显 示一些游戏的信息和题目内容及选项 流水灯模块也有 2 个功能 一个功能是状态指示 作为调试时或游戏时的状态指示 另外一个功能是当玩家答对全部题目时的流水灯效果 实物模块图如下 3 图 2 1 2 实物模块图 图中用红框圈起来的就是用到的模块 本次设计灵活地运用了中断和低功耗模式 为了防止发生中断嵌套 有次序地将各中 断使能置位或复位 为了设计的需要以及体现出 MSP430 作为低功耗单片机的优势 合理 的利用好低功耗模式 2 2 系统工作流程系统工作流程 画流程图之前先定义两个标志 说明如下 u8 flag opt 0 选择标志 0 为选难度 1 为选答案 用于实现难度选择 u8 flag ans 0 答题标志 0 为没答题 1 为已答题 用于实现答题时间限定 总流程图如下 4 ADC 转换实现从题 库中选题 显示游戏相关信息 显示难度选择 低 功耗等待按键 不 按键程序不继续 全部答完 循环低功耗 TA 中断使能 显示题目并等待按 键 等待时间视难 度而定 若答题标 志为 1 则立刻结束 等待 限定时间内答完 循环低功耗 TA 中断使能 答题标记置位 根据键值判断对错 循环低功耗 TA 中断使能 显示文字鼓励约 0 5s 题号加一 开始 是否 否是 错对 图 2 2 1 系统工作流程图 1 5 P1 端口中断 确认键值 选难度模式 根据键值确认 难度系数 选 择标志置位 答题标志置位 结束低功耗 P1IFG 复位 中断结束 Timer A 中断 全对吗 LED 显示分数 流水灯效果 LED 显示分数 LCD 显示移动 的 game over 是否 否是 图 2 2 2 系统工作流程图 2 如图所示 本设计的大体工作流程如此 在此次设计中 题库中共 28 题 出题数为 10 如果在答题过程中答错 则立即结束游戏并计算分数 为了使流程图简洁明了 还有 一些细节比如说 LED 显示题目序号 LED 状态指示灯 计算答对个数等等没有写入其中 这将在下文详细说明 本设计采用了 2 个中断 P1 端口中断实现按键确认 Timer A 中断 实现结束画面的效果 两个中断没有交叉的地方 可以用中断使能允许或禁止完全隔离开 来 避免产生中断的嵌套甚至程序的错乱 3 系统硬件设计系统硬件设计 3 1 4 位独立式按键电路设计位独立式按键电路设计 独立式按键硬件电路如下图所示 6 图 3 1 独立式按键硬件电路 由于本设计只需要 3 个按键 为了节省资源及编程难度 我们采用了 4 位独立式按键 因为按键 3 K19 的硬件特性较差 抖动不稳定的因素 我们只用了 1 2 4 这三个按键 引脚分别为 P1 0 P1 1 P1 3 从上图可以看出 由于上拉电阻的存在 按键在没有按下 时对应的引脚输入的是高电平 1 相反 当按键按下时对应的引脚输入的是低电平 0 3 2 七段共阴极七段共阴极 LED 数码管电路设计数码管电路设计 七段共阴极 LED 数码管电路如下图所示 图 3 2 七段共阴极 LED 数码管电路 由上图可以看出 LED 电路由 2 个共阴极数码管和 2 个透明锁存器 74HC573 组成 74HC573 的引脚共 18 个 由 8 个数据输入端 2 个控制使能端 8 个数据输出端组成 两 个 74HC573 的数据输入端均为 P4 0 P4 7 输出使能端为低电平 有效 其中一个OC 7 74HC573 U3 作为段控锁存器使用 锁存使能端引脚为 P6 6 输出引脚分别连接到共阴 极数码管的 A B C D E F G 和小数点 另外一个 74HC573 U11 作为位控锁存 器使用 锁存使能端引脚为 P5 5 输出引脚分别连接到第一个到第八个共阴极数码管的使 能端 共阴极数码管使能端低电平有效 3 3 1602LCD 电路设计电路设计 1602LCD 电路如下图所示 图 3 3 1602LCD 电路 从上图可以看出 1602LCD 显示芯片共有 16 个引脚 引脚 1 为电源地 引脚 2 为电 源正极 引脚 3 为液晶显示偏压信号 可以通过调节电位器 RV2 来调节 LCD 的显示对比 度 引脚 4 为数据 指令 H L 选择端 引脚 5 为读 写 H L 选择端 引脚 6 为使能端 引脚 7 14 为数据 IO 端 引脚 15 为背光源地 引脚 16 为背光源正极 控制端引脚分别对 应 P3 0 P3 2 数据端引脚分别对应 P4 0 P4 7 背光源正极则对应 P6 3 默认设置即可 通过 MSP430 向其写入指令及数据 就可以使 1602 按照我们的需要来显示相关信息 3 4 ADC 转换电路设计转换电路设计 ADC 转换电路如下图所示 8 图 3 4 ADC 转换电路 从上图可以看出 调节电位器可以产生 0 3 3V 之间的电压 将这个电压接入 MSP430 的 P6 0 引脚 即 12 位 A D 转换器模拟输入通道 0 MSP430 可以将其量化成数字值 12 位 A D 可以转化成 0 4095 之间的数字 3 5 8 位流水灯电路设计位流水灯电路设计 8 位流水灯电路如下图所示 图 3 5 8 位流水灯电路 从上图可以看出 引脚 P2 0 P2 7 连向 8 位流水灯的阴极 当引脚输出低电平时 相 应的 LED 灯就亮 反之输出高电平 则相应的 LED 灯就灭 4 系统软件设计系统软件设计 4 1 ADC 转换实现从题库中随机选题程序设计转换实现从题库中随机选题程序设计 ADC 模块的唯一用处就是提供随机数 实现从题库中随机选题 原来我试过一种方法 就是用系统时间提供 srand 函数的种子 即 srand unsigned time NULL 然而这样的效 果非常差 只是将出题的顺序打乱了 但其实每次出现的题目顺序的一样的 比如说 题 库中的题号是 1 2 3 28 则出题顺序是固定的 3 12 8 后来我想到结合 AD 转换来产生需要的随机数 因为 AD 转换可以产生 12 位的二进制数 转动电位器旋钮就可 以产生 4096 个不同的值 就可以用 AD 转换值提供 srand 函数的种子 srand num adc 这样可以实现随机性很强的随机选题 ADC12 有 2 个转换控制寄存器 分别为 ADC12CTL0 和 ADC12CTL1 此外还需用到 9 转换存储寄存器 ADCMEM0 其中低 12 位及转换结果 寄存器 ADC12CTL0 各位含义如下 表 4 1 1 ADC12CTL0 寄存器 其中 4 15 为在 ENC 0 是才可被修改 寄存器 ADC12CTL1 各位含义如下 4 1 2 ADC12CTL1 寄存器 其中 3 15 为在 ENC 0 是才可被修改 因为只需要一次转换提供的随机数就可以实现从题库中随机选题 所以我们选用单通 道单次转换模式 其状态图如下 10 4 1 3 ADC12CTL1 寄存器 根据上图的提示就可以设置 ADC 寄存器的相应位来实现单通道单次转换 源代码中相应的子函数为 void init adc12 void AD 模块初始化 设置相关引脚和设置寄存器 ADC12CTL0 和 ADC12CTL1 void que order void 根据 AD 转换的 12 位 实现从题库中随机选题 AD 转换 取数字值 产生随机数安排出题顺序 4 2 LCD 显示程序设计显示程序设计 本次设计采用 1602 而非 12864 1602 为 16 2 的字符型 LCD 每个字符由 5 7 点阵来 显示 字符字模的代码为该字符的 ACSII 码 如要显示 A 就可以将 65 41H 写入 1602 更可以写 A 来方便地实现 为了确保读写的正确 在每次读写操作之前都需要进行 忙状态检测 我们可以根据 1602 的功能表向 1602 输入相应的控制信号和数据信号 1602 功能表如 下 指令RSRWD7D6D5D4D3D2D1D0 1清屏0000000001 11 2光标返回000000001 3输入模式00000001I DS 4显示控制0000001DCB 5光标 字符移位000001S CR L 6功能00001DLNF 7置字符发生器地址0001字符发生存贮器地址 8置数据存贮器地址001显示数据存贮器地址 9读忙标志和地址01BF计数器地址 10写数据到指令 7 8 所设地址10要写的数据 11从指令 7 8 所设的地址读数 据 11读出的数据 表 4 2 1602LCD 功能表 指令 1 清显示 光标复位到地址 00H 位置 指令 2 光标复位 光标返回到地址 00H 指令 3 光标和显示模式设置 I D 光标移动方向 高电平右移 低电平左移 S 屏幕上所 有文字是否左移或者右移 高电平表示有效 低电平则无效 指令 4 显示开关控制 D 控制整体显示的开与关 高电平表示开显示 低电平表示关 显示 C 控制光标的开与关 高电平表示有光标 低电平表示无光标 B 控制光标是否闪 烁 高电平闪烁 低电平不闪烁 指令 5 光标或显示移位 S C 高电平时移动显示的文字 低电平时移动光标 R L 高向 左 低向右 指令 6 功能设置命令 DL 高电平时为 4 位总线 低电平时为 8 位总线 N 低电平时为 单行显示 高电 平时双行显示 F 低电平时显示 5x7 的点阵字符 高电平时显示 5x10 的点阵字符 有些 模块是 DL 高电平时为 8 位总线 低电平时为 4 位总线 指令 7 字符发生器 RAM 地址设置 地址 字符地址 8 字符行数 将一个字符分成 5 8 点阵 一次写入一行 8 行就组成一个字符 指令 8 置显示地址 第一行为 00H 0FH 第二行为 40H 4FH 指令 9 读忙信号和光标地址 BF 为忙标志位 高电平表示忙 此时模块不能接收命令或 者数据 如果为低电平表示不忙 指令 10 写数据 指令 11 读数据 其次 我们可以根据 1602 读写操作的时序来依次输入信号 读操作时序为 12 图 4 2 1 1602LCD 读操作时序 由此可以看出应先根据需要确定 RS R W 的电平 再将 E 置高电平 接着输入数据 最 后将 E 置低电平 写操作时序为 图 4 2 2 1602LCD 写操作时序 由此可以看出应先根据需要确定 RS R W 的电平 再输入数据 接着将 E 置高电平 最 后将 E 置低电平 源代码中相应的子函数为 void lcd busy void 等待 LCD 空闲 每次读写前必须进行 BUSY 等待 结合读操作时序 等待 1602LCD 空闲 void init lcd pin void 初始化 LCD 相关引脚 初始化 P4 0 P4 7 和 P3 0 P3 2 来控制 LCD void lcd write command u8 cmd 写指令 结合写操作时序 按照时序和需要进行复位 置位 写指令信息 void lcd write data u8 dat 写显示数据 结合写操作时序 按照时序和需要进行复位 置位 写数据信息 void init lcd void LCD 初始化 结合 1602 芯片的功能表 根据 1602LCD 的功能表写相应指令 void lcd char u8 x u8 y u8 dat 写一个字符 x 为列 y 为行 13 在 1602LCD 的第 x 列 y 行显示一个字符 void lcd nchar u8 x u8 y u8 n u8 ptr 写 n 个字符 用于写数组 大部分时候比 lcd str 好 用 从 1602LCD 的第 x 列 y 行开始显示 n 个字符 void lcd str u8 x u8 y u8 ptr 写字符串 与写 n 个字符不同的是不需要知道字符个数 确定字符串长度 并从 1602LCD 的第 x 列 y 行开始显示 4 3 按键实现确认键值程序设计按键实现确认键值程序设计 本次设计采用 4 位独立式按键 其实只有 3 位 为了更加灵活的扫描按键和解放 CPU 的负担防止程序出错 我们使用了 P1 端口中断处理按键 其好处是避免了 TA 中断 反复的无用操作 为了避免按多个键导致的不理想后果 在程序设计时 等待按键结束后 程序才会继续 关于去抖动问题 我们不仅消去前沿抖动也消去了后沿抖动 而且去抖动 的延迟时间经过调试选取了最恰当的值 由于 P1 端口中断标志无法自动复位 必须人为 手动的在 P1 端口中断服务子程序最后加上中断标志复位语句 在设计时我们采用下降沿 触发中断 即当有键按下时便会触发中断 源代码中相应的子函数为 void delay void 延时 经调试改变延时时间 将去抖效果做到最好 void init key void 初始化键盘 设置引脚和设置 P1 中断 void key check void 确认键值 包括去前沿抖动和去后沿抖动 去抖 根据按键确认 key val 4 4 七段共阴极七段共阴极 LED 数码管实现显示题号 分数程序设计数码管实现显示题号 分数程序设计 与 MSP430 相连的 LED 数码管有 8 个 我们只用其中的 1 2 静态显示题号 和 6 7 8 动态显示分数 需要注意到的是 如果采用动态显示 显示的频率不能过高也 不能过低 否则效果不佳 一般刷新频率为 1ms 5ms 较合适 要灵活运用 LED 数码管 必须先了解锁存器 74HC573 74HC573 的功能表如下 表 4 4 74HC573 功能表 由此可以看出 当 74HC573 输入不同的值时 只需将锁存使能端置高位之后再置低位 就可以实现了 源代码中相应的子函数为 void init led void 初始化 LED 设置引脚 74HC573 锁存 void led display u8 a u8 b LED 显示 a 为显示数字 b 为显示位置 0 7 输入相应数据 用锁存使能更新数据 使第 b 个 LED 显示数字 a 14 4 5 8 位流水灯实现状态指示和流水灯效果程序设计位流水灯实现状态指示和流水灯效果程序设计 此 8 位流水灯在本设计中用到 2 处 一个是作为状态指示灯 另一个是全对时的流水 灯效果 作为状态指示灯时 其表述如下 第一个灯亮 在进行 AD 转换 实现随机选题 第二个灯亮 在 P1 端口中断 第三个灯亮 在等待玩家选择答案 第四个灯亮 游戏结束 其实现原理较简单 只需在相应代码之前将相应位置低 在相应代码之后将相应位置 高就可以了 如 P2OUT AD 转化实现随机选题 P2OUT BIT0 如果 AD 转换 程序有问题导致程序不继续执行 则第一个灯一直亮着 其次是全对时的流水灯效果 依次按照 0 5s 的速度暗和灭 就能够实现流水灯的效果 精确的时间间隔由 Timer A 中断来实现 4 6 P1 端口中断实现选难度 选答案程序设计端口中断实现选难度 选答案程序设计 P1 端口中断流程图请见 2 2 总流程图 由于 P1 端口中断由按键触发 显而易见 P1 端 口包含了按键处理函数 除此之外 还分为 2 个分支 一个是处理难度选择 另一个是处 理答案选择 根据难度选择标志 flag opt 来选择分支 flag opt 初始化时为 0 具体表述为 if flag opt 0 答案选择 else 难度选择 当第一次处理按键时 会转向难度选择代码 由于已经进入了低功耗模式 如果此时 不按按键 程序将一直停在 LCD 显示难度选择界面 难度选择代码中包含 flag opt 1 赋值 语句 保证了难度选择只执行一次 之后的按键处理均转向答案处理 答案处理代码的唯 一语句是 flag ans 1 赋值语句 flag ans 为全局变量 初始为 0 此时肯定在执行 delay 2s 语句来等待玩家按键 flag ans 1 时 立即结束等待 表述如下 if flag ans 1 如果选答案时按键了 则立刻结束延时 i 1 j 1 4 7 Timer A 中断实现游戏结束画面程序设计中断实现游戏结束画面程序设计 TA 初始化时 CCR0 128 即中断频率为 32768Hz 128 256Hz 3 9ms 在 end 函数 中 为了避免中断的嵌套 我们先将 P1 端口中断关闭 再将 TA 中断打开 P1IE 0 CCTL0 CCIE 由于 3 9ms 的中断频率不能满足我们的要求 流水灯需要 0 25s 的频率 LCD 移动显示需要 0 5s 的频率 所以我们采用的方式是计数取模方式 具体表述如下 if ytime 64 0 for i 900 i 0 i for j num j 0 j if flag ans 1 如果选答案时按键了 则立刻结束延时 i 0 j 0 但是调试时的结果确是停在了那边而不是结束延时 这使我百思不得其解 就这么短 了代码 我看了一遍又一遍 直到注意到 j 才豁然开朗 j 0 之后再 j 不就溢出变成 232 1 了吗 难怪会产生死循环 这个问题其实很小很小 但是稍加不注意就会产生很大很 大的麻烦 所以我们在写代码的时候必须结构严谨 逻辑明确 16 6 结论与心得体会结论与心得体会 本设计运行结果请参见文件夹 图片视频 总体来说 我对这此设计是比较满意的 而且在我反复调试并且解决问题写成最终代 码时 我是特别的有成就感 在此一年前 我刚接到科研训练项目时 对这些单片机 设 计 C 语言程序是何等的陌生与茫然 而在 MSP430 的课堂上 我对他们逐渐了解 掌握 并最终在此次设计中灵活的运用他们 我觉得选这门选修课是非常明智的 学到了很多东 西 在此特别感谢吴益飞老师 在开始学 C 程序设计时 我只会愣头就上 直接开始写代码 以为编代码就是程序 设计的全部 而在这门课上 我从实践中学到了在程序编程之前 写好系统结构和工作流 图是多么的重要 他们给我编写代码提供了依据 否则编着编着思绪就混乱了 除此之外 在我设计的过程中 我慢慢学会了如何查找资料 如何看资料 如何按照资料来编写代码 这么一来就化被动为了主动 运用到哪个模块 就看这个模块的资料 从软件硬件两个方 面入手 在本次设计中 我采用了自底向上的设计思想 先将每个模块能够实现的基本功 能做出来 了解各个模块功能的实现 然后将这些基本模块拼装起来并适当的加入代码就 组成了新的整体 7 参考文献参考文献 1 沈建华 杨艳琴 翟骁曙 MSP430 系列 16 位超低功耗单片机原理与应用 M 北京 清华 大学出版社 2004 2 李智奇 白小平 陈晓龙 樊晓红 MSP430 系列超低功耗单片机原理与系统设计 M 西 安 西安电子科技大学出版社 2008 8 代码 头文件 include include 宏定义 define keyin P1IN typedef unsigned int u32 定义全局变量 u8 yled 0 用于确定哪个 LED 数码管亮 u8 yflow 0 用于确定哪个 LED 灯亮 u8 ylcd 0 用于确定 game over 出现的列数 u8 ylcddir 0 用于确定 game over 移动的方向 u8 ytime 0 用于 TA 中断可以实现 LED LCD 流水灯三个功能 u8 key val 0 键值 u8 num que 0 正在答第几题 u8 num right 0 答对几题 u8 flag opt 0 0 为选难度 1 为选答案 用于实现难度选择 u8 flag ans 0 0 为没答题 1 为已答题 用于实现答题时间限定 u32 delay num 200 初始化确定难度的延迟时间 u8 order 10 0 0 0 0 0 0 0 0 0 0 题目在题库中的序号 const u8 led seg 10 0 x3f 0 x06 0 x5b 0 x4f 0 x66 0 x6d 0 x7d 0 x07 0 x7f 0 x6f 对应 0 9 const u8 led dig 8 0 xfe 0 xfd 0 xfb 0 xf7 0 xef 0 xdf 0 xbf 0 x7f 对应第 1 8 位 const u8 score 33 0 0 0 000 0 1 0 010 0 2 0 020 0 3 0 030 0 4 0 040 0 5 0 050 0 6 0 060 0 7 0 070 0 8 0 080 0 9 0 090 1 0 0 100 const u8 ans 28 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 题库中题目对应 的答案 u8 num clr 清空行 u8 num nam multiply or add 游戏名称 u8 num aut BY ylm lj xv 游戏作者 u8 num opt A hard B easy 选择难度 u8 num end game over 游戏结束 唯一不是 15 个字符的字符串 用于左右 移动 18 u8 l1num 28 15 题库 3 4 A 12 B 7 3 4 A 12 B 7 3 7 A 21 B 10 3 7 A 21 B 10 3 9 A 27 B 12 3 9 A 27 B 12 4 7 A 28 B 11 4 7 A 28 B 11 4 9 A 36 B 13 4 9 A 36 B 13 5 7 A 35 B 12 5 7 A 35 B 12 6 7 A 42 B 13 6 7 A 42 B 13 6 9 A 54 B 15 6 9 A 54 B 15 7 9 A 63 B 16 7 9 A 63 B 16 8 9 A 72 B 17 8 9 A 72 B 17 1 4 7 A 11 B 29 1 4 7 A 11 B 29 2 5 8 A 18 B 42 2 5 8 A 18 B 42 3 6 9 A 27 B 57 3 6 9 A 27 B 57 5 6 7 8 A86 B55 5 6 7 8 A86 B55 u8 l2num 10 15 答对题目后对应的鼓励 来自 DOTA 带给游戏小小的乐趣 first blood double kill killing spree dominating mega kill unstoppable wicked sick monster kill god like holy shit 延时 8ms 用于去抖动 试过 15ms 及 10ms 8ms 效果最好 void delay void 19 u32 i for i 6400 i 0 i 根据实际情况选择初始 i 初始化键盘 void init key void P1DIR P1 0 P 1 P 3 输入 P1IES 0 x0b 中断为下降沿 P1IE 0 x0b P1 端口中断使能 确认键值 void key check void delay 延时去抖动 switch keyin case 0 x0a while keyin 0 x0b 等待按键松开 key val 1 break case 0 x09 while keyin 0 x0b key val 2 break case 0 x03 while keyin 0 x0b key val 4 break default while keyin 0 x0b key val 0 break delay 初始化 LED void init led void P4DIR 0 xff 对应位输出 P5DIR BIT5 位控 1 有效 0 锁存 20 P6DIR BIT6 数控 P4OUT 0 x00 seg l dig l 对应位锁存 LED 显示 a 为显示数据 b 为显示位置 void led display u8 a u8 b u8 data led seg a u8 num led dig b P4OUT data seg h seg l 写数据 P4OUT num dig h dig l 写位置 延时 根据实际情况选用入口参数 不同的 num 延时时间不同 用它来实现选择难度 void delay 2s u32 num u32 i u32 j for i 900 i 0 i for j num j 0 j if flag ans 1 如果选答案时按键了 则立刻结束延时 i 1 j 1 实现等待 LCD 空闲的功能 每次读写前必须进行 BUSY 等待 结合读操作时序 void lcd busy void P4DIR 0 x00 将 P4 口切换为输入状态 rs l rw h NOP 读状态 21 en h NOP NOP while P4IN 等待空闲 en l P4DIR 0 xff 将 P4 口切换为输出状态 初始化 LCD 相关引脚 void init lcd pin void P3DIR 0 x07 P4DIR 0 xff 相关引脚输出 P3OUT P4OUT 0 x00 输出为 0 写指令 结合写操作时序 void lcd write command u8 cmd lcd busy 等待空闲 rs l rw l NOP 写指令 P4OUT cmd NOP en h NOP NOP en l 写显示数据 结合写操作时序 void lcd write data u8 dat lcd busy 等待空闲 rs h rw l 22 NOP 写数据 P4OUT dat NOP en h NOP NOP en l LCD 初始化 结合 1602 芯片的功能表 void init lcd void lcd write command 0 x38 8 位 二行 5 7 点阵 lcd write command 0 x08 关显示 lcd write command 0 x01 清屏 lcd write command 0 x06 写数据后 光标右移 屏幕不移动 lcd write command 0 x0c 开显示 无光标 写一个字符 void lcd char u8 x u8 y u8 dat x 为列 y 为行 u8 addr 地址 if y 0 addr 0 x80 x else addr 0 xc0 x lcd write command addr lcd write data dat 写 n 个字符 用于写数组 大部分时候比 lcd str 好用 void lcd nchar u8 x u8 y u8 n u8 ptr u8 i for i 0 i n i lcd char x y ptr i 每次操作之后列加 1 并将指针移到下个存储地址 写字符串 与写 n 个字符不同的是不需要知道字符个数 23 void lcd str u8 x u8 y u8 ptr u8 dat ptr u8 i u8 n 0 while ptr 0 n 计算字符串有效字符的个数 for i 0 i n i lcd char x y dat i 每次操作之后列加 1 并将指针移到下个存储地址 根据键值判断对错 返回结果 u8 judge void if key val ans order num que key val 4 跟题库中的答案对应 或者 作弊 没有秘籍的游戏是不完美的 num right 1 return 1 else return 0 游戏结束 void end void P1IE 0 P1 端口中断关闭 按键无效 CCTL0 CCIE TA 中断使能 TACTL MC0 增计数模式 while 1 LPM3 低功耗 NOP AD 模块初始化 void init adc12 void P6SEL 0 x01 P6 0 用于外围 AD 模块 ADC12CTL0 ADC12ON SHT0 2 打开 ADC 设置采样时间 24 ADC12CTL1 SHP CONSEQ 0 使用采样定时器 单通道单次转换 ADC12CTL0 ENC 使能转换 根据 AD 转换的后五位 以及伪随机数构成真正的随机数 实现从题库中随机选题 void que order void u32 num adc 记录转换值 P2OUT ADC12CTL0 ADC12SC 开始转换 while ADC12IFG 等待转换结束 NOP 缓冲 num adc ADC12MEM0 强制转换取低 16 位 0 65535 种子数较多 随机较强 ADC12CTL0 转换终止 因为取随机数一次就够了 srand num adc 随机数初始化 order 0 rand 28 order 1 rand 28 order 2 rand 28 order 3 rand 28 order 4 rand 28 order 5 rand 28 order 6 rand 28 order 7 rand 28 order 8 rand 28 order 9 rand 28 随机实现从题库中选题 P2OUT BIT0 初始化 TA void init ta void TACTL TASSEL0 TACLR ALCK 清除 TAR CCR0 128 中断频率 32768Hz 128 256Hz 伟大的主函数 虽然略微有点长 void main void WDTCTL WDTPW WDTHOLD 关闭看门狗 init key init led init lcd pin 25 init lcd 各种初始化 init adc12 init ta P2DIR 0 xff P2OUT 0 xff 开启 LED 灯 LED 灯灭 第一个灯亮 在进行 AD 转换 实现随机选题 第二个灯亮 在 P1 端口中断 第三个灯亮 在等待玩家选择答案 第四个灯亮 game over que order led display 0 1 第二位静态显示 0 lcd str 0 0 num nam 第一行显示游戏名称 multiply or add 持续 2s 左右 delay 2s 200 lcd str 0 1 num aut 第二行显示游戏作者 BY ylm lj xv 持续 2s 左右 delay 2s 200 lcd str 0 1 num opt 第二行显示游戏作者 A hard B easy P1IFG 0 中断标志复位 之前按键触发的中断标志置位无效 EINT 开中断 LPM1 低功耗 关 MCLK 用于实现难度选择时 不选难度不继续 lcd str 0 1 num clr 第二行清屏 while

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论