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

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;//获得随机数

        

whil

[1] [2]
关键字:AT89S52单片机  LCD12864  贪吃蛇小游戏  独立按键 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic504666.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于AT89S52单片机控制的高精度数控直流电流源
在现代科学研究和工业生产中,精度高、稳定性好的数控直流电流源得到了十分广泛的应用。以往所采用的电流源多数是利用电位器进行调节,输出电流值无法实现精准步进。有些电流源虽能够实现数控但是往往输出的电流值过小,且所设定的输出电流值是否准确不经测试无法确定,不够直观。为此,结合单片机技术及V/I变换电路,利用闭环反馈调整控制原理设计制作了一种新型的基于单片机控制的高精度数控直流电流源。本系统以AT89S52单片机为控制器,通过人机接口(按键和LCD显示屏)来设置输出电流,设置步进等级1 mA,并可同时显示预设电流值和实际输出电流值。本系统由按键设置输出电流值,经单片机计算后通过D/A转换器(TLV5618)输出模拟信号,再经过V/I转换
发表于 2020-06-10
基于<font color='red'>AT89S52单片机</font>控制的高精度数控直流电流源
AT89S52单片机16LED摇摇棒设计
一、作品说明    摇摇棒是如今流行的一种玩具,在各种聚会、节日中均见得到它的身影。本设计也追随着摇摇棒的原理,利用人眼的视觉暂留特性,通过AT89S52单片机对16只高亮度LED发光二极管进行控制, 配合手的左右摇晃就可呈现一幅完整的画面。 该摇摇棒具有如下功能:1) 显示  “欢迎使用神奇魔幻摇摇棒!”;2) 显示  “o(∩_∩)o”微笑图案;3) 显示    心形图案;4) 显示   “LOVE”;5) 可以通过开关实现转换,轮流显示并循环。     二、系统总体设计1、总体方案比较
发表于 2019-11-08
<font color='red'>AT89S52单片机</font>16LED摇摇棒设计
基于AT89S52单片机的简易数字示波器设计
摘要:介绍一种双通道简易数字示波器的设计方案,以AT89S52单片机作为控制核心,输入信号在经过预处理电路处理后,通过高速A/D转换器ADC0809,实现信号的实时采样、数据处理、存储并在液晶上显示,并用键盘做功能设置。该设计创新地实现了波形的存储/回放、双通道信号实时对比分析、程控放大提高灵敏度等方面。测试结果表明该系统稳定,具有测量频率高、波形清晰、可靠性高、成本低等特点,有很高的实用价值。0 引言数字示波器是一种用途十分广泛的电子测量仪器。与传统模拟示波器相比,数字存储示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能,在电子电信类实验室中使用越来越广泛。随着电子技术的发展和电路
发表于 2019-11-07
基于<font color='red'>AT89S52单片机</font>的简易数字示波器设计
AT89S52单片机基础知识详解
性能说明:AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K在系统可编程Flash存储器。它是使用Atmel公司高密度非易失性存储器技术制造,并与业界标准80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,也就是适合于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活及非常有效的解决方案。AT89S52单片机提供一下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。此外,AT89S52单片机
发表于 2018-11-26
基于AT89S52单片机的多功能电子万年历设计
    随着生活节奏的日益加快,人们的时间观也越来越重,同时对电子钟表、日历的需求也随之提高。因此,研究实用电子时钟及其扩展应用,有着非常现实的意义,具有很大的实用价值。    本系统程序由主程序、中断服务函数和多个子函数构成。主函数主要完成各子函数和中断函数的初始化。定时中断函数主要完成时钟芯片的定时扫描及键盘扫描。时钟芯片的读写函数主要是将时间、日历信息读出来,并把要修改具体值写入时钟芯片内部。     系统的硬件设计与电路原理    电路设计框图    系统硬件概述    本电路是由AT89S52单片机
发表于 2018-04-02
基于<font color='red'>AT89S52单片机</font>的多功能电子万年历设计
lcd12864驱动程序 用于MSP430
LCD函数库,可用于MSP430单片机源程序如下:/** LCD_BASIC_LIBRARY.C**  Created on: 2017年7月20日*      Author: Hasee*/#include <msp430.h>typedef unsigned char uchar;typedef unsigned int uint;#define LCD_DataIn P8DIR=0x00   //数据口输入模式#define LCD_DataOut P8DIR=0xFF   //数据口输出模式#define LCD2MCU_Data
发表于 2020-07-18
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved