基于LCD12864和51单片机的简单小游戏Proteus仿真程序

2020-02-15来源: 51hei关键字:LCD12864  51单片机  小游戏

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

仿真原理图如下
51hei.png
0.jpg 

单片机源程序如下:

#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)

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

上一篇:基于51单片机数控恒流源
下一篇:51单片机GPS+sim800c GSM定位短信LCD1602液晶显示程序

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

推荐阅读

DS12887+lcd1602万年历仿真原理图+程序
下面是仿真原理图:51单片机驱动DS12887时钟芯片,采用lcd1602液晶屏来显示万年历源程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit rd=P3^7;sbit s4=P3^3;sbit dsds=P1^7;sbit dsrw=P1^6;sbit dsas=P1^5;sbit dscs=P1^4;sbit
发表于 2020-02-06
DS12887+lcd1602万年历仿真原理图+程序
基于51单片机的频率测量仪设计
频率计是一种使用计数法、测宽法来等方法来测量信号频率的一种测量仪器。他主要是由四个部分构成:时基产生电路、信号处理电路、结果显示电路以及控制电路组成制作出来的实物图如下:Altium Designer画的原理图和PCB图如下:单片机源程序如下:#include <reg52.h>unsigned long int fre; unsigned char time;unsigned int count;unsigned int count1;sbit   LCD_RS=P1^0;          //片选信号 sbit 
发表于 2020-02-05
基于51单片机的频率测量仪设计
51单片机+LCD1602电子密码锁程序
;      //此文件中定义了单片机的一些特殊功能寄存器#include "lcd.h"#include "key.h"#include "i2c.h"#define u16 unsigned int           //对数据类型进行声明定义#define u8 unsigned charsbit AS=P2^2;               //继电器
发表于 2020-02-05
51单片机+LCD1602电子密码锁程序
ARM 之LCD和LCD控制器
既然提到 了LCD那么我们首先必须要了解的就是他的种类,CD(liquid crystal  display), 即液晶显示器,是这一种采用了液晶控制透光度计数来实现色彩的显示器,他与传统的CRT显示器相比有很多优点:轻薄,能耗低,辐射小等,市场 占有率越来越大,LCD有很多类型:STN,TFT,LTPS TFT,OLED等,各有优缺点。一、 S3C2410,2440LCD控制器介绍1:S3C2410,2440LCD控制器提供了驱动STNLCD  TFTLCD所需要的所有信号, REGBANK是LCD控制器的寄存器组,含有17个寄存器及一块256X16的调色板内存,用来设置二线参数。2:LCDCDMA则是CD
发表于 2020-02-04
ARM 之LCD和LCD控制器
受疫情影响,LCD今年要全面涨价
湖北武汉的疫情危机对国内及全球的闪存、内存产能不会有什么明显影响,但是另一个重要产品——LCD面板的影响就不好说了,因为武汉是国内LCD面板生产重镇,京东方、华星光电、天马微等公司都在这里有生产线,由于复工时间推迟,韩媒报道称,调研公司IHS Markit预计LCD面板会涨价。 中国目前是全球最大的LCD面板生产基地,占据全球市场50%的产能,其中京东方是全球第一大LCD面板厂,并且还在大举扩增OLED产能,其中武汉就是他们最重要的生产地。 据报道,京东方在武汉建设了第二条10.5代线的LCD面板,同时还有该公司第一条6代线AMOLED生产线。 国内第二大LCD面板厂商华星光电在武汉也有6代线
发表于 2020-02-04
受疫情影响,LCD今年要全面涨价
ARM2440换lcd
          480列HFPD=2-1          2< thb < -                     扫描这一行后间隔多少时间收到同步信号 HSYNC_INV  VSYNC_INV水平垂直信号与lcd控制器电平相反,需要加位翻转 显存地址改写        LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+  
发表于 2020-02-02
小广播
何立民专栏 单片机及嵌入式宝典

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

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