基于51单片机的点阵贪吃蛇
这是基于51单片机的贪吃蛇小游戏,用四个独立按键控制上下左右,用8*8点阵作为显示
程序如下:
#include <reg52.h>
#include <intrins.h>
#include <stdlib.h>#define SNAKE 20unsigned char x[SNAKE]; //存放蛇的X轴坐标
unsigned char y[SNAKE]; //存放蛇的Y轴坐标unsigned char point_x; //存放果实的X轴坐标
unsigned char point_y; //存放果实的Y轴坐标
/*
//点阵模块接口定义
sbit LEDARRAY_LAT = P3^6;//储存寄存器是时钟
sbit LEDARRAY_CLK = P3^5;//移位寄存器时钟输入端
sbit LEDARRAY_DI = P3^4;//串行数据输入端
sbit up = P3^0;
sbit down = P3^1;
sbit left = P3^2;
sbit right = P3^3;
unsigned char num[8][8]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//定义8*8数组作为清屏数据(有点走弯路,也就不改了自己有能力可以自己改)unsigned char move_flag=0; //移动标志, 1 上,2 下,3 左,4 右;
unsigned char snake=3; //蛇身长度
unsigned int flag=1; //是否需要生成果实//SPI通信函数 发送一个直接数据给点阵模块
void Send_Byte( unsigned char dat)
{unsigned char i;//循环次数数变量LEDARRAY_CLK = 0;//拉低移位时钟_nop_(); LEDARRAY_LAT = 0;//拉低储存时钟_nop_();for( i = 0 ; i < 8 ; i++ ) //?循环8次写入一个字节数据{if( dat&0x01 ){LEDARRAY_DI = 1; }else{LEDARRAY_DI = 0;}LEDARRAY_CLK = 1; //上升沿发送数据// _nop_();LEDARRAY_CLK = 0;// _nop_();dat >>= 1; }
}void chang_num() //这个函数用来转码,把8*8数组中的‘0’,‘1’按列写成十六进制
{ int i,j;for(j=0;j<8;j++) {for(i=7;i>=0;i--) { Dis_num[j]*=2; Dis_num[j]+=num[i][j]&0x01; } }
}void Display(unsigned char* Dis_dat,delay) //显示函数
{unsigned char k, temp;unsigned int i;for(i = 0 ; i < delay ; i++){temp = 0x7f;for(k = 0 ; k < 8 ; k++) //一个字节8byte{Send_Byte(temp); //列选择Send_Byte(Dis_dat[k]); //行数据LEDARRAY_LAT =1; //锁存数据_nop_();LEDARRAY_LAT = 0;_nop_();temp = (temp>>1)|0x80;}}
}
void key()
{if(move_flag!=2&&(!up)){move_flag=1;}if(move_flag!=1&&(!down)){move_flag=2;}if(move_flag!=4&&(!left)){move_flag=3;}if(move_flag!=3&&(!right)){move_flag=4;}
}void move() //这个函数是让蛇走起来的,如果蛇现在向上走就把蛇尾所在坐标改为0,把蛇头上方所在坐标改为1.其他同理
{unsigned int i;if(move_flag==1){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1]-1;y[1]=y[1]; }if(move_flag==2){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1]+1;y[1]=y[1]; }if(move_flag==3){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1];y[1]=y[1]-1; }if(move_flag==4){for(i=snake;i>0;i--){x[i+1]=x[i];y[i+1]=y[i];}x[1]=x[1];y[1]=y[1]+1; }}void bulid_point() //生成果实函数
{unsigned int i; if((x[1]==point_x)&&(y[1]==point_y)) //判断吃到果实{ snake++; //蛇的长度加1flag=1; //标志需要生成果实}while(flag) //生成果实{point_x=(unsigned char)(rand()%8);point_y=(unsigned char)(rand()%8);for(i=1;i<snake+1&&flag;i++){if(point_x !=x[i]&&point_y!=y[i])flag=0;}}
} bit eat()
{}
void assign () //画蛇函数,在8*8二维数组中画出蛇,把蛇所在的每个坐标改为1
{unsigned int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){num[i][j]=0;}}for(i=1;i<snake+1;i++){num[x[i]][y[i]]=1;}num[point_x][point_y]=1;
}void main()
{snake=3;//x[0]=4;y[0]=3;x[1]=4;y[1]=4;x[2]=4;y[2]=5;x[3]=4;y[3]=6;while(1){key();move();bulid_point();//eat();assign ();chang_num();Display(Dis_num,200);if(x[1]>7||y[1]>7){while(1){num[x[1]][y[1]]=0;chang_num();Display(Dis_num,200);}}}
}
基于51单片机的点阵贪吃蛇相关推荐
- 基于51单片机3208LED点阵电子钟C程序工程全套资料,毕业设计参考资料
感兴趣者请联系本人微信号:Wsf18729286646.共同探讨!谢谢!
- 单片机设计_贪吃蛇游戏(AT89C51)
51单片机游戏(贪吃蛇) 想要更多项目私wo!!! 一.电路设计 此电路由AT89C51最小系统.74HC595位移缓存器.8*8点阵LED屏和按键组成. 74HC595位移缓存器 74HC595是一 ...
- 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy
** 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy ** 一直很想写一个贪吃蛇的小程序,这两天终于抽空完成了,这里把我的思路分享给大家,仅供参考! 代码如下: 先放段主函数压压惊 v ...
- 基于51单片机点阵汉字显示程序设计
文章目录 基于51单片机点阵汉字显示程序设计 一.实践目的 二.实践依托的实验设备与软件 1.设备 2.软件 二. 系统或装置的设计 1. 硬件原理图设计 2.印制板图绘制 三.程序框架及主要算法流程 ...
- 基于51单片机的16X64点阵仿真
目录 一.项目需求 二.仿真图 三.代码 四.资料清单 资料下载地址:基于51单片机的16X64点阵仿真 一.项目需求 16X64点阵上显示汉子,并且可以左右移动. 二.仿真图 左移 右移 三.代码 ...
- 基于51单片机的简易游戏机
基于51单片机的简易游戏机 目录 基于51单片机的简易游戏机 一.绪论 二.设计方案 三.系统原理框图及模块的作用 四.硬件设计及说明 五.实际的程序流程图,写清楚程序模块的功能 六.系统使用说明 七 ...
- at89c52串口通信c语言程序,AT89C52DEMO 基于51单片机的(89C51/52)C语言源码例程 - 下载 - 搜珍网...
例程与源码/12864带字库测试程序/12864 例程与源码/12864带字库测试程序/12864.hex 例程与源码/12864带字库测试程序/12864.lnp 例程与源码/12864带字库测试程 ...
- 基于51单片机的电子万年历的设计-源代码
电子万年历的设计目录 电子万年历的设计 电子万年历的系统整体设计框图 所需要的元件 DS18B20模块 DS18B20的特点 DS18B20内部结构 DS18B20管脚排列 DS1302模块 SPI时 ...
- 基于51单片机的简易雷达定位装置
简易超声波雷达 任务: 一. 摘要: 超声波测距广泛运用于各类电子产品精确距离测量,如汽车尾部的倒车雷达对倒车时的障碍物进行精确判断,反馈到驾驶员,使驾驶员能做出准确的判断和操作:各类航模中当即将触地 ...
最新文章
- Windows 10 不能安装更新 (0x8024402f)
- jQuery mobile 之三
- 【Ubuntu-Tensorflow】程序结束掉GPU显存没有释放的问题
- python struct pack string_struct (String) – Python 中文开发手册
- 精读《如何编译前端项目与组件》
- Windows安全加固系列
- 淘宝双十一火爆下的暗礁?
- 【转】【Linux】Linux 命令行快捷键
- clion使用之如何在编译运行多个程序(以cpp为例)
- php序列化 与json_PHP中serializen()与json_encode()的性能差异
- 黑客比程序员高在哪里?
- 在记事本中无限循环_意外空间:比恐怖游轮更无解的循环迷宫
- 在Ubuntu上安装MySQL8.0数据库并使用Navicat远程访问
- 迁移学习概述(Transfer Learning)
- golang与手机如何实现一些自动化操作?
- 《java与模式》笔记-----抽象类和接口
- Codeforces Round #495 C. Sonya and Robots
- 2019HDU多校第七场 HDU6656 Kejin Player H 【期望递归】
- echarts:silent:true去掉markline label的tooltip
- ubuntu 17.10 wifi 网速慢的解决办法
热门文章
- 主宰互联网的超强10大算法!
- 【Linux进程概念——上】冯 • 诺依曼体系结构 | 操作系统 | 进程 | fork | 进程状态 | 优先级
- Unity打开Windows虚拟键盘
- 六爻排盘php源码,六爻排盘-六爻在线排盘-六爻在线起卦-纳甲六爻起局-六爻在线摇卦-元亨利贞网在线六爻排盘系统...
- 支付宝公布2019集五福攻略,准备好薅羊毛的正确姿势
- 无限极分类php实现—查子孙树、家谱树
- 20189230杨 2018-2019-2 《密码与安全新技术专题》第3周作业
- 【180622】VC++不规则窗体编程跳棋游戏实例
- Centos 7 硬盘扩容
- 影响工程项目进度的因素有哪些