简介
使用 AT89C52 制作的贪吃蛇游戏。练习在 8051 上使用实时多任务系统。一开始的构想是利用 LCD12864 来作为显示屏,于是选择了自己比较熟悉的 ST7920 作为控制器的 LCD12864,毕竟之前也使用同样的显示屏用 Arduino 做过尔罗斯方块,虽然图像显示处理缓慢,但是应该还是可以使用的,测试之后的结果大失所望,由于过于过于缓慢的图像显示导致屏幕闪烁现象过于严重,并且导致任务堵塞,程序堵死,于是放弃。改而使用 4 块 8*8 LED 矩阵来做显示屏,由于要自己撰写显示函数和游戏函数,程序量徒然增加,还出现了单片机内存不足的现象,经过调试,最终结果还算不错,以下基本功能都已经实现:
- 蛇和食物的显示。
- 蛇的移动,包括碰撞边界和自身之后的死亡判定和碰撞食物的判定。
- 蛇在吃掉食物之后的增长效果。
由于 8051 单片机本身内存与机能的限制,还有很多预想功能未能实现:
- 食物位置不是随机的,永远固定。
- 食物数量固定,就是开始游戏之后的那几个食物,不会再增加了,吃完就获胜。
- 蛇的最大长度是固定的。
- 蛇的初试长度与位置都不是随机的,永远固定。
文件说明:
- lcd12864 文件夹中是使用 lcd12864 制作的初版游戏。仅实现了蛇的移动和边界碰撞判定。闪烁现象严重
- LCD_array 文件夹中是最终成品。使用 4 个 8*8 的 LED 点阵来作为显示,4个按钮控制上下左右,还有一个 Reset 键用来重启单片机(也就是重启游戏)。此文件夹中包括以下文件
-
circuit 文件夹:Proteus 仿真电路图,如下
-
program 文件夹:烧录入单片机中的程序文档,包括
- Main.h, Sch51.h, Sch51.c, 2_01_12g.h, 2_01_12g.c: 实时多任务系统所需的文件,由《PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS》一书提供。
- main.c: 主程序。main 函数所在。
- ledarray.h, ledarray.c: LED 点阵显示函数:
- LED 点阵初始化函数:
led_init()
- 绘制第一块与第二块 LED 点阵的函数:
draw1()
- 绘制第三块与第四块 LED 点阵的函数:
draw2()
- 清空显示的函数:
first_page()
- 向某个坐标写入一个点的函数(左上角为原点,x轴正方向向右延伸,y轴正方向向下延伸,下同):
set_dot()
- 读取某个坐标是否有点存在的函数:
read_dot()
- LED 点阵初始化函数:
- game.h, game.c: 游戏控制及显示函数:
- 根据蛇和食物的控制矩阵,向屏幕内绘制点的函数:
draw()
- 控制蛇移动的函数:
move()
- 检查按键的函数:
button()
- 根据蛇和食物的控制矩阵,向屏幕内绘制点的函数:
最终效果
效果可以到观看以下视频: