历史上的今天
今天是:2025年02月15日(星期六)
2020年02月15日 | 基于LCD12864和51单片机的简单小游戏Proteus仿真程序
2020-02-15 来源:51hei
以lcd12864作为显示屏,实现一个按钮控制的简单小游戏。主要工作集中于游戏的图形化以及相关逻辑的实现。人物场景设计通过字模提取软件转换成为段码预先储存在单片机中,动画的实现采取局部刷新的方式以提高显示的速度。
仿真原理图如下
单片机源程序如下:
#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 } 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 } } /*******************局部擦除*************************/ 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(); } }
史海拾趣
|
免费样片申请全集(全网最全最有效)<兼谈申请心得> 看了的兄弟帮忙回个帖,可以让更多的人看到. 1、推荐铁电存储器(未见量的限制,据说最多有人申请了100片,不知真假.) 介绍:铁电存储器(FRAM)产品将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结合在一起。FRAM ...… 查看全部问答> |
|
我们来分析一下红外探测报警器主要有那些原因会造成误报、漏报。目前报警系统出现误报、漏报主要有以下几个方面原因。 无线探测器抗干扰能力羞表现为同频干扰容易造成误报、漏报; 红外探测器对入侵行为判断力不够准确造成误报、漏报; 红外探测 ...… 查看全部问答> |
|
我设计的是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 编辑 ]… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:09 编辑 我们用ad9851模块,按原带电路连接,用它原带程序,但是没有波形,不知道怎么回事,求知道的人帮帮忙说下原理。谢谢 … 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 11:35 编辑 根据宣传是业界第一个感性(电感)传感器,但是不是很明白有哪些优势,大家可以讨论讨论,发表下自己的看法。 ti./ww/en/analog/dataconverters/inductance-to-digital-converter/technical-document ...… 查看全部问答> |




