历史上的今天
返回首页

历史上的今天

今天是: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                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++;

推荐阅读

史海拾趣

昆泰芯微电子(CONNTEK)公司的发展小趣事

为了加快产品国产化进程,昆泰芯微电子与世强先进(深圳)科技股份有限公司签订了授权代理合作协议。通过这一战略合作,昆泰芯微电子成功将旗下高端传感器产品触达至终端市场,实现了市场的快速扩张。同时,这一合作也进一步提升了昆泰芯微电子在行业中的知名度和影响力。

Electronic-Bauteile Goerlitz GmbH公司的发展小趣事

为了进一步提升公司的竞争力,Electronic-Bauteile Goerlitz GmbH公司积极实施国际化战略。公司通过与国外知名企业的合作,引进先进的技术和管理经验;同时,公司还在海外设立了研发中心和生产基地,以便更好地满足当地市场的需求。这些举措使得公司的业务范围不断扩展,国际影响力不断增强。

Cambridge Electronic Industries Ltd公司的发展小趣事

在激烈的市场竞争中,CEI深知品质管理的重要性。公司建立了完善的质量管理体系,从原材料采购到产品制造、检验、包装等各个环节都进行严格把关。同时,CEI还注重持续改进和优化生产流程,提高生产效率和产品质量。这些措施使得CEI的产品在市场上具有更高的竞争力和口碑。

Exel Microelectronics Inc公司的发展小趣事

在XXXX年,Exel Microsystems Inc公司成功进入国际市场。公司凭借优质的产品和服务,赢得了国外客户的认可和信任。为了更好地服务国际市场,Exel还在多个国家和地区设立了分支机构和研发中心。这一市场拓展的成功不仅为公司带来了更多的商业机会,也提升了公司的国际知名度和影响力。

EG & G Inc公司的发展小趣事

为了进一步扩大市场份额,EG & G Inc公司积极开展市场拓展和国际合作。公司在中国、欧洲等多个国家和地区设立了分支机构,与当地企业建立了紧密的合作关系。同时,公司还积极参与国际展览和交流活动,展示了其先进的技术和产品。这些努力使得EG & G Inc公司在国际市场上获得了更多的机会和认可。

Emulation Technology Inc公司的发展小趣事

Emulation自创立之初,就专注于模拟和仿真技术的研发。在成立初期,公司成功开发出一款具有革命性的电子系统模拟软件,该软件能够准确模拟电子设备的性能和行为,为工程师们提供了强大的设计工具。这一创新技术迅速获得了市场的认可,成为Emulation公司发展的基石。

问答坊 | AI 解惑

招聘高级硬件开发工程师

招聘高级硬件开发工程师 本公司提供良好发展机会和平台 我公司是一家主营一卡通智能管理系统、智能卡机具、热工仪表三大类产品,集研发、生产、销售、工程安装维护等全套工程实施,具有雄厚技术、销售实力的民营企业。 公司于2003年11月取得ISO9 ...…

查看全部问答>

如何计算硬盘的录像时间?

在监控系统工程中,针对不同的格式,不知如何去选择硬盘的容量和录像的时间? 实际上这个问题涉及到几个方面,一是视频信号本身的大小,二是压缩后的大小。 现在监控系统通常是用CIF或者D1的分辨率,其象素值如下:       & ...…

查看全部问答>

Android 3.0系统曝光 最低配置1GHz CPU

福布斯》网站于周三发布文章称,在各大公司重点开发诸如iPhone 4、Droid X和Evo 4等新一代智能手机的同时,有事实表明,无线行业领域内的部分大公司也被与高端智能手机大相径庭的低价智能手机市场蕴藏的潜力所吸引。这不,高通、诺基亚和宏达电都开 ...…

查看全部问答>

困惑已久的地址问题

刚上手WINCE,做一个CAMERA方面的驱动,主要是将inputbuffer中的数据通过驱动转换为outputbuffer,而且inputbu和outputbu都需要和应用程序交互,中间就有一些地址的映射转换。现在是被这些地址搞糊涂了。向各位大侠请教:    首先程序里 ...…

查看全部问答>

界面显示OnPaint时,按钮还没刷新显示,这时候按钮位置的小黑框怎么解决?

RT,做界面时碰到这个问题!在界面显示的时候可以看到一个小黑框闪一下,按钮多的时候就很明显了,搞了很久也没解决。。。求高手赐教!!!…

查看全部问答>

急:谁有用VC进行PCI总线数据采集卡编程的资料,例程?

谁有用VC进行PCI总线数据采集卡编程的资料,例程?可联系我:dfg12123@yahoo.com.cn 谢谢!!!!…

查看全部问答>

有关钱箱的问题

具体情况如下: 1.目前钱箱有两种连接方式,一种是直接连到主机上,一种是连接到打印机等外设。现在我采用的是连接到打印机的方式,打印机是USB接口的。 2.试过几个POS软件,都不能够打开钱箱,但是能够打印。 3.如果改用LTP或者COM接口的打印机 ...…

查看全部问答>

ZigBee无线自组网的LED节能灯控制系统

ZigBee无线自组网的LED节能灯控制系统    摘要:设计了一种基于ZigBee无线自组网控制LED节能灯的控制系统。以TI公司的CC2530为主要硬件平台,利用ZigBee Pro协议栈组建了Mesh网络,在上位机上实现了LED灯亮度的调整和环境温度、电压的监 ...…

查看全部问答>

【招聘 之一】帮公司发个帖子,寻同道挚友,机会难得

公司简介     概伦电子科技有限公司(ProPlus Electronics, Co. Ltd.)致力于电子设计自动化(EDA)技术解决方案,其目标是成为EDA领域的世界级企业。概伦电子在美国硅谷、北京中关村科技园区和济南国家信息通信国际创新园设有 ...…

查看全部问答>

嵌入式Linux 学习方法

我想学Linux操作系统 现在好多招嵌入式工程师之类的都要这方面的要求   自己手头上的资料也不少    可自己看起总有点理不出头绪  有哪位能够给点学Linux的建议      跪求………

查看全部问答>