AT89S52单片机+LCD12864贪吃蛇小游戏(独立按键)

发布者:innovator7最新更新时间:2020-07-29 来源: 51hei关键字:AT89S52单片机  LCD12864  贪吃蛇小游戏  独立按键 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

//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                for(j=0;j<10;j++);   

}


/*********************************

初始化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++;

[1] [2]
关键字:AT89S52单片机  LCD12864  贪吃蛇小游戏  独立按键 引用地址:AT89S52单片机+LCD12864贪吃蛇小游戏(独立按键)

上一篇:单片机红外热释报警器
下一篇:单片机编程里软件定时器使用技巧

推荐阅读最新更新时间:2024-11-17 11:53

基于AT89S52单片机一种新型多费率单相电能表设计
  随着电力的需求越来越大,不同时间段用电量不均衡的现象日趋严重。为了合理地调控电力负荷和节约能源,电力公司已开始鼓励使用多费率电能表。传统的多费率电能表一般采用机械转盘式计量方式,计量精度随机械磨损而降低,时段设置单一,人工抄表劳动强度大,且偶有窃电情况发生等诸多弊端。本文给出基于 AT89S52单片机一种新型多费率单相电能表设计,采用 AD7755电能计量芯片,电能计量准确。该电能表具有分时段计量,液晶显示,自动回抄,时段设置灵活,时间校正及时,新颖的防窃电,功耗低的特点。并对该电能表实验测试数据进行性了误差分析,指出电能计量中减小与消除误差的方法。 1 硬件电路设计   1.1总体结构   基于AT89S52单片机完成
[单片机]
基于<font color='red'>AT89S52</font><font color='red'>单片机</font>一种新型多费率单相电能表设计
基于ISD4004语音芯片和AT89S52单片机的语音播报记事器设计
引 言 本文介绍一种以语音存储与自动播放系统为基础的语音播报记事器设计。该设计以ISD4004语音 芯片 和AT89S52 单片机 为中心,很好地实现了语音存储与自动播放。 1 硬件设计原理 语音播报记事器的主要功能是实现语音存储与定时播放。要实现语音存储与定时播放的方法很多, MTD2002 可供选择的器件也很多。由于单片机等微控制器的出现和数字电路技术的发展,使得现在的语音存储与自动播放变得易于实现。本设计采用单片机作为微控制器。单片机的字长由4位、8位、16位发展到32位。目前这几种字长的单片机同时存在于市场,用户可以根据不同的需要进行选择。本系统选用字长为8位的AT89S52单片机作为控制器。
[单片机]
基于ISD4004语音芯片和<font color='red'>AT89S52</font><font color='red'>单片机</font>的语音播报记事器设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved