历史上的今天
今天是:2025年07月29日(星期二)
2020年07月29日 | AT89S52单片机+LCD12864贪吃蛇小游戏(独立按键)
2020-07-29 来源:51hei
单片机源程序如下:
//12864并行接口参考程序,控制器st7920
#include "reg52.h"
#include "Lcd12864.h"
#include "Key.h"
#define uchar unsigned char
#define uint unsigned int
static unsigned long Seed = 1;
#define A 48271L
#define M 2147483647L
#define Q (M / A)
#define R (M % A)
/************************************
伪随机数发生器
*************************************/
double Random(void)
{
long TmpSeed;
TmpSeed=A*(Seed%Q)-R*(Seed/Q);
if(TmpSeed>=0)
Seed=TmpSeed;
else
Seed=TmpSeed+M;
return (double)Seed/M;
}
/**************************************
为伪随机数发生器播种
***************************************/
void InitRandom(unsigned long InitVal)
{
Seed=InitVal;
}
//延时子程序
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i } /********************************* 初始化MPU **********************************/ void InitCpu(void) { TMOD=0x0; TH0=0; TL0=0; TR0=1; ET0=1; EA=1; } #define N 25 struct Food { unsigned char x; unsigned char y; unsigned char yes; }food;//食物结构体 struct Snake { unsigned char x[N]; unsigned char y[N]; unsigned char node; unsigned char direction; unsigned char life; }snake;//蛇结构体 unsigned char Flag=0; unsigned char Score=0; unsigned char Speed=5; unsigned char KeyBuffer=0; #define FUNC 1 #define UP 2 #define DOWN 3 #define LEFT 4 #define RIGHT 5 #define PASSSCORE 20//预定义过关成绩 void Timer0Int(void) interrupt 1 { switch(OSReadKey()) { case 90: KeyBuffer=FUNC; if(++Speed>=10) Speed=1; Flag|=1<<1;//速度变化标志置1 break; case 13: KeyBuffer=DOWN; /*if(snake.direction!=2) snake.direction=1;*/ break; case 33: KeyBuffer=UP; /*if(snake.direction!=1) snake.direction=2;*/ break; case 23: KeyBuffer=RIGHT; /*if(snake.direction!=4) snake.direction=3;*/ break; case 43 : KeyBuffer=LEFT; /*if(snake.direction!=3) snake.direction=4;*/ break; default: break; } } /****************************** 画墙壁,初始化界面 *******************************/ void DrawBoard(void) { unsigned char n; for(n=0;n<31;n++) { Lcd_Rectangle(3*n,0,3*n+2,2,1); Lcd_Rectangle(3*n,60,3*n+2,62,1); } for(n=0;n<21;n++) { Lcd_Rectangle(0,3*n,2,3*n+2,1); Lcd_Rectangle(90,3*n,92,3*n+2,1); } Lcd_HoriLine(93,31,35,1); Lcd_HoriLine(93,63,35,1); } /*************************** 打印成绩 ****************************/ void PrintScore(void) { unsigned char Str[3]; Lcd_WriteStr(6,0,"成绩"); Str[0]=(Score/10)|0x30;//十位 Str[1]=(Score%10)|0x30;//个位 Str[2]=0; Lcd_WriteStr(7,1,Str); } /******************************** 打印速度级别 *********************************/ void PrintSpeed(void) { unsigned char Str[2]; Lcd_WriteStr(6,2,"级别"); Str[0]=Speed|0x30; Str[1]=0; Lcd_WriteStr(7,3,Str); } /*********************************** 游戏结束处理 ************************************/ void GameOver(void) { unsigned char n; Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隐出食物 for(n=1;n Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,0);//消隐食物,蛇头已到墙壁内,故不用消去 } if(snake.life==0)//如果蛇还活着 Lcd_WriteStr(2,1,"过关"); else //如果蛇死了 Lcd_WriteStr(2,1,"输了"); Lcd_WriteStr(1,2,"游戏结束"); } /******************************** 游戏的具体过程,也是贪吃蛇算法的关键部分 *********************************/ void GamePlay(void) { unsigned char n; InitRandom(TL0); food.yes=1;//1表示需要出现新事物,0表示已经存在食物尚未吃掉 snake.life=0;//表示蛇还活着 snake.direction=DOWN; snake.x[0]=6;snake.y[0]=6; snake.x[1]=3;snake.y[1]=6; snake.node=2; PrintScore(); PrintSpeed(); while(1) { if(food.yes==1) { while(1) { food.x=Random()*85+3; food.y=Random()*55+3;//获得随机数 while(food.x%3!=0) food.x++; while(food.y%3!=0) food.y++;
上一篇:单片机红外热释报警器
下一篇:单片机编程里软件定时器使用技巧
史海拾趣
|
招聘高级硬件开发工程师 本公司提供良好发展机会和平台 我公司是一家主营一卡通智能管理系统、智能卡机具、热工仪表三大类产品,集研发、生产、销售、工程安装维护等全套工程实施,具有雄厚技术、销售实力的民营企业。 公司于2003年11月取得ISO9 ...… 查看全部问答> |
|
在监控系统工程中,针对不同的格式,不知如何去选择硬盘的容量和录像的时间? 实际上这个问题涉及到几个方面,一是视频信号本身的大小,二是压缩后的大小。 现在监控系统通常是用CIF或者D1的分辨率,其象素值如下: & ...… 查看全部问答> |
|
福布斯》网站于周三发布文章称,在各大公司重点开发诸如iPhone 4、Droid X和Evo 4等新一代智能手机的同时,有事实表明,无线行业领域内的部分大公司也被与高端智能手机大相径庭的低价智能手机市场蕴藏的潜力所吸引。这不,高通、诺基亚和宏达电都开 ...… 查看全部问答> |
|
界面显示OnPaint时,按钮还没刷新显示,这时候按钮位置的小黑框怎么解决? RT,做界面时碰到这个问题!在界面显示的时候可以看到一个小黑框闪一下,按钮多的时候就很明显了,搞了很久也没解决。。。求高手赐教!!!… 查看全部问答> |
|
ZigBee无线自组网的LED节能灯控制系统 摘要:设计了一种基于ZigBee无线自组网控制LED节能灯的控制系统。以TI公司的CC2530为主要硬件平台,利用ZigBee Pro协议栈组建了Mesh网络,在上位机上实现了LED灯亮度的调整和环境温度、电压的监 ...… 查看全部问答> |
|
公司简介 概伦电子科技有限公司(ProPlus Electronics, Co. Ltd.)致力于电子设计自动化(EDA)技术解决方案,其目标是成为EDA领域的世界级企业。概伦电子在美国硅谷、北京中关村科技园区和济南国家信息通信国际创新园设有 ...… 查看全部问答> |
|
我想学Linux操作系统 现在好多招嵌入式工程师之类的都要这方面的要求 自己手头上的资料也不少 可自己看起总有点理不出头绪 有哪位能够给点学Linux的建议 跪求……… 查看全部问答> |




