历史上的今天
返回首页

历史上的今天

今天是:2026年01月05日(星期一)

正在发生

2023年01月05日 | AT89C51单片机游戏(推箱子)

2023-01-05 来源:zhihu

一、电路设计

此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。

LCD12864显示模块

带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个1616 点汉字,和128 个168 点ASCII 字符 集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4 行16×16 点 阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶 显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

== 控制器接口信号说明 ==

1、RS,R/W的配合选择决定控制界面的4种模式:

2、E信号

●忙标志:BFBF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据。利用STATUSRD指令,可以将BF读到DB7总线,从而检验模块之工作状态。

●字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAYON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAYOFF)。DFF的状态是指令DISPLAYON/OFF和RST信号控制的。

●显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。

●字型产生RAM(CGRAM)字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。

●地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。

光标/闪烁控制电路

  此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。

lcd12864指令说明

备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。


74LS08芯片

详细地说是4二输入与门,即一片74LS08芯片内有共四路二个输入端的与门。内部线路如下图:

二、运行效果

三、部分代码

/*想要更多项目私wo!!!*/

#include

#include "data.h"

#include "order.h"

#include "lcdinit.c"

#include "function.c"


void int1(void) interrupt 2

{

keyboard();

}


int main(){

uchar i=1;

error0=0;

error1=0;

error2=0;

delay(50);

EA=1;

IT1=1;

EX1=1;

lcd_init(0x00,0x00,0x14,0x50,0x01,0x14,0x00,MOD_XOR,0x0c);

set_cgram();

wirte_cgrom();

cls();

start();

cls();

pushbox();

guan();

while(1){

}

return(0);

}


void keyboard(){

switch(P1&0x1f){

case 0x1e: /*上 cury > 0 && */

  if(level_temp[curx][cury-1]==0||level_temp[curx][cury-1]==4){


      if(level[g][cury][curx]==4||level[g][cury][curx]==5){

      level_temp[curx][cury]=4;

          printc(curx,cury,4);

  }

  else{

      level_temp[curx][cury]=0;

          printc(curx,cury,0);

  }


      cury=cury-1;

  level_temp[curx][cury]=1;

      printc(curx,cury,1);

  }


  else if(level_temp[curx][cury-1]==3){


      if(level_temp[curx][cury-2]==0){


          if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }


  cury=cury-1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury-1]=3;

  printc(curx,cury-1,3);

  }


  else if(level_temp[curx][cury-2]==4){


          if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }


  cury=cury-1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury-1]=5;

  printc(curx,cury-1,5);

  pass();

  }


  }


  else if(level_temp[curx][cury-1]==5){


      if(level_temp[curx][cury-2]==0){


          if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }

  cury=cury-1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury-1]=3;

  printc(curx,cury-1,3);

      

  }

  else if(level_temp[curx][cury-2]==4){


      if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }

      

  cury=cury-1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury-1]=5;

  printc(curx,cury-1,5);

  pass();

  }

  pass();

  }

  while((P1&0x01)==0);

  break;

case 0x1d:    /*下 cury < 7 && */

  if(level_temp[curx][cury+1]==0||level_temp[curx][cury+1]==4){


      if(level[g][cury][curx]==4||level[g][cury][curx]==5){

      level_temp[curx][cury]=4;

          printc(curx,cury,4);

  }

  else{

      level_temp[curx][cury]=0;

          printc(curx,cury,0);

  }


      cury=cury+1;

  level_temp[curx][cury]=1;

      printc(curx,cury,1);

  }


  else if(level_temp[curx][cury+1]==3){


      if(level_temp[curx][cury+2]==0){


          if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }


  cury=cury+1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury+1]=3;

  printc(curx,cury+1,3);

  }


  else if(level_temp[curx][cury+2]==4){


          if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }


  cury=cury+1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury+1]=5;

  printc(curx,cury+1,5);

  pass();

  }


  }


  else if(level_temp[curx][cury+1]==5){


      if(level_temp[curx][cury+2]==0){


          if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }

  cury=cury+1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury+1]=3;

  printc(curx,cury+1,3);

      

  }

  else if(level_temp[curx][cury+2]==4){


      if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

      }

  else{

          level_temp[curx][cury]=0;

              printc(curx,cury,0);

      }

      

  cury=cury+1;

  level_temp[curx][cury]=1;

  printc(curx,cury,1);

  level_temp[curx][cury+1]=5;

  printc(curx,cury+1,5);

  pass();

  }

  pass();

  }

  while((P1&0x02)==0);

  break;

case 0x1b:    /*左 curx > 0 && */

  if(level_temp[curx-1][cury]==0||level_temp[curx-1][cury]==4){


      if(level[g][cury][curx]==4||level[g][cury][curx]==5){

      level_temp[curx][cury]=4;

          printc(curx,cury,4);

  }

  else{

      level_temp[curx][cury]=0;

          printc(curx,cury,0);

  }


      curx=curx-1;

  level_temp[curx][cury]=1;

      printc(curx,cury,1);

  }


  else if(level_temp[curx-1][cury]==3){


      if(level_temp[curx-2][cury]==0){


          if(level[g][cury][curx]==4||level[g][cury][curx]==5){

          level_temp[curx][cury]=4;

              printc(curx,cury,4);

推荐阅读

史海拾趣

友盟(AP)公司的发展小趣事

在市场拓展方面,友盟(AP)公司也展现出了强大的实力。公司通过线上线下相结合的方式,积极开展市场推广活动,扩大品牌知名度和影响力。同时,友盟还积极参与行业交流和合作,与业界同行共同探讨行业发展趋势和未来发展方向。这些努力不仅提升了友盟在行业内的地位,也为其未来的发展奠定了坚实的基础。

Anytek Technology Corporation Ltd公司的发展小趣事

为了持续推动技术创新和产品升级,Anytek在2010年投入运营了深圳市龙岗科技园研发中心。这一研发中心的建立,为公司的新产品研发和技术创新提供了强有力的支持。同时,Anytek也积极开拓全球市场,与德国、俄罗斯、美国、澳大利亚等多个国家建立了良好的合作关系。公司的产品在欧美、日韩、以色列等几十个国家畅销,并得到了俄罗斯政府、以色列政府等机构的采用。

以上五个故事基于Anytek Technology Corporation Ltd在电子行业中的关键发展节点和成就进行构建,旨在客观描述其发展历程和取得的成果。每个故事都遵循事实性描述的原则,未加入任何主观评价或褒贬色彩。希望这些故事能够满足您的需求。

DURATOOL公司的发展小趣事

随着环保意识的不断提高,绿色、环保、低碳已成为全球经济发展的重要趋势。DURATOOL公司积极响应这一趋势,致力于研发和生产绿色环保的电子工具产品。公司采用环保材料和工艺生产产品,减少了对环境的污染和破坏。同时,公司还积极开展环保宣传和公益活动,引导消费者树立绿色消费观念。这些举措不仅提升了DURATOOL公司的社会形象,也为其在未来的市场竞争中赢得了先机。

對餘科技(DIOFIT)公司的发展小趣事

在追求经济效益的同时,DIOFIT公司也积极履行社会责任,致力于环保事业。他们注重节能减排和资源循环利用,采用环保材料和生产工艺,降低产品对环境的污染。同时,DIOFIT公司还积极参与各类公益活动,为社会发展和环境保护贡献自己的力量。

AOS公司的发展小趣事

进入20世纪,AOS公司开始将目光投向热水领域。1936年,公司研发出了著名的“金圭特护内胆”技术,这一创新在热水器行业中引起了革命性的变化。金圭内胆不仅提高了热水器的耐用性和安全性,也大幅提升了产品的能效。这一技术的推出使AOS公司迅速成为热水领域的领先者,并奠定了其在全球热水器市场的领导地位。

EDDING公司的发展小趣事

随着Eclipse的不断发展壮大,ECLIPSE公司也面临着越来越多的挑战和风险。其中最大的挑战之一是保持Eclipse的开放性和灵活性,同时确保其稳定性和安全性。为此,ECLIPSE公司采取了一系列措施,包括加强代码审核、引入安全漏洞奖励计划等。此外,公司还积极应对来自竞争对手的挑战和市场变化,不断调整和优化自身的战略和业务模式。

问答坊 | AI 解惑

DSP也超频

今天把自己做的DM642板超了一下频。用的-7后缀的SDRAM(143M),调整了一下PLL芯片的倍频设置。将原先的133M频率调为150M,并将电路板上的四个钽电容全部拆下,剩下全板3.3V、1.8V、1.4V共18个10u瓷片电容及其他小瓷片电容。 150M已经超过 ...…

查看全部问答>

步进电机原理

本帖最后由 paulhyde 于 2014-9-15 03:11 编辑 有需要的彼此分享啊!!!    …

查看全部问答>

多路模拟选择开关相关资料

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 多路模拟选择开关相关资料,凌阳公司的,希望对大家有帮助。  …

查看全部问答>

请教电源一个职业规划问题--迷途之中的一只小书虫

请教 一个职业规划问题:     \"闻道有先后,术业有专攻\",书虫也是慕名而来.目的只有一个,请斑竹赐教.     目前我在公司负责LED的驱动的电源一块,听别人说的,开关电源是头头,于是,苦命研究此类电源,不想各类此电源还真纷繁复 ...…

查看全部问答>

二手开发板,IC呆料免费交易平台www.dz-dailiao.cn,www.电子呆料.cn

二手开发板,IC呆料免费交易平台www.dz-dailiao.cn,www.电子呆料.cn…

查看全部问答>

快捷方式为什么会改了图标呢

快捷方式的运用:如果要在CE平台的桌面上显示一个程序的快捷方式,实现步骤为:   1、创建一个快捷方式。在开发机上用记事本一类的文字编辑软件写入字符格式为:长度#路径。其中长度为路径的字符个数。   例如“16#\\windows\\abc.exe”,注 ...…

查看全部问答>

问一个MAX16823的输入电流和效率的问题。(MAXIM公司的请进)

在LED驱动里选择了MAX16823这个芯片。不过我在其供电电流和效率上遇到了一些问题。我把从官网上下载的PDF看了好几遍,又在官网上的搜索页里看了,都没发现提及MAX16823的效率以及输入电流与输出电流的信息。之所以特别提出来问,是因为,这个MAX168 ...…

查看全部问答>

意法半导体(ST)为STR91x的用户提供免费的TCP/IP协议栈

STMicroelectronics Delivers Free TCP/IP Stack for STR91x DesignersLow-footprint, vendor-supported stack accelerates Ethernet-based development using networ ...…

查看全部问答>

请教关于MSP430F5438的问题

最近买了一块芯片为MSP430F5438的LSD-STBD-A001-A2 ( 430F5实验平台 )。本人不会英语看不懂资料,请教各位老师,MSP430F5438与MSP430F169、MSP430F4XX、MSP430F14X等芯片相比,各项性能功能都超越了吗?先谢谢各位了!…

查看全部问答>

开关滤波器max293

有那个高手指导哈,我 弄得,按max293的pdf的开始还出来了,但现在就一直就不行了,我发觉是不是芯片烧了,但我换了几块了但还是这样,有那个高手给我说个解决的办法呀 ,多谢…

查看全部问答>