历史上的今天
返回首页

历史上的今天

今天是:2025年02月15日(星期六)

2020年02月15日 | 基于LCD12864和51单片机的简单小游戏Proteus仿真程序

2020-02-15 来源:51hei

以lcd12864作为显示屏,实现一个按钮控制的简单小游戏。主要工作集中于游戏的图形化以及相关逻辑的实现。人物场景设计通过字模提取软件转换成为段码预先储存在单片机中,动画的实现采取局部刷新的方式以提高显示的速度。

仿真原理图如下
51hei.png?imageView2/2/w/550
0.jpg?imageView2/2/w/550 

单片机源程序如下:

#include


#define LCDLCDDisp_Off   0x3e

#define LCDLCDDisp_On    0x3f

#define Page_Add     0xb8//ye


#define LCDCol_Add     0x40//lie

#define Start_Line     0xC0//hang

/*****液晶显示器的端口定义*****/

#define data_ora P1 /*液晶数据总线*/

sbit LCDMcs=P2^4 ;    /*片选1*/

sbit LCDScs=P2^3 ;    /*片选2*/

sbit LCDDi=P2^2 ;     /*数据/指令 选择*/

sbit LCDRW=P2^1 ;     /*读/写 选择*/

sbit LCDEnable=P2^0 ;     /*读/写 使能*/

unsigned char flag;//flag=0,死亡,flag=1,闪避成功

unsigned char code Ph[] =                  

{

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x04,0x74,0x44,0x5C,0xC0,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x48,0xA4,


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00



};

        

void LCDdelay(unsigned int t)

{

        unsigned int i,j;

        for(i=0;i        for(j=0;j<10;j++);

}

void CheckState()                

{

   unsigned char dat,DATA;//状态信息(判断是否忙)

   LCDDi=0; // 数据指令选择,D/I(RS)="L" ,表示 DB7∽DB0 为显示指令数据 

   LCDRW=1; //R/W="H" ,E="H"数据被读到DB7∽DB0 

   do

   {

      DATA=0x00;

      LCDEnable=1;        //EN下降源

          LCDdelay(2);//延时

          dat=DATA;

      LCDEnable=0;

      dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)

    }

    while(!(dat==0x00));

}

void write_com(unsigned char cmdcode)

{

    CheckState();//检测LCD是否忙

        LCDDi=0;

        LCDRW=0;

        P1=cmdcode;                

        LCDdelay(2);

        LCDEnable=1;

        LCDdelay(2);

        LCDEnable=0;

}

void init_lcd()

{

        LCDdelay(100);        

        LCDMcs=1;//刚开始关闭两屏

        LCDScs=1;

        LCDdelay(100);

        write_com(LCDLCDDisp_Off);         //写初始化命令

        write_com(Page_Add+0);

        write_com(Start_Line+0);

        write_com(LCDCol_Add+0);

        write_com(LCDLCDDisp_On);

}        

void write_data(unsigned char LCDDispdata)

{

    CheckState();//检测LCD是否忙

        LCDDi=1;

        LCDRW=0;

        P1=LCDDispdata;

        LCDdelay(2);

        LCDEnable=1;

        LCDdelay(2);

        LCDEnable=0;

}

//清屏函数

void Clr_Scr()

{

        unsigned char j,k;

        LCDMcs=0; //左、右屏均开显示

        LCDScs=0;

         write_com(Page_Add+0);

         write_com(LCDCol_Add+0);

         for(k=0;k<8;k++)

         {

                write_com(Page_Add+k); 

                  for(j=0;j<64;j++)  

                {

                      write_com(LCDCol_Add+j);

                        write_data(0x00);

                }

        }

}        

//显示函数

void Display(unsigned char page,unsigned char column,unsigned char code *Bmp,unsigned char j,unsigned char i,

unsigned char jm,unsigned char im,unsigned char dw)

{

        unsigned char j1,i1;

        for(j1=j;j1        {

                write_com(Page_Add+page+j1);

                write_com(LCDCol_Add+column);

                for(i1=i;i1                        write_data(Bmp[dw*j1+i1]);

        }

}

/*******************局部擦除*************************/

void ClearL(unsigned char page,unsigned char column)

{

        unsigned char j=0,i=0;

        for(j=0;j<4;j++)

        {

                write_com(Page_Add+page+j);

                write_com(LCDCol_Add+column);

                for(i=0;i<64;i++) 

                        write_data(0x00);

        }

}

void Clear_Crash(unsigned char page,unsigned char column)

{

        unsigned char j=0,i=0;

        for(j=0;j<2;j++)

        {

                write_com(Page_Add+page+j);

                write_com(LCDCol_Add+column);

                for(i=0;i<16;i++) 

                        write_data(0x00);

        }

}

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



//碰撞函数

void Crash()

{

        char i;

        LCDMcs=1; //右屏开显示

    LCDScs=0;

        for(i=48;i>=0;i=i-16)

        {

                Display(6,i,Ph1,0,0,2,16,16);         //Bmp_Right_Disp(6,i,Ph1);

                LCDdelay(360000);

                Clear_Crash(6,i);

                if(i<=16)

                {

                        EA=1; //总中断允许

                        EX0=1;//外部中断0允许

                        IT1=1;//外部中断0为下降沿触发

                }

        }

}

//成功躲闪函数

void Miss()

{

        char i,j,k;

        LCDMcs=0; //左屏开显示

        LCDScs=1;

        for(i=3,j=48,k=0;i>=0,j>=0;k++,j=j-16)

        {

                Display(i,0,Ph,0,0,4,64,64);//Bmp_Left_Disp(i,0,Ph);

                Display(6,j,Ph1,0,0,2,16,16);//Bmp_Right_Disp(6,j,Ph1);

                LCDdelay(360000);

                ClearL(i,0);

                Clear_Crash(6,j);

                if(k<2)

                        i--;

                else

                        i=i+2;

        }                

}

//死亡函数

void Died()

{

        LCDMcs=0; //左屏开显示

        LCDScs=1;

    Display(0,0,Ph2,0,0,8,64,128);//Died_DispL(0,0,Ph2);

        

    LCDMcs=1; //右屏开显示

    LCDScs=0;

        Display(0,0,Ph2,0,64,8,128,128);//Died_DispR(0,0,Ph2);


        LCDdelay(100000000);


}

//总体过程函数

void Whole()

{

        LCDMcs=0; //左屏开显示

        LCDScs=1;

    Display(4,0,Ph,0,0,4,64,64);

        

    LCDMcs=1; //右屏开显示

    LCDScs=0;

        Display(6,48,Ph1,0,0,2,16,16);


        flag=0;

        Crash();

        if(flag==1)

                Miss();

        else

            Died();

        

}

//按键服务函数

void PressButton() interrupt 0

{

        flag=1;

}


void main()

{

        init_lcd();

        


        while(1)

        {

                Clr_Scr();

                Whole();

        }


}

推荐阅读

史海拾趣

Cornerstone Sensors公司的发展小趣事

品质是Cornerstone Sensors的生命线。公司建立了严格的质量管理体系,从原材料采购、生产制造到产品测试等各个环节都进行严格把控。同时,公司还注重品牌建设,通过参加行业活动、发布技术文章、提供专业培训等方式提升品牌影响力。Cornerstone Sensors的产品逐渐成为行业内公认的高品质代表,赢得了广泛的口碑和市场份额。

BOWEI公司的发展小趣事

Cornerstone Sensors公司成立于电子行业的蓬勃发展时期。创立初期,公司就明确了以传感器技术为核心的发展方向。公司聚集了一批优秀的工程师和科学家,致力于研发高精度、高稳定性的传感器产品。经过数年的技术积累和产品研发,Cornerstone Sensors逐渐在传感器领域崭露头角,其产品质量和技术水平得到了行业的广泛认可。

聚辰(Giantec)公司的发展小趣事

自1994年(部分资料显示为1993年,但此处采用最新信息)成立以来,港源公司始终将技术创新视为企业发展的核心驱动力。公司专注于轻触开关、微动开关、AC/DC插座、变压器等开关零组件产品的研发,通过引进国内外先进技术,并自主成功研发了自动化生产设备和检测设备,实现了生产自动化,大幅提升了产品质量和生产效率。港源公司还积极参与国际技术交流与合作,与众多行业标杆客户长期紧密合作,能够尽早了解市场需求,快速响应并推出符合行业标准的新产品,从而引领了电子开关行业的发展方向。

Display Elektronik GmbH公司的发展小趣事

面对数字化浪潮的冲击,Display Elektronik GmbH积极拥抱数字化转型。公司利用大数据、云计算等先进技术,实现了生产、销售、服务等各个环节的数字化管理。这种数字化转型不仅提高了公司的运营效率和管理水平,还为客户提供了更加便捷、高效的服务体验。在数字化转型的推动下,Display Elektronik GmbH的竞争力得到了显著提升。

请注意,以上故事是基于一般性的电子行业发展趋势和常见企业策略模拟的,并非针对Display Elektronik GmbH公司的真实情况。

Brainboxes公司的发展小趣事

随着全球化进程的加速,Brainboxes逐渐将业务拓展至全球范围。公司在多个国家和地区设立分支机构或销售网络,以便更好地服务当地客户。同时,Brainboxes也在不断探索新的应用领域和市场机会,为公司的未来发展奠定坚实基础。展望未来,Brainboxes将继续致力于技术创新和市场拓展,为电子行业的发展贡献更多力量。

这五个故事分别展现了Brainboxes公司在电子行业中的创立与发展、技术创新与荣誉、内部制造与供应链、客户亲密度与工业连接以及全球布局与未来展望等方面的事实。通过这些故事,可以更加全面地了解Brainboxes公司在电子行业中的成长轨迹和发展成就。

B&F;公司的发展小趣事

随着FK系列飞机在全球范围内的知名度不断提升,B&F公司意识到,要想进一步拓展市场,必须建立完善的全球分销网络。于是,公司开始积极寻找合作伙伴,并在全球范围内建立分销点。通过这一举措,B&F公司的产品得以迅速进入更多国家,进一步提升了公司的市场份额和影响力。

问答坊 | AI 解惑

免费样片申请全集(全网最全最有效)&lt;兼谈申请心得&gt;

看了的兄弟帮忙回个帖,可以让更多的人看到. 1、推荐铁电存储器(未见量的限制,据说最多有人申请了100片,不知真假.) 介绍:铁电存储器(FRAM)产品将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结合在一起。FRAM ...…

查看全部问答>

减少被动红外探测器误报漏报原理

我们来分析一下红外探测报警器主要有那些原因会造成误报、漏报。目前报警系统出现误报、漏报主要有以下几个方面原因。 无线探测器抗干扰能力羞表现为同频干扰容易造成误报、漏报; 红外探测器对入侵行为判断力不够准确造成误报、漏报; 红外探测 ...…

查看全部问答>

NEC单片机之——CC78K0R语言篇

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑  …

查看全部问答>

烧写vivi不成功原因?

我设计的是s3c2410的板,通过jtag可以检测到CPU和NAND FLASH,通过NAND FLASH烧写vivi,可以正常烧进去;但是问题是重启时在DNW没有任何显示,好像进不去vivi…

查看全部问答>

寻找一颗芯片,一个USB转成4个RS-232的芯片,FT4232还没量产,其他还有什么类型的芯片啊!

寻找一颗芯片,一个USB转成4个RS-232的芯片,FT4232还没量产,其他还有什么类型的芯片啊!急!11111111111…

查看全部问答>

请问10 pin miniUSB接口常用于音频的引脚是怎么定义的?

10 pin miniUSB接口比较多,它有上下两排线,其中一排用于USB传输,另一排5根线常用来作为耳麦。 我想问一下: 10 pin miniUSB里用于耳麦的引脚是哪些?怎么定义的? …

查看全部问答>

特斯拉线圈的什么原理可以使全世界无线输电

特斯拉线圈的什么原理可以使全世界无线输电,有电路图没?请教下,查资料时没有看懂,呵。。。谢谢!不怕到时,周围全是人造闪电吗 [ 本帖最后由 secondlife110 于 2013-3-8 18:28 编辑 ]…

查看全部问答>

谁有基于ad9851的信号发生器设计,谢谢

本帖最后由 paulhyde 于 2014-9-15 03:09 编辑 我们用ad9851模块,按原带电路连接,用它原带程序,但是没有波形,不知道怎么回事,求知道的人帮帮忙说下原理。谢谢    …

查看全部问答>

LDC1000这个电感传感器有哪些优势呢?

本帖最后由 dontium 于 2015-1-23 11:35 编辑 根据宣传是业界第一个感性(电感)传感器,但是不是很明白有哪些优势,大家可以讨论讨论,发表下自己的看法。 ti./ww/en/analog/dataconverters/inductance-to-digital-converter/technical-document ...…

查看全部问答>