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

发布者:EtherealLight最新更新时间: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)

        {

                Clr_Scr();

                Whole();

        }


}

关键字:LCD12864  51单片机  小游戏 引用地址:基于LCD12864和51单片机的简单小游戏Proteus仿真程序

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

推荐阅读最新更新时间:2024-11-08 01:07

51单片机(十二)—— 单片机复位
一、复位介绍 复位为单片机提供了一条从已知初始条件启动处理的途径。复位期间,大部分控制和状态寄存器被迫使用初始值,单片机的外围模块被禁止,单片机用于复位的复位源有加电复位、外部RESET管脚复位、看门狗复位等。 我们实验对应的硬件复位电路,如下图所示。 这个图中集成了51单片机和AVR单片机的复位电路,对于51单片机,将J12上的跳线帽跳到左侧,则左侧的电路与单片机的复位引脚相连,正常情况由于R14的下拉作用,单片机的复位引脚为低电平,单片机正常工作,如果按下按键,VCC与单片机复位引脚相连,单片机产生复位。 二、例程测试 1、硬件复位 这个实验我们来测试硬件复位功能,测试代码的主要部分如下所示,完整代码可以从本文资源
[单片机]
<font color='red'>51单片机</font>(十二)—— 单片机复位
构造一个51单片机的实时操作系统
摘 要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Keil C51的一种调度方式。为此,构造这一实时操作系统,并有针对性地介绍此系统的堆管理方法、任务的建立以厦任务的切换等。 关键词:51单片机 实时操作系统 任务重八调度 目前,大多数的产品开发是在基于一些小容量的单片机上进行的。51系列单片机,是我国目前使用最多的单片机系列之一,有非常广大的应用环境与前景,多年来的资源积累,使51系列单片机仍是许多开发者的首选。针对这种情况,近几年涌现出许多基于51内核的扩展芯片,功能越来越齐全,速
[应用]
51单片机使用定时器进行数码管动态扫描程序
数码管是51单片机学习中比较基础的一个模块,为简化电路连接,提高系统可靠性,降低制造成本,多位数码管广泛采用动态扫描的方式进行显示。如果程序编写不当,数码管动态扫描容易出现亮度不均匀、亮度过低、重影等现象。很多初学者会在主函数中使用while(1)循环,结合delay函数不断扫描,但这样得不断调用display扫描,如果单片机还要执行别的程序时,就会由于扫描不及时,导致各种问题。此外,在控制段选位选的先后顺序上,如果程序不当,则会造成显示重影等问题。在此给出一个稳定可靠的程序方案。 电路连接:P1口通过两个74HC573分别连接到八位数码管的段选和片选,段选、位选由P3.4和P3.5控制,低电平锁存 #include re
[单片机]
51单片机的P0口工作原理详细讲解
三态门:三态门缓冲器: 51单片机 P0口输入缓冲器 P0口的输出驱动:两个MOS管组成的推拉式结构 P0口作为IO线输入状态时:①读引脚;②读锁存器; P0口作为地址/数据复用口 P0口作为IO线输出时,只能输出低电平、高阻态,需要外接上拉电阻,使高阻态变为输出高电平(对比 AVR单片机 的推挽输出结构) 一、P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。 下
[单片机]
<font color='red'>51单片机</font>的P0口工作原理详细讲解
51单片机学习笔记【九】——红外通信实验
一.红外通信基础 1.红外线原理 红外线是波长在760nm~1mm之间的非可见光。红外通信装置由红外发射管和红外接受管组成,红外发射管是能发射出红外线的发光二极管,发射强度随着电流的增大而增大;红外接受管是一个具有红外光敏感特征的PN节的光敏二极管,只对红外线有反应,产生光电流。 2.信号调制原理 基带信号:从信号源发出没有经过调制的原始信号,特点是频率较低,信号频率从0开始,频谱较宽。 调制:就是用待传送信号去控制某个高频信号的幅度、相位、频率等参量变化的过程,即用一个信号去装载另一个信号。 红外遥控器使用38KB的载波对原始信号进行解调,原理如下 调制后产生一定频段的高低电平,但红外接收头接受到的信号和调制后的
[单片机]
<font color='red'>51单片机</font>学习笔记【九】——红外通信实验
基于8051单片机的函数发生器的设计
基于单片机的函数发生器的设计 1 引言 在自动控制系统设计及调试过程中,不同频率的正弦波、三角波和方波常作为信号源,应用十分方便。过去常由分立元件及集成运放构成振荡器,后来出现的ICL8038其最高频率仅能达到100kHz。而MAX038芯片性能更好,最高频率可达20MHz,且三种波形由同一端输出。单片机控制品质卓越,基于单片机的函数发生器运行可靠,操作方便。 2 高频信号发生器芯片MAX038简介 MAXIM公司生产的MAX038芯片是一种高频精密的函数发生器,可产生三角波、锯齿波、正弦波、方波及脉冲波,且频率及占空比的控制可独立进行。 Lin管脚电流范围在10~400μA时电路获得最佳工作性能。输出波形的选择由逻
[单片机]
基于80<font color='red'>51单片机</font>的函数发生器的设计
浅析51单片机学习过程中的四大误区
51单片机的辉煌过去 51单片机指MCS-51系列单片机,CICS指令集。由Intel公司开发,其结构增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源,内有128个RAM单元及4K的ROM。其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前国内的51单片机市场主要为国产宏晶的产品STC系列其号称低功耗,稳定与廉价的特点。 学习51单片机的误区 误区1:51单片机是学习的基础 “51单片机是学习的基础”这句话本身并没有错。在我读本科的时候,当时它无疑是学习的基础——毕竟那时没有更高级的单片机可以供使用,
[单片机]
51单片机教程:单片机算术运算指令
不带进位位的单片机加法指令 ADD A,#DATA ;例:ADD A,#10H ADD A,direct ;例:ADD A,10H ADD A,Rn ;例:ADD A,R7 ADD A,@Ri ;例:ADD A,@R0 用途:将A中的值与其后面的值相加,最终结果否是回到A中。 例:MOV A,#30H ADD A,#10H 则执行完本条指令后,A中的值为40H。 下面的题目自行练习 MOV 34H,#10H MOV R0,#13H MOV A,34H ADD A,R0 MOV R1,#34H ADD A,@R1 带进位位的加法指令 ADDC A,Rn ADDC A,direct ADDC A,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved