历史上的今天
返回首页

历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2020年10月10日 | 51单片机+12864液晶屏贪吃蛇

2020-10-10 来源:51hei

先说下我这个东西最主要的几块。

1.单片机用的是stc的,51内核,你首先要会这个···

2.用状态机实现按键。这个里面有别人写的技术帖子··

3.液晶是12864,2种控制器都做过,一个控制器是ST7920带字库的,一个控制器是KS0108不带字库的。2个的英文资料我都放在里面了。首先得弄懂液晶要怎么样和单片机连接。
要在液晶上面做游戏,推荐先看英文资料,一定要看英文,研究液晶读写时序和初始化方法,然后找别人的程序,实现液晶的基本操作,画点,写汉字什么的,读液晶···然后自己写程序实现液晶的所有基本操作。这样才能对液晶有充分的认识,才能开始在上面做游戏。有了这个基础,以后学别的液晶也会快的多。

4.菜单,游戏少不了要用到菜单,比如选择难度,选择地图什么的。我里面放了一个别人的论文,看了之后应该就会自己写了。(注意论文里面讲的是用函数指针实现菜单,但是KEIL这个环境下用51函数指针会很困难,推荐像我那样直接传菜单号)

5.贪吃蛇游戏,推荐先不要看别人的程序,自己在电脑上面下个贪吃蛇游戏,玩的时候就观察贪吃蛇游戏的特征···比如蛇在怎么动,蛇要怎么描述,是每个点都描述还是只要蛇头蛇尾···蛇转弯的时候怎么写?  对于上面的问题,可以参考别人的程序,然后就开始动手画图什么的表示出来这些过程,一个功能一个功能逐一实现。(推荐看带字库的那个程序,那个程序代码是最终优化版本。思路很清晰···)

6.液晶的动画,动画实际上就是图片一张一张的显示,我在里面放了一个把彩色照片黑白二值化的工具,可以找到自己喜欢的GIF动画,用提取工具把照片一张一张提取出来,然后黑白二值化,然后取模工具取模,然后实现···虽然过程蛮枯燥,但是效果还不过,也可以学到不少东西。

单片机源程序如下:

#include <12864.h>

#include

#define num 15


//用来描述蛇在液晶上面一个点的结构体

struct she

{

        unsigned char x,y,value;

        unsigned char direction;       

};


struct loop_queue  //利用循环数组实现循环队列,拐点不会超过15个。所以大小选15足以。

{   

        unsigned int front;

        unsigned int rear;

        unsigned int count;

        struct she dat[num];

};

//不熟悉数组实现循环队列的可以在纸上画一下操作过程


struct she tou,wei,food; //蛇的头尾节点  和食物点

struct loop_queue queue;//循环队列  蛇转弯则形成拐点 将拐点入队列  尾巴到达拐点则拐点出队列


unsigned char flag_exit_game; //返回标志  为1时  从贪吃蛇游戏返回菜单

unsigned char flag_game_over; //结束标志  为1时  显示游戏结束画面 同时使返回标志为1

unsigned char tcs_stop;//暂停标志

unsigned char tcs_nd; //难度标志

unsigned char tcs_dt; //地图标志

unsigned char tcs_key_flag;  //贪吃蛇在一次移动中   只允许捕获一次按键  也就是只能产生一个拐点

unsigned char tcs_key_state; //用于按键状态机的实现


unsigned int  tcs_df;//得分

unsigned int  tcs_highest_df;//最高得分···没有使用这个  因为不知道要怎么在运行时写单片机的ROM


          

void tcs_game();

void tcs_bianjie(unsigned int );  //贪吃蛇边界  

void tcs_game_initial();         //游戏初始化


void timer0_initial();          //定时器0初始化

void timer1_initial();          

void food_produce();          //产生食物


unsigned char test_point_exist(unsigned char x, unsigned char y, unsigned char value);


void queue_initial(struct loop_queue *q);  

void queue_in(struct loop_queue *q,struct she h)  ;

struct she queue_out(struct loop_queue *q)  ;


void wei_you();

void wei_xia();

void wei_zuo();

void wei_shang();

void tcs_game()

{

        struct she check;  //用与暂存蛇即将移动的点  从而进行判断

        unsigned char he;

        unsigned char hui,i;


        flag_exit_game=0;

        flag_game_over=0;

        tcs_key_state=0;

        tcs_df=0;

        tcs_stop=1;


        draw_lcd_picture(&tcs_picture[0]); //贪吃蛇游戏画面

        delay_ms(2000);

        clear_lcd();//清屏12864

        tcs_bianjie(tcs_dt); //贪吃蛇游戏边界

        tcs_game_initial();//贪吃蛇初始化  主要是设定蛇头蛇尾  并显示蛇

        timer0_initial(); //定时器0工作在方式2  8位自动装初值  只计数不中断 用来产生随机数

        timer1_initial(); //定时器1工作在方式1        16位     10ms中断一次扫描键盘


        do

        {

                food_produce();//产生一个随机数 即随即产生x y value3个值确定一个点为食物

                he=test_point_exist(food.x,food.y,food.value);//检测产生的点的地方是否已经有点存在

        }

        while(he==food.value);//如果随机数产生在蛇的身体以及边界上 则重新再产生一个  

        draw_lcd_point(food.x,food.y,food.value);//显示食物 先读取这个点所在8位的情况 以免破坏现场

       

        queue_initial(&queue);//初始化循环队列  使队列空  front rear 即头尾指针为0

        check.x=0;

        check.y=0;

        check.value=0;

        check.direction=0;

        for(i=0;i                queue.dat[i]=check;


        while(1)

        {

                if(flag_exit_game==1)//如果游戏过程中按下返回键  则立即结束游戏  返回菜单

                        break;

                if(flag_game_over==1)

                        break;

               

                ET1=1;   //允许扫描按键          贪吃蛇游戏难度决定蛇2次移动之间的间隔时间  也就是检测按键的时间

                tcs_key_flag=0; //允许捕获按键  在检测按键时间内  只允许生产一个拐点  即捕获到一个有效的

                                                //按键以后  就置一这个变量 不允许再增加拐点

                while(tcs_stop==0);

                switch(tcs_nd)

                {

                        case 0:  {delay_ms(10); break;}

                        case 1:  {delay_ms(50); break;}

                        case 2:  {delay_ms(100); break;}

                }

                ET1=0;


                switch(tou.direction)//这个switch用来根据蛇头的x y value值以及当前蛇头移动的方向

                                                         //取出蛇头要到达的下一个点  存入check中  来判断是否撞墙 吃到食物 什么的···

                {       

                        case 0: {        

                                                check.x=tou.x;

                                                if(tou.y==63)  

                                                        check.y=0;

                                                else

                                                        check.y=tou.y+1;

                                                check.value=tou.value;

                                                 break ;

                                        }//->向右y+1 其他不变


                        case 1: {                                          //↓ 向下y不变

                                                check.y=tou.y;

                                                 if(tou.value==0x80)// value==0x80 则 x+1 value=0x01

                                                {

                                                        if(tou.x==7)

                                                                check.x=0;

                                                        else

                                                                check.x=tou.x+1;

                                                        check.value=0x01;

                                                }

推荐阅读

史海拾趣

Deutsch公司的发展小趣事

在竞争激烈的电子行业中,品质控制和品牌建设至关重要。Deutsch公司深知这一点,因此始终将品质控制和品牌建设作为公司的重要任务。公司建立了严格的质量管理体系,确保产品的每一个细节都符合高标准。同时,通过精心策划的品牌推广活动,Deutsch公司的品牌形象逐渐深入人心。这些努力不仅提升了公司的市场地位,也增强了客户对公司的忠诚度。

科山芯创(COSINE)公司的发展小趣事

随着产品的不断推出和市场的认可,科山芯创开始积极拓展市场。他们与国内外多家知名企业建立了合作关系,产品广泛应用于通讯网络、物联网、工业自动控制等多个领域。同时,科山芯创还积极参加各种行业展会和交流活动,与业界同行进行深入交流,共同推动电子行业的发展。

广州奥松公司的发展小趣事

为了满足市场对于芯片的日益增长的需求,奥松电子决定启动建设8英寸MEMS特色芯片IDM产业基地。这一项目的实施,不仅提升了公司的产能规模,也进一步巩固了公司在电子行业中的地位。通过引进先进的生产设备和技术,奥松电子成功打造了一个集研发、生产、销售于一体的产业基地,为公司的长远发展奠定了坚实的基础。

宇阳科技(EYANG)公司的发展小趣事

多年来,宇阳科技凭借其在MLCC领域的持续创新和卓越表现,荣获了多项荣誉。从2005年被国家商务部评为企业诚信度“双A”企业,到2008年国内首创的0201超微型MLCC开发成功并量产,再到2018年获中国电子学会科学技术奖科技进步类二等奖,宇阳科技的技术实力和市场地位得到了广泛的认可。

Delus Corp公司的发展小趣事

为了降低生产成本、提高生产效率,Delus Corp公司不断优化供应链管理。公司建立了完善的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控和管理。同时,公司还与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。这些措施的实施,使得公司的运营成本得到了有效降低,生产效率得到了显著提升。

G-Two Inc公司的发展小趣事

背景:2003年,福斯特的创始人林建华,一位在纺织业和化工领域有着丰富经验的工程师,决定跨界进入光伏材料行业。当时,国内光伏组件封装所需的光伏胶膜几乎全部依赖进口,被国外几家大公司垄断。

发展:林建华凭借在热熔网膜领域的技术积累,带领团队成功研发出EVA胶膜,打破了国外技术垄断。这一技术突破不仅降低了国内光伏组件的生产成本,也为福斯特在光伏材料领域的崛起奠定了坚实基础。

成果:2008年,福斯特的EVA胶膜产品凭借优异的性能和价格优势,成功打入国内光伏组件企业的供应名录,并跻身全球EVA胶膜供应商前三强。

问答坊 | AI 解惑

the cult of iPod—连线杂志编辑Leander Kahney

虽然有些老,但也不失为不错的书。 我有一个iPod,邻居也有一个,大部分与我共事的人都有iPod。我们很快就要变成一个iPod国度,很快就要是iPod世界。甚至美国总统也有iPod,就像英国女王、夏奈尔设计师卡尔·拉格菲尔德(Karl Lagerfeld)一样。 ...…

查看全部问答>

PLC控制系统的电气隔离技术(转载)

一般工业控制系统既包括弱电控制部分,又包括强电控制部分。为了使两者之间既保持控制信号联系,又要隔绝电气方面的联系,即实行弱电和强电隔离,是保证系统工作稳定,设备与操作人员安全的重要措施。 电气隔离目的之一是从电路上把干扰源和易干扰 ...…

查看全部问答>

急 电脑蓝屏

我电脑老师在下载程序时蓝屏  有哪位高人知道原因 教我解决一下呀 ,非常感谢。…

查看全部问答>

ARM7,9学习

请高手推荐一本关于ARM体系结构讲的特别清楚的书…

查看全部问答>

我的笔记本Bios密码忘了,哪位大侠帮帮忙??

Bios密码跟登陆密码不是一个,也就是说现在还是能正常使用。但还是挺闹心的,大家帮帮忙想想办法啊! 拿到厂里去的方法就不要说了,这个我也知道,我希望是一个我自己能解决的办法!先谢谢大家了! 我是新手,分不多,大家体谅啊!!…

查看全部问答>

ndis收发包函数的用途?

INT ReceivePacket(     IN  NDIS_HANDLE            ProtocolBindingContext,     IN  PNDIS_PACKET             ...…

查看全部问答>

为省电外围电路供电由MCU控制,请问接口要如何处理以保护MC

                                 主要是怕MCU控制给外围电路上电时会把MCU的接口部分搞坏。…

查看全部问答>

【转】使用SignalTapII调试Altera FPGA

摘 要 :本文介绍了可编程逻辑器件开发工具Quartus II 中SingalTap II 嵌入式逻辑分析器的使用,并给出一个具体的设计实例,详细介绍使用SignalTap II对FPGA调试的具体方法和步骤。关键字 : SignalTap;硬件调试;FPGA1 概述--- 随着FPG ...…

查看全部问答>

quartus 11.0版本的sdram地址宽度

地址宽度21位,是20-0?显示是21-0这个地方有没有问题,以前版本是地址宽度22,才是21~0。 [ 本帖最后由 tianma123 于 2012-4-27 11:20 编辑 ]…

查看全部问答>