1、基于51单片机实现的俄罗斯方块游戏整体设计方案52.1系统的核心部分单片机52.1.1单片机的选择52.1.2AT89S52引脚功能描述72.1.3晶振特性92.2液晶显示模块102.2.1液晶显示控制驱动器HD61202的特点102.2.2液晶显示控制驱动器HD61202的引脚功能102.2.3液晶显示控制驱动器HD61202的指令系统112.2.4HD61202的软件设计122.2.5JM12864J的电路结构特点152.2.6JM12864J的应用162.2.7键盘电路173系统程序的设计183.1俄罗斯方块驱动流程图183.2俄罗斯方块所有绘图工作流程图193.3俄罗斯方块中按下键的流
2、程图203.4俄罗斯方块所有绘图工作流程图21附录1:C语言程序30附录2:电路原理图59整体设计方案1.1 系统的核心部分单片机1.1.1 单片机的选择单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。单片机经过3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。其发展趋势不
3、外乎以下几个方面:1 多功能 单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,使得单片机可以实现更多的功能。比如A/D、PWM、PCA(可编程计数器阵列)、WDT(监视定时器-看家狗)、高速I/O口及计数器的捕获/比较逻辑等。有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。例如,有的芯片以51内核为核心,集成了USB控制器、SMART CARD接口、MP3解码器、CAN或者I*I*C总线控制器等,LED、LCD或VFD显示驱动器也开始集成在8位单片机中。2高效率和高性能为了提高执行速度和执行效率,单片机开始使用RISC、流水线和DSP的设计技术,使单
4、片机的性能有了明显的提高,表现为:单片机的时钟频率得到提高;同样频率的单片机运行效率也有了很大的提升;由于集成度的提高,单片机的寻址能力、片内ROM(FLASH)和RAM的容量都突破了以往的数量和限制。由于系统资源和系统复杂程度的增加,开始使用高级语言(如C语言)来开发单片机的程序。使用高级语言可以降低开发难度,缩短开发周期,增强软件的可读性和可移植性,便于改进和扩充功能。3低电压和低功耗单片机的嵌入式应用决定了低电压和低功耗的特性十分重要。由于CMOS等工艺的大量采用,很多单片机可以在更低的电压下工作(1.2V或0.9V),功耗已经降低到uA级。这些特性使得单片机系统可以在更小电源的支持下工
5、作更长的时间。4低价格单片机应用面广,使用数量大,带来的直接好处就是成本的降低。目前世界各大公司为了提高竞争力,在提高单片机性能的同时,十分注意降低其产品的价格。在此,我们采用型号为AT89S52的单片机。因为: AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。与MCS-51
6、单片机产品兼容 、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:0Hz33MH、三级加密程序存储器 、32个可编程I/O口线 、三个16位定时器/计数器八个中断源 、全双工UART串行通道、低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针 、掉电标识符 。AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止
7、工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 AT89S52单片机有PDIP、PLCC、TQFP三种封装方式,在此我选用DPIP也就是双列直插封装的单片机此种封装有如下特点:1. 适合PCB的穿孔安装;2. 易于对PCB布线;3. 操作方便;1.1.2 AT89S52引脚功能描述AT89S52单片机的管脚说明如图2-1所示:图2-1 DIP封装 AT89S52单片机引脚结构图1VCC:电源。2GND:接地端 。3P0口(P0.0P0.7):P0口是一个8位漏极开路的双向I/O口。作为输出
8、口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在Flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。4P1口(P1.0P1.7):P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和 P1.2分别作定时器/计数器2的外部计
9、数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如表2-1所示:在 Flash编程和校验时,P1口接收低8位地址字节。表2-1 P1口第二功能引脚号第二功能P1.0T2(定时器/计数器 T2 的外部计数输入),时钟输出P1.1T2EX(定时器/计数器 T2 的捕捉/重载触发信号和方向控制)P1.5MOSI(在系统编程用)P1.6MISO(在系统编程用)P1.7SCK(在系统编程用)5P2口(P2.0P2.7):P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用
10、。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如 MOVX RI)访问外部数据存储器时,P2口输出P2 锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。6P3口(P3.0P3.7):P3 口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉
11、低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为 AT89S52第二功能使用,如表2-2所示:表2-2 P3口第二功能引脚号第二功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2I(外部中断 0)P3.3I(外部中断 0)P3.4T0(定时器 0 外部输入)P3.5T1(定时器 1 外部输入)P3.6(外部数据存储器写选通)P3.7(外部数据存储器写选通)在 flash 编程和校验时,P3 口也接收一些控制信号。RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出96个晶振周期的高电平。特殊寄存器 AUXR(地址
12、8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE 仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对
13、微控制器处于外部执行模式下无效。:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当 AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。A/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,EA 必须接 GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。1.1.3 晶振特性AT89S52单片机有一个用于构成内部振荡器的反相放大
14、器,XTAL1和XTAL2分别是放大器的输入、输出端。石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。从外部时钟源驱动器件的话,XTAL2可以不接,而从XTAL1接入,如图 2-2 所示:图2-2内部振荡电路连接图1.2 液晶显示模块显示器部分是由HD61202液晶显示控制驱动器和JM12864J液晶显示器组成的,下面我们对其分别进行介绍。1.2.1 液晶显示控制驱动器HD61202的特点HD61202液晶显示控制驱动器是一种带有驱动输出的图形液晶显示控制器,它可直接与8位微处理器相连,它可与HD61203配合对液晶屏进行行、列驱动。HD61202是一种带有列驱动输出的液晶显示控制器,它可与
15、行驱动器HD61203配合使用,组成液晶显示驱动控制系统。1.内藏6464=4096位显示RAM,RAM中每位数据对应LCD屏上一个点的亮、暗状态;2.HD61202是列驱动器,具有64路列驱动输出;3.HD61202读、写操作时序与68系列微处理器相符,因此它可直接与68系列微处理器接口相连;4.HD61202的占空比为1/321/64。1.2.2 液晶显示控制驱动器HD61202的引脚功能引脚CS1,CS2,CS3 为芯片的片选端;引脚 E 为读写使能信号,它是在下降沿时数据被锁存入HD61202的;在E 高电平期间,数据被读出;R/W 为读写选择信号,当它为一时为读选通,为零时为写选通;
16、DB0-DB7为数据总线RST 为复位信号复位信号有效时,关闭液晶显示,使显示起始行为0,RST可跟MCU相连,由MCU控制;也可直接接VDD,使之不起作用。HD61202的引脚功能如下表2-3所示:表2-3 HD61202的引脚功能引脚符号状态引脚名称功能CS1,CS2,CS3输入芯片片选端CS1和CS2低电平选通,CS3高电平选通。E输入读写使能信号在E下降沿,数据被锁存(写)入HD61202;在E高电平期间,数据被读出R/W输入读写选择信号R/W=1为读选通,R/W=0为写选通RS输入数据、指令选择信号RS=1为数据操作 RS=0为写指令或读状态DB0-DB7三态数据总线RST输入复位信
17、号复位信号有效时,关闭液晶显示,使显示起始行为0,RST可跟MCU相连,由MCU控制;也可直接接VDD,使之不起作用。1.2.3 液晶显示控制驱动器HD61202的指令系统HD61202的指令系统比较简单,总共只有七种。现分别介绍如下:1. 显示开/关指令R/W RSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 1 1 1 1 1 1/0当DBO=1时,LCD显示RAM中的内容;DBO=0时,关闭显示。2. 显示起始行(ROW)设置指令该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律的改变显示起始行,可以使LCD实现显示滚屏的效果。R/W RSDB7 D
18、B6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 1 1 显示起始行(0-63)3. 页(PAGE)置指令R/W RSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 1 0 1 1 1页号(0-7)显示RAM共64行,分8页,每页8行。4. 列地址(Y Address)设置指令R/W RSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 显示列地址(0-63)设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MCU就可以用读、写指令读出该单元中的内容或向该单元写进一个字节数据。5. 读状态指令R/W RSDB7 DB
19、6 DB5 DB4 DB3 DB2 DB1 DB0 1 0BUSY 0 ON/OFF REST 0 0 0 0该指令用来查询HD61202的状态,各参量含义如下:BUSY:1-内部在工作 0-正常状态ON/OFF:1-显示关闭 0-显示打开REST: 1-复位状态 0-正常状态在BUSY和REST状态时,除读状态指令外,其它指令均不对HD61202产生作用。在对HD61202操作之前要查询BUSY状态,以确定是否可以对HD61202进行操作。6. 写数据指令R/W RSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 1 写 数 据读、写数据指令每执行完一次读、写操作,列地址
20、就自动增一,必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。7. 读数据指令R/W RSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 1 1 读 显 示 数 据1.2.4 HD61202的软件设计液晶控制器HD61202 一共有七条指令,从作用上可分为两类,显示状态设置指令和数据读/写操作指令。详见指令系统可查看图形液晶显示器产品有关手册。显示起始行设置中L5L0 为显示起始行的地址,取值在0-3FH(1-64 行)范围内。页面地址设置中P2-P0 为选择的页面地址,取值范围为0-7H,代表1-8 页。列地址设置中C5-C0 为Y地址
21、计数器的内容,取值在0-3FH(1-64 行)范围内。显示器上128 点64 点,每8点为一字节数据,都对应着显示数据RAM(在HD61202 芯片内),一点对应一个bit,计算机写入或读出显示存储器的数据代表显示屏上某一点列上的垂直8 点行的数据。D0 代表最上一行的点数据,D1为第二行的点数据,D7为第八行的点数据。该bit=1 时该点则显示黑点出来,该bit=0 时该点则消失。另外LCD 指令中有条display ON/OFF 指令,display ON 时显示RAM 数据对应显示的画面;display OFF 则画面消失,RAM 中显示数据仍存在。点阵字模文件的建立:由于MGLS128
22、64 液晶显示器没有内部字符发生器,所以在屏幕上显示的任何字符、汉字等须自己建立点阵字模库,然后均按图形方式进行显示。由于HD61202 显示存储器的特性,不能将计算机内的汉字库和其它字模库提出直接使用,需要将其旋转90 度后再写入。点阵字模库建立包括以下几个方面:1.建立816 点阵常用字符、数字、符号字模库。可选用计算机BIOS 中ASCII 的816 字模库,所有字符按照ASCII 值从小到大升序排列。asmMOV ax,1130h /*AH=11h功能调用。装入字库至软字库 */mov bh,6 /*AL=30h 取点阵信息 */int 10h /*BH=6 取ROM8X16 点阵指针
23、(VGA) */mov ax,es /*出口:ES:BP 指向字库指针 */mov ascii_es,axmov ax,bpmov ascii_bp,ax ;ascii_offset=ascii_bp+16*asciicode;for(j=0;j16;j+) bufj=peekb(ascii_es,ascii_offset+j); /*读16 字节点阵数据*/for(m=0;m16;m+) /*点阵数据转换成LCD 格式数据*/ if(m8) beginbyte= 7; shiftn=7;else beginbyte=15; shiftn=15;for(j=0;j(shiftn-m)&0x01
24、)1; 也可选用UCDOS 的ASC16 文件做字模库。ASC16 文件的字符为816 点阵。所有字符按照ASCII值从小到大升序排列。计算字符首地址的公式:字符首地址=字符的ASCII 码值16加字模库首地址。2.建立所用到的1616 点阵字模库。汉字字符可选用UCDOS 的HZK16 文件做字模库。HZK16 文件的字符为1616 点阵。所有字符按照区位码从小到大升序排列。计算汉字字符首地址的公式如下:汉字首地址=(区码-1)94+位码-1)32。作者用C 语言编写的读取UCDOS 点阵字库字模程序,完成字模读取。数据重新排列,并按MCS-51 汇编程序的要求写成相应格式的文本文件。p=(
25、quma-1)*94+weima-1)*32;cclibfile=fopen(HZK16,rb);fseek(cclibfile,(long)p,SEEK_SET);fread(buf,sizeof(unsigned char),32,cclibfile); /*读32 字节点阵数据*/for(m=0;m32;m+) /*点阵数据转换成LCD 格式数据*/if(m= 8 & m=16 & m24 ) beginbyte=30; shiftn=23;else beginbyte=31; shiftn=31;for(j=0;j(shiftn-m)&0x01)1;3.常用图形(如产品商标等)的点阵图
26、形的建立。对已有的图形可采用扫描仪进行扫描,然后用图形处理软件进行处理,再将BMP 格式文件转换成MCS-51的汇编文件的格式。以上所有的字模数据都存放在单片机W78E58 的程序存储器中,如用到的汉字、图形较多,可选用较大容量的程序存储器。通用子程序:通用子程序分左半屏、右半屏写指令代码子程序和写显示数据子程序。液晶显示驱动器HD16202 内部有个忙标志寄存器,当BF=1 时,表示内部操作正在运行,不能接受外部数据或指令。下面子程序中设指令代码寄存器为COMM,数据寄存器为DATA。3.右半屏写指令子程序WR_CMD2 和右半屏写数据子程序WR_DATA2 的编制同左半屏子程序相同,只是对
27、应口地址不同。1.2.5 JM12864J的电路结构特点JM12864J是使用HD61202及其兼容控制驱动器作为列驱动器,同时使用HD61203作为行驱动器的液晶模块。由于HD6120不与MPU发生联系,只要提供电源就能产生行驱动信号和各种同步信号,比较简单,因此这里就不作介绍了。下面主要介绍一下JM12864J的逻辑电路图。JM12864J共有两片HD61202及其兼容控制驱动器和一片HD61203,如图2-3所示:图2-3 JM12864J的逻辑电路图在JM12864J中,两片HD61202的ADC均接高电平,RST也接高电平,这样在使用JM12864J时就不必再考虑这两个引脚的作用。跟
28、HD61202(1)的相连;跟HD61202(2)的CS1相连,因此、选通组合信号为,=01选通(1),=10选通(2)。对于JM12864J,只要供给VDD、VSS和V0即可,HD61202和HD61203所需的电源将由模块内部电路在VDD和V0、VSS的作用下产生。1.2.6 JM12864J的应用以下内容为以单片机89S52为例机的接口电路,控制电路为直接访问方式的接口电路。电路原理图如图2-4所示:图2-4 AT89S52 与液晶的接口电路由图2-5可以看出:VSS接地;数字电源VDD接5V;数据、指令选择信号RS接单片机P3.2口;读写选择信号R/W接单片机P3.1口;DB0DB7分
29、别接单片机的P2.0P2.7口;芯片1、芯片2的片选分别接单片机的P3.4、P3.3口;复位端RST、背光正电源LEDA接5V;液晶驱动电压VEE、背光负电源LEDK接地。键盘电路键盘电路本设计共采用按键3个,分别与单片机的 P1.0、P3.5、P3.6、P3.7口相连,分别对应旋转、左移、下、右移。系统程序的设计1.3 俄罗斯方块驱动流程图开始随机生成一个图形交给当前图形变量随机生成一个图形交给提示图形变量行满表格满消除行并把上面的行数据下移并置清行为true、当前图改变为false清所有数据绘图(清屏)NYN提示图形变量给当前图形随机生成一个图形交给提示图形变量游戏结束绘图结束YY绘图一次
30、Y根据变化绘图(绘提示图和当前图形)N图形到底了吗图形下降一行俄罗斯方块所有绘图工作流程图开始输出分数清除刚才位置的图形当前图形改变NY绘当前图的现在位置提示图形改变真?NY绘提示图消行动作为真?NY从消行的那一行的第一列开始为空数据NY绘白色;相当于清除色彩表格中对应的色彩行+1到移动数据最后一行NY结束1.4 俄罗斯方块中按下键的流程图按下键直接把图形下降到底记下下降图形时的位置()NY消除行并把上面的行数据下移并置清行为true、当前图改变为falseY表格满行满N绘图(清屏)清所有数据游戏结束提示图形变量给当前图形绘图随机生成一个图形交给提示图形变量结束1.5 俄罗斯方块所有绘图工作流
31、程图清除刚才位置的图形,包括清除提示图和当前图当前图形改变开始输出分数绘当前图的现在位置NY绘提示图N重绘表格Y清除所有数据并清屏N提示图形改变真?消行动作为真?Y游戏结束NY结束46图4-1 Protues仿真系统性能测试与功能说明焊接完成后,将电源接通,游戏画面出现后,分别按下左、右、下、旋转等按钮,均能正常在屏幕上做出反应。当方块堆满一行时,方块正确消除,并将分数累计在屏幕右侧,同时消除多行方块时,分数有额外奖励。达到一定分数时,方块下落速度加快,难度提高。当屏幕中方块有触及顶端的时候,游戏结束。附录1:C语言程序#include #define uchar unsigned char
32、#define uint unsigned int#define DOWNTIME 30#define MAXHANG 20#define MAXLIE 16#define MAXPIX 3#define PUSHON 50#define LCD P2#define EN P3_0#define RW P3_1#define RS P3_2#define CS1 P3_3#define CS2 P3_4#define KEYLEFT P3_5#define KEYDOWN P3_6#define KEYRIGH P3_7#define KEYROTATION P1_0uchar gkey=0x
33、ff,keystate=0,t0ms1=0,t0ms=0,downtimegap=0;uchar miao=0,fen=0;uchar downok;bit keyflag,timeupdate,fashionupdate;uchar idata cubeMapMAXHANG2;typedef struct uchar code * box; uchar cube : 4; uchar state : 4; char row; char column; block;block this;uint score=0;uchar speed=1;uchar code bittable8=1,2,4,
34、8,0x10,0x20,0x40,0x80;uchar code cube=/* */0,4,0xe,0, 0,2,6,2, 0,7,2,0, 4,6,4,0,/* */0,8,0xe,0, 0,4,4,0xc, 0,0,0xe,2, 0,6,4,4,/* */0,0xe,8,0, 0,4,4,6, 0,1,7,0, 6,2,2,0,/* */0,0xc,6,0, 0,2,6,4, 0,6,3,0, 2,6,4,0,/* */0,6,0xc,0, 0,4,6,2, 0,3,6,0, 4,6,2,0,/* */0,0xf,0,0, 4,4,4,4, 0,0,0xf,0, 2,2,2,2,/* *
35、/0,6,6,0, 0,6,6,0, 0,6,6,0, 0,6,6,0; uchar code asii= 0x3E,0x51,0x49,0x45,0x3E, / -0- 0x00,0x42,0x7F,0x40,0x00, / -1- 0x62,0x51,0x49,0x49,0x46, / -2- 0x21,0x41,0x49,0x4D,0x33, / -3- 0x18,0x14,0x12,0x7F,0x10, / -4- 0x27,0x45,0x45,0x45,0x39, / -5- 0x3C,0x4A,0x49,0x49,0x31, / -6- 0x01,0x71,0x09,0x05,0x
36、03, / -7- 0x36,0x49,0x49,0x49,0x36, / -8- 0x46,0x49,0x49,0x29,0x1E, / -9- 0x00,0x36,0x36,0x00,0x00, / -:-10/next 0x7F,0x04,0x08,0x10,0x7F, / -N-11 0x7F,0x49,0x49,0x49,0x41, / -E-12 0x63,0x14,0x08,0x14,0x63, / -X-13 0x01,0x01,0x7F,0x01,0x01, / -T-14/speed 0x26,0x49,0x49,0x49,0x32, / -S-15 0x7F,0x09,0
37、x09,0x09,0x06, / -P-16 0x7F,0x49,0x49,0x49,0x41, / -E-17 0x7F,0x41,0x41,0x41,0x3E, / -D-18/score 0x3E,0x41,0x41,0x41,0x22, / -C-19 0x3E,0x41,0x41,0x41,0x3E, / -O-20 0x7F,0x09,0x19,0x29,0x46, / -R-21 0x00,0x00,0x00,0x00,0x00, / - -22/GAME OVER 0x3E,0x41,0x51,0x51,0x72, / -G-23 0x7C,0x12,0x11,0x12,0x7
38、C, / -A-24 0x7F,0x02,0x0C,0x02,0x7F, / -M-25 0x1F,0x20,0x40,0x20,0x1F, / -V-26/TIME/ 0x00,0x41,0x7F,0x41,0x00 / -I-27;/void lcdCmd(uchar cmd) bit ea; ea=EA; EA=0; EN=0; RW=0; RS=0; LCD=cmd; EN=1; EN=1; EN=0; EA=ea;/-void lcdWriteByte(uchar ch) EN=0; RS=1; RW=0; LCD=ch; EN=1; EN=1; EN=0;/-void lcdSet
39、Page(uchar page) page &=0x7; page +=0xb8; lcdCmd(page);/-void lcdSetColumn(uchar column) column &=0x3f; column +=0x40; lcdCmd(column);/-/character fron=5*8void lcdPlayChar(uchar index,uchar page,uchar colume) uchar i,temp; uint p; p=5*index; for(i=colume;icolume+5;i+) if(i64) CS1=1; CS2=0; temp=i; e
40、lse CS1=0; CS2=1; temp=i-64; lcdSetPage(page);lcdSetColumn(temp);lcdWriteByte(asiip+); /-/rectangle(3,0,50,60)void rectangle(void) uchar i,page; CS1=1; CS2=0; lcdSetPage(0); lcdSetColumn(2); EN=0; RS=1; RW=0; LCD=0xff; EN=1; EN=1; EN=0; for(i=3;i51;i+) EN=0; RS=1; RW=0; LCD=0x1; EN=1; EN=1; EN=0; EN=0; RS=1; RW=0; LCD=0xff; EN=1; EN=1;