设计报告点阵贪吃蛇_第1页
设计报告点阵贪吃蛇_第2页
设计报告点阵贪吃蛇_第3页
设计报告点阵贪吃蛇_第4页
设计报告点阵贪吃蛇_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

设计报告_16x16点阵贪吃蛇20XX-目录16x16点阵贪吃蛇设计报告_16x16点阵贪吃蛇一、摘要................................................................2二、作品介绍............................................................21.作品简介..........................................................22.(附)硬件连接......................................................3三、设计思路............................................................4设计报告_16x16点阵贪吃蛇1.硬件选择..........................................................42.软件设计..........................................................5四、代码编写............................................................61.管脚配置、数据传输与MAX7219初始化.................................62.图案显示..........................................................9设计报告_16x16点阵贪吃蛇3.点亮,熄灭单个LED................................................114.蛇的移动.........................................................135.食物的生成.......................................................146.定时器中断内容简述...............................................157.按键中断内容简述.................................................15设计报告_16x16点阵贪吃蛇8.其他细节设计.....................................................15五、效果测试...........................................................16六、设计总结...........................................................18七、参考文献...........................................................1916x16点阵贪吃蛇116x16点阵贪吃蛇【摘要】该设计作品通过STM32F103单片机进行控制、MAX7219芯片驱动。由STM32平台进行与游戏贪吃蛇相关的数据计算,并通过SPI将数据传输给MAX7219串行输入/输出共阴极显示驱动器,由其控制16x16点阵LED屏幕的显示,从而实现游戏贪吃蛇的效果【关键词】STM32F103,MAX7219,SPI通信,贪吃蛇16x16点阵贪吃蛇作品介绍1.作品简介该作品由MAX7219串行输入/输出共阴极显示驱动器控制256个LED实现游戏贪吃蛇的效果,该芯片通过SPI方式与单片机STM32F103进行通信,由STM32平台进行与游戏相关的计算,并将结果通过LED阵列显示出来(具体的作品效果展示参见"五、效果测试"章节,请跳转至第页)16x16点阵贪吃蛇2.(附)硬件连接16x16点阵贪吃蛇(MAX7219与STM32连接方式)16x16点阵贪吃蛇(LED点阵屏与MAX7219连接方式)16x16点阵贪吃蛇设计思路1.硬件选择起初我们决定选择制作游戏贪吃蛇时,最开始的方案是通过一个三-八译码器和一个移位寄存器实现对8x8的LED点阵的控制(思路来源于开发板上的数码管)。通过译码器以及移位寄存器,可以实现单独控制这个8x8阵列中的任意一个LED,从而可以在此基础上编写代码,实现各式各样的效果之后经过与老师的讨论,我了解到了MAX7219这款芯片,它专门用于控制类似于数码管以及8x8的LED点阵这样的模块,能够代替上述译码器和移位寄存器的功能通过单片机向MAX7219的各个寄存器中传入数据,就能够实现对一个8x8的LED点阵的控制很显然,这种方案不仅比译码器+移位寄存器这种古早方案要先进的多,而且由于这款芯片的专用型更高、功能封装的更好,使得它操作起来十分方便,通过SPI便能进行通信,大大降低了软件编写的难度16x16点阵贪吃蛇因此,STM32+MAX7219控制LED点阵实现贪吃蛇被定为了我们的最终方案考虑到MAX7219芯片同时还提供了DOUT引脚,方便对芯片进行级联以实现更丰富的功能,我们后来决定将原计划的8x8点阵贪吃蛇改为了16x16点阵贪吃蛇。通过将前一块芯片的DOUT引脚与后一块芯片的DIN引脚相连,并使所有芯片的CS、CLK、VCC、GND引脚相连,就能够实现芯片的级联效果16x16点阵贪吃蛇(MAX7219及LED点阵)2.软件设计软件上,我总体上遵循从底层开始向上一层一层编写的方式,这种方式不仅能够方便我在需要时随时调用上一层编写的函数,而且也使得代码结构十分清晰,后期找bug十分方便具体思路大致是从STM32的管脚配置、MAX7219与STM32的数据传输这类较为底层的代码开始写起,编写各类初始化函数等16x16点阵贪吃蛇之后开始编写下一层:通过向MAX7219的不同寄存器地址传输相应的数据,以实现在LED阵列中显示各种各样的图案,将这些繁杂的代码集成在一个个函数中,方便以后随时调用最后就是与游戏贪吃蛇相关的内容了:建立数组用于存储蛇身体上各个点的坐标,并编写与游戏运行相关的代码并且补充定时器中断和按键中断的配置,通过中断控制游戏进程(管脚配置、游戏进程等具体内容参见"四、代码编写"章节,请跳转至第6页)16x16点阵贪吃蛇代码编写1.管脚配置、数据传输与MAX7219初始化用于给MAX7219的DIN、CS、CLK传输信号的管脚PA1、PA3、PA5配置为推挽输出模式、打开时钟并初始化,这部分较为简单,此处直接略过16x16点阵贪吃蛇接下来,根据MAX7219的时序图编写数据传输的函数。MAX7219的时序图如下所示,由图可知CS引脚拉低时数据进入,当CS引脚被拉高时数据被锁存;CLK为时钟引脚,在CLK的上升沿时数据移入内部移位寄存器;DIN则为数据输入引脚由MAX7219数据手册可以得知,在每次向芯片数据寄存器中传入的16位串行数据中,高4位保留、接下来4位为地址位、最后8位为数据位。因此,每次需要向芯片的某个寄存器传入数据时,仅需要通过SPI方式向MAX7219传输一个16位数据即可。另外,由于16x16点阵共使用了四个级联的MAX7219芯片,这四块芯片共用一个CS引脚,因此在CS引脚被拉低后,需要向该模块中传输4个16位数据,之后再拉高CS脚,以更新四块芯片中的数据以此为基础,编写向MAX7219写入数据的函数16x16点阵贪吃蛇1.//

向MAX7219芯片写入数据4.void

MAX7219_write_16bit(uint8_t

add,

uint8_t

dat)7.for(i=0;

i<8;

i++)2.//

add:

4位地址位5.{8.{3.//

dat:

8位数据位6.uint8_t

i=09.CLK_016x16点阵贪吃蛇10.if(add&0x80)

DIN_111.else

DIN_012.CLK_113.add

<<=

114.}15.for(i=0;

i<8;

i++)16.{17.CLK_018.if(dat&0x80)

DIN_116x16点阵贪吃蛇19.else

DIN_020.CLK_121.dat

<<=

122.}16x16点阵贪吃蛇23.}(由于每次传输数据时都需要调用四次该函数,为了方便,CS引脚的上下拉并没有写在函数中,需要在每次传输数据的前后写CS_0和CS_1)在此基础上,便能够编写初始化函数了,该函数用于在单片机上电时配置MAX7219的工作模式,并将所有LED熄灭(寄存器地址)1.void

MAX7219_init(void)

//

LED点阵初始化函数16x16点阵贪吃蛇2.{3.//uint8_t

i=04.MAX7219_PinConf()5.MAX7219_clr()6.CS_07.MAX7219_write_16bit(0x09,

0x00);

//

无译码模式8.MAX7219_write_16bit(0x09,

0x00)9.MAX7219_write_16bit(0x09,

0x00)10.MAX7219_write_16bit(0x09,

0x00)16x16点阵贪吃蛇11.CS_112.CS_013.MAX7219_write_16bit(0x0A,

0x01);

//

配置亮度14.MAX7219_write_16bit(0x0A,

0x01)15.MAX7219_write_16bit(0x0A,

0x01)16.MAX7219_write_16bit(0x0A,

0x01)17.CS_118.CS_019.MAX7219_write_16bit(0x0B,

0x07);

//

配置可显示位16x16点阵贪吃蛇20.MAX7219_write_16bit(0x0B,

0x07)23.CS_126.MAX7219_write_16bit(0x0C,

0x01)21.MAX7219_write_16bit(0x0B,

0x07)24.CS_027.MAX7219_write_16bit(0x0C,

0x01)22.MAX7219_write_16bit(0x0B,

0x07)25.MAX7219_write_16bit(0x0C,

0x01);

//

正常模式(开启)28.MAX7219_write_16bit(0x0C,

0x01)16x16点阵贪吃蛇29.CS_130.CS_031.MAX7219_write_16bit(0x0F,

0x00);

//

测试模式(关闭)32.MAX7219_write_16bit(0x0F,

0x00)33.MAX7219_write_16bit(0x0F,

0x00)34.MAX7219_write_16bit(0x0F,

0x00)35.CS_136.}(以上工作模式的配置方式均按照数据手册进行,这里不再详细列出)16x16点阵贪吃蛇2.图案显示四个芯片级联,每次需要传输4个16位数据,之后锁存到各自芯片中,以实现数据的写入。可以看到,由于每个芯片接受到的16位数据只能向一个寄存器中传入信息,并且不能指定向某个芯片中单独传入16位数据(虽然可以将地址位全部置0以跳过个别芯片,实现对单独一个芯片的操作,但这样显然效率较低),因此最终决定每次都向4个芯片的同一个寄存器传输信息,像这样进行8轮,就能够更改所有寄存器中原有的数据,实现屏幕图案的刷新这里直接采用向函数传入数组的方式,数组中的每个元素都是要传入MAX7219寄存器的数据,按照特定的顺序写入数据,就能将数组的每个元素跟一共32个寄存器一一对应起来1.void

Display_Figure(uint8_t

*figure)

//

显示图形

参数figure:8位1*32数组16x16点阵贪吃蛇2.{3.uint8_t

i

=

04.for(i=0;

i<8;

i++)5.{6.CS_07.MAX7219_write_16bit(8-i,

figure[24+i])8.MAX7219_write_16bit(8-i,

figure[16+i])9.MAX7219_write_16bit(8-i,

figure[8+i])10.MAX7219_write_16bit(8-i,

figure[0+i])16x16点阵贪吃蛇11.CS_112.}13.}向函数中传入的figure数组的形式大致如下1.uint8_t

startMenu[32]

=

{2.0x00,

0x00,

0x2E,

0x2A,

0x2E,

0x22,

0x62,

0x00,3.0x00,

0x00,

0x57,

0x55,

0x77,

0x25,

0x25,

0x00,4.0x00,

0x00,

0x80,

0x80,

0x00,

0xB0,

0xB0,

0x00,5.0x00,

0x00,

0x01,

0x01,

0x00,

0x0D,

0x0D,

0x00,16x16点阵贪吃蛇6.};

//

起始菜单3.点亮,熄灭单个LED关于贪吃蛇的游戏进程设计,我的方案是将每个LED用XY坐标定位,由于游戏中的蛇一直都在按照上下左右的方向移动,因此这种定位方式能够很方便后期进行游戏进程的编写。在这部分,我编写了一个函数,用于通过某个LED在点阵中的XY坐标来实现对该LED的点亮与熄灭1.uint8_t

data_in_resister_9_1[32]

=

{2.0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,3.0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,4.0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,16x16点阵贪吃蛇5.0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,6.};

//

用于存储将要传入MAX7219寄存器中的数据(切换图形后记得清空!)1.void

Display_XY(uint8_t

x,

uint8_t

y)

//

点亮点阵中的一个LED2.{3.if(x<=0

||

x>16

||

y<=0

||

y>16)

return4.if(x<=8

&&

y<=8)5.{6.data_in_resister_9_1[y-1]

|=

1<<(x-1)7.CS_016x16点阵贪吃蛇8.MAX7219_write_16bit(0x00,

0x00)9.MAX7219_write_16bit(0x00,

0x00)10.MAX7219_write_16bit(0x00,

0x00)11.MAX7219_write

温馨提示

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

评论

0/150

提交评论