2

帖子

0

TA的资源

一粒金砂(初级)

101
 
好!!!
此帖出自51单片机论坛
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

102
 
写的非常详细啊,不管是进阶还是从没有基础开始学习都是非常合适的,大学学了这么课程没有好好学啊,现在用这个补一下吧
此帖出自51单片机论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

103
 
学习一下
此帖出自51单片机论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

104
 
大师来的
此帖出自51单片机论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

105
 
谢谢老师分享
此帖出自51单片机论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

106
 
马克,感谢分享
此帖出自51单片机论坛
 
 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

107
 
亲,我很早就看到过你的作品,没想到又在这里看到了,很牛,
此帖出自51单片机论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(初级)

108
 
资料贡献这么多,精神难能可贵,点赞
此帖出自51单片机论坛
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

109
 
感谢楼主分享!
此帖出自51单片机论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(初级)

110
 
谢谢楼主分享这些很实用的东西,mark一下,慢慢的仔细学习一下。都是好东西啊!
此帖出自51单片机论坛
 
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

111
 
本帖最后由 吴鉴鹰. 于 2015-3-9 14:15 编辑

40、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(六)——完整序讲解

当年吴鉴鹰还是很小的时候,有一种掌上游戏机,里面有一款游戏叫做俄罗斯方块,那时的我们只是简单的按照游戏规则进行“堆积木”,而其中的原理却很少有人去思考,毕竟当时的我们都还很年幼。我相信大家一定见识过不同种类的俄罗斯方块吧!

         基于单片机课程设计的机会,我们这个小组将使用51单片机和12864的组合,来实现比较简单的俄罗斯方块设计。 此次设计初期是在keil和proteus联合仿真中进行,C51编程!


      游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。电脑对游戏的贡献有目共睹,现在摸过电脑的人很少有没玩过电脑游戏的,喜欢游戏的人也很少有不玩电脑的。



      俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。


究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。



         对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在"联众俄罗斯方块"中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。




俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏, 深受广大玩家喜爱。这个游戏有的简单, 有的复杂, 但其根本原理是一样的都是对运动的方块进行组合, 来训练玩家的反应能力。本文利用单片机进行俄罗斯方块设计,采用C51语言进行编程


现今国内外的俄罗斯方块游戏设计主要有基于PC机上Windows平台的俄罗斯方块游戏、基于手机平台的智能俄罗斯方块游戏以及基于单片机平台的俄罗斯方块游戏等。


前两种属于高端游机,性能优越,但成本高,而且计算机编程已不是新命题,VB、VC、Delphi版本的俄罗斯方块游戏都有发布[9]。

从学术角度来看,针对俄罗斯方块游戏的开发,国内外也有不少学者展开过研究,比如Niko将进化算法引入到俄罗斯方块中并验证了其有效性,Hoogeboom探讨了俄罗斯方块游戏的构造问题,王宇等针对存在于俄罗斯方块中的两个数学问题提出解决方案,高凌琴探讨游戏功能要求、数据结构、图形旋转、坐标变换等关键技术,胡代弟在SPCE061A单片机实现了俄罗斯方块游戏[10]。


综上,国内外的研究多着重于游戏数学原理的讨论,也有部分文献涉及游戏的具体实现,但多是在Windows操作系统下实现的,在单片机平台下的开发俄罗斯方块游戏鲜少有文献刊载。而单片机由于具有体积小、性能突出、价格低廉等特点,应用领域不断扩大,除了工业控制、智能化仪表、家用电器外,在智能化高档电子玩具产品也大量采用单片机芯片作为核心控制部件。曾经80年代非常流行的掌上游戏机便是单片机在电子玩具中的应用之一,其中的俄罗斯方块游戏现已被我们所熟知。




本文探讨基于8051单片机硬件平台和RTX51 Tiny多任务实时操作系统的俄罗斯方块游戏的设计与实现,将理论与实践相结合。其主要目标是再现经典的俄罗斯方块游戏,并在此基础上实现双人单机对战游戏模式,以丰富产品功能,增强游戏的趣味性。


1 引言
大家都知道!俄罗斯方块游戏是一个古老而著名的益智游戏。它的知名度迎来了无数程序员青睐。旋转算法是该游戏实现的一个关键技术,现有的大多数算法都是以数组为基本数据结构来实现方块的旋转。吴鉴鹰本文探讨了俄罗斯方块的另一种实现方式,即尽量不用或着是少用数组的概念,而是用坐标来取代。并重点探讨一种算法叫做旋转算法。

2 程序基础
基块是本程序的最基本单位。程序的实现都是通过对基块的操作实现的。基块为一个小正方形,其边长可设为bs(basesize)。而bs 就是本程序的粒度大小。设正方形的中心代表整个方块。设游戏区为一个坐标区,则可通过一个坐标(X,Y)就可以来定位基块,这里的坐标就是基块的中心坐标。由于基块是正方形的,又一般画图函数都是以左上和右下定位图形,所以换算出左上角坐标(X-1/2*bs,Y+1/2*bs)和右下角坐标(X+1/2*bs,Y-1/2*bs)就可以画出基块。因而定义一个接受X,Y 值的函数就可实现基块的定位及绘图。俄罗斯方块的7 类方块都可以由基块组合而成,当然开发更多更具创意的方块也就比较容易了。
下面讨论程序的两个重要概念。定义2.1 绝对坐标系为上文提到的游戏区,坐标原点和XY 轴方向都是固定的。它在整个游戏过程中为基块提供确切的坐标。
定义2.2 相对坐标系。它的引入是为了简化旋转算法的实现。从下文旋转算法可知,只要将该坐标系的原点和XY 轴方向改变,就可实现方块的旋转。故相对坐
标系的坐标原点,XY 轴方向都是可以改变的。该类坐标系原点逻辑原点坐标为O(其在程序中透明),故实现时主要使用它的实际原点坐标(该原点在绝对坐标系中的坐标)。现假设其实际原点坐标为(X,Y),设在该相对坐标系内的一点坐标为(x,y),则该点的绝对坐标为(X+x,Y+y)。
图1 俄罗斯游戏中的7 类方块
首先为了说明的方便将7 类方块编号如图1 所示。

                       图1
由于5 号方块的旋转只有一种状态,为了提高程序效率,
将其单独分为一类。其余方块另为一类。
现在通过实现俄罗斯方块的移动来看看上述设置
是如何运作的。现假设要移动的方块为田字类型。为其建立一个相对坐标系,设其原点实际坐标为 ,将 , 值及方块的类型传递到一个处理函数。该函数根据坐标原点,方块类型,计算出组成该方块的四个基块的中心坐标,再将该四个坐标分别传递给四个基块处理函数,这样便可画出该类型的方块。现将方块向右移动。就是整个相对坐标系向右移动一个bs 的距离,即原点实际坐标变为(X+1,Y),再按刚才的方法处理就可画出移动后的方块。至于前一个方块,可以通过设置的
NOTXOR 绘图模式,再重绘前一个方块来实现。这样
7 类方块的左移,右移,下移便可简单的实现了。下面
讨论7 类方块的旋转算法。

3 旋转算法的实现
旋转算法是游戏实现的一个关键技术,下面就讨论
俄罗斯方块旋转算法的实现。
五号方块只有一种状态,所以,旋转函数收到5 号
方块时,不需做任何处理就可退出函数。是这7 类中最简单的一种类型。
其他方块的旋转要分三步,第一步,将它们所在的
坐标系逆时针旋转90°,第二步,将坐标原点向右偏移
一定的距离,使整个方块在绝对坐标系里的位置保持不
变。第三步,将旋转后的方块画出后,再将相对坐标原
点移回到原来的位置。

第一步的实现,主要使用坐标旋转公式
xl=cos(angle)*x-sin(angle)*y;yl=cos(angle)*y+sin(angle)
*x;
由于angle=90°,故xl=-y,yl=x。则处理函数将原
坐标的x 轴作为旋转后的y 轴,原坐标的-y 做为旋转后
x 轴坐标。
第二步的实现,先计算出旋转后该方块4 个坐标 分
量的绝对值的最大值减1 作为原坐标向右的偏移量(减
1 是因为坐标原点没有旋转)。这样处理函数通过坐标原点的值和转变后的坐标就可以画出旋转后方块的形状。
第三步,只需将坐标原点向左偏移刚才向右的偏移量即可。
每次旋转都按相同的操作执行,其中第三步的是为了下次旋转作准备。
下面通过旋转1 号方块来验证该算法。

初始状态第一步:坐标系逆时针旋转90°第二步:
将坐标原点向右偏移
第三步,将旋转后的方块画出后,再将相对坐标



原点再移回原来的位置
      图2 旋转算法的实现步骤图
当方块处于初始状态时,其相对坐标为(0,0)(, 1,0),
(2,0)(, 0,1),设其原点坐标为(1,1),则绝对坐标为(1,1),
(2,1),(3,1),(1,2)。第一步后,坐标变为(0,0),(0,1),
(0,2)(, -1,0),向右偏移量为2-1=1,原点坐标变为(2,1),
(2,2),(2,3),(1,1),它就是旋转后方块的绝对坐标。
再把这四个坐标分别传递到基块处理函数中,旋转后的
方块就可以画出。最后,将坐标原点变为原来的(1,1),
准备下次的旋转。
以上就是方块的旋转算法。

4 小结
本文讨论了使用坐标的转换来实现俄罗斯方块游戏的重要算法——旋转算法。将俄罗斯方块分解成四个的独立基块,由于基块可用坐标简单的定位,从而可实现
方块的定位。故方块就可用四个坐标来简化。从而方块的旋转就可以通过坐标轴的旋转来实现。

5 完整程序
  1. /******************************************************
  2. **作品:LCD12864俄罗斯方块设计                                                           
  3. **申明:转载请标明作品来源 知识产权归作者本人所有!
  4. ** 这一讲的主要内容:  LCD12664液晶显示原理                                                                                       
  5. ** 功能描述:  对吴鉴鹰俄罗斯方块设计的显示
  6. ** 输 入:
  7. ** 液晶:Proteus元件库—AMPIRE128X64(无字库)         
  8. ** 内容:LCD12864俄罗斯方块设计      
  9. ** 输 出:
  10. **         
  11. ** 全局变量:
  12. ** 调用模块:
  13. **
  14. ** 作 者:    吴鉴鹰
  15. ** 日 期:     14.05.16
  16. **作者所属单位:鉴鹰电子工作室
  17. **交流QQ群: 第一群: 332164870  第二群:194314772   联系QQ:1123942529
  18. **申明:转载请标明作品来源 知识产权归作者吴鉴鹰所有!

  19. 备注:有什么错误的地方,欢迎各大读者指正

  20. O(∩_∩)O~
  21. *******************************************************/
  22. #include <at89x51.h>
  23. #include <intrins.h>
  24. #include<stdlib.h>
  25. #include<math.h>
  26. //#include "12864.h"
  27. //#include "zifu.h"
  28. #define uchar unsigned char
  29. #define uint unsigned int           //宏义
  30. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  31. uchar k,direction;
  32. bit flag;
  33. bit flag5=0;                           //flag5是外部中断1的标志位 flag1是步进标志
  34. uchar p,dengji;               //定时次数
  35. bit flag1=0;
  36. //systemtime realtime;
  37. bit first=1;        

  38. sbit LCD_E_OUT=P2^0;
  39. sbit LCD_RW_OUT=P2^1;
  40. sbit LCD_RS_OUT=P2^2;
  41. sbit LCD_CS2_OUT=P2^3;
  42. sbit LCD_CS1_OUT=P2^4;        

  43. #define LCD_12864_DATA  P0        

  44. uchar code Num0[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};/*"0",0*/
  45. uchar code Num1[]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};/*"1",0*/
  46. uchar code Num2[]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};/*"2",0*/
  47. uchar code Num3[]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};/*"3",0*/
  48. uchar code Num4[]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};/*"4",0*/
  49. uchar code Num5[]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*"5",0*/
  50. uchar code Num6[]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};/*"6",0*/
  51. uchar code Num7[]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};/*"7",0*/
  52. uchar code Num8[]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};/*"8",0*/
  53. uchar code Num9[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};/*"9",0*/

  54. uchar code Game_Over[]=
  55. {
  56. 0x00,0x20,0x44,0x08,0x20,0xE0,0x92,0x94,0x10,0x28,0xAE,0x68,0x24,0x04,0x00,0x00,
  57. 0x00,0x0C,0x03,0x04,0x02,0x19,0x0C,0x03,0x02,0x12,0x22,0x1F,0x01,0x01,0x01,0x00,/*"游",0*/
  58. 0x00,0x20,0xA0,0x90,0x10,0xF0,0x00,0x40,0x7F,0xC0,0x20,0x24,0x88,0x00,0x00,0x00,
  59. 0x10,0x08,0x04,0x02,0x01,0x02,0x14,0x10,0x08,0x05,0x06,0x09,0x10,0x20,0x38,0x00,/*"戏",1*/
  60. 0x00,0x60,0x50,0xCC,0x40,0x30,0x40,0x40,0x40,0xFE,0x20,0x20,0x20,0x20,0x00,0x00,
  61. 0x00,0x12,0x13,0x0A,0x09,0x05,0x00,0x3A,0x2A,0x25,0x25,0x15,0x1D,0x00,0x00,0x00,/*"结",2*/
  62. 0x00,0x00,0x00,0x60,0xA8,0xA8,0xA8,0xFF,0x94,0x54,0x70,0x00,0x00,0x00,0x00,0x00,
  63. 0x10,0x10,0x08,0x08,0x04,0x02,0x01,0x7F,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x00 /*"束",3*/
  64. };

  65. uchar code Per_Cal_Li[]=
  66. {0x00,0x02,0x02,0x02,0x02,0x82,0x7E,0x22,0x22,0x22,0x22,0xF2,0x22,0x02,0x02,0x00,
  67. 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x20,0x60,0x20,0x1F,0x00,0x00,0x00,0x00,/*"万",0*/

  68. 0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
  69. 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*"年",1*/

  70. 0x00,0x00,0xFE,0x02,0x22,0x22,0x22,0x22,0xFA,0x22,0x22,0x22,0xE2,0x02,0x02,0x00,
  71. 0x40,0x30,0x0F,0x00,0x40,0x20,0x18,0x06,0x01,0x00,0x20,0x60,0x3F,0x00,0x00,0x00};/*"历",2*/


  72. uchar code Tan[]=
  73. {
  74. 0x20,0x20,0x10,0x90,0xA8,0xA4,0xAA,0xB1,0xA2,0xE4,0xA8,0x88,0x10,0x30,0x10,0x00,
  75. 0x00,0x00,0x80,0x9F,0x40,0x20,0x10,0x0E,0x10,0x20,0x60,0xDF,0x00,0x00,0x00,0x00,/*"贪",0*/
  76. };
  77. uchar code Chi[]=
  78. {
  79. 0x00,0xFC,0x04,0x04,0xFC,0x20,0x58,0x4F,0x4A,0x48,0x48,0xC8,0x08,0x08,0x08,0x00,
  80. 0x00,0x0F,0x02,0x02,0x07,0x00,0x30,0x48,0x44,0x42,0x41,0x40,0x40,0x40,0x70,0x00/*"吃",1*/
  81. };
  82. uchar code Snake[]=
  83. {
  84. 0x00,0xF0,0x10,0xFF,0x10,0xF0,0x20,0x18,0xE8,0x09,0x0E,0x0A,0xA8,0x18,0x08,0x00,
  85. 0x20,0x23,0x21,0x1F,0x11,0x3B,0x10,0x00,0x3F,0x42,0x41,0x41,0x40,0x38,0x00,0x00/*"蛇",2*/
  86. };

  87. uchar code RussiaBOX[]=
  88. {
  89. 0x40,0x20,0xF8,0x17,0x12,0x14,0xFC,0x12,0x92,0x10,0xFF,0x10,0x12,0xDC,0x90,0x00,
  90. 0x00,0x00,0x7F,0x00,0x24,0x62,0x3F,0x01,0x20,0x10,0x0B,0x0C,0x33,0x41,0x30,0x00,/*"俄",0*/

  91. 0x00,0x00,0x7E,0x22,0x22,0x22,0xFE,0xA2,0xA2,0xBE,0xA2,0xA2,0xA2,0xBE,0x00,0x00,
  92. 0x80,0x88,0x88,0x84,0x42,0x43,0x25,0x28,0x10,0x10,0x08,0x04,0x03,0x00,0x00,0x00,/*"罗",1*/

  93. 0x04,0x04,0xFF,0x94,0x94,0x94,0xFF,0x04,0x00,0xFE,0x22,0x22,0xE1,0x21,0x20,0x00,
  94. 0x44,0x24,0x37,0x04,0x04,0x14,0x67,0x44,0x30,0x0F,0x00,0x00,0xFF,0x00,0x00,0x00,/*"斯",2*/

  95. /*--  文字:  方  --*/
  96. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  97. 0x00,0x00,0x08,0x08,0x08,0xF8,0x89,0x8E,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,
  98. 0x00,0x80,0x40,0x20,0x18,0x07,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,


  99. 0x10,0x10,0xFF,0x10,0x10,0x00,0x08,0x08,0xFF,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,
  100. 0x08,0x18,0x0F,0x04,0x85,0x41,0x31,0x0D,0x03,0x05,0x09,0x11,0x31,0x61,0x21,0x00
  101. };

  102. uchar code Model[]=
  103. {
  104. 0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x11,
  105. 0x11,0x12,0x10,0x13,0x01,0x31,0x11,0x21,0x11,0x12,0x10,0x13,0x01,0x31,0x11,0x21,
  106. 0x01,0x21,0x10,0x11,0x11,0x21,0x10,0x12,0x00,0x20,0x10,0x11,0x01,0x11,0x10,0x12,
  107. 0x10,0x21,0x20,0x22,0x01,0x21,0x20,0x11,0x11,0x22,0x10,0x12,0x10,0x30,0x20,0x11,
  108. 0x11,0x20,0x10,0x12,0x00,0x20,0x10,0x21,0x12,0x21,0x20,0x22,0x11,0x31,0x10,0x21,
  109. 0x11,0x21,0x10,0x22,0x01,0x20,0x10,0x11,0x11,0x21,0x10,0x22,0x01,0x20,0x10,0x11,
  110. 0x11,0x21,0x20,0x12,0x10,0x31,0x20,0x21,0x11,0x21,0x20,0x12,0x10,0x31,0x20,0x21
  111. };

  112. uchar code WJYZZ[]=
  113. {
  114. /*--  文字:  吴  --*/
  115. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  116. 0x00,0x00,0x80,0x9E,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x9E,0x80,0x00,0x00,0x00,
  117. 0x84,0x84,0x44,0x44,0x24,0x14,0x0C,0x07,0x0C,0x14,0x24,0x44,0x44,0x84,0x84,0x00,

  118. /*--  文字:  鉴  --*/
  119. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  120. 0x00,0x00,0x3E,0x00,0x80,0xBF,0x40,0x20,0x58,0x87,0x84,0x0C,0x34,0x04,0x00,0x00,
  121. 0x02,0x42,0x49,0x49,0x5A,0x6A,0x4A,0x7E,0x4A,0x6A,0x5A,0x49,0x49,0x42,0x02,0x00,

  122. /*--  文字:  鹰  --*/
  123. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  124. 0x00,0x00,0xFE,0x22,0x12,0xFA,0x26,0x12,0xFB,0xAE,0xAA,0xFE,0xAA,0xAA,0x02,0x00,
  125. 0x40,0x30,0x0F,0x40,0x40,0x5E,0x52,0x53,0x56,0x52,0x1A,0x56,0x90,0x70,0x00,0x00,

  126. /*--  文字:  制  --*/
  127. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  128. 0x40,0x50,0x4E,0x48,0x48,0xFF,0x48,0x48,0x48,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00,
  129. 0x00,0x00,0x3E,0x02,0x02,0xFF,0x12,0x22,0x1E,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,

  130. /*--  文字:  作  --*/
  131. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  132. 0x00,0x80,0x60,0xF8,0x07,0x40,0x30,0x0F,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0x00,
  133. 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x00,0x00,


  134. };

  135. uchar code WJYJ[]=
  136. {
  137. /*--  文字:  鉴  --*/
  138. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  139. 0x00,0x00,0x3E,0x00,0x80,0xBF,0x40,0x20,0x58,0x87,0x84,0x0C,0x34,0x04,0x00,0x00,
  140. 0x02,0x42,0x49,0x49,0x5A,0x6A,0x4A,0x7E,0x4A,0x6A,0x5A,0x49,0x49,0x42,0x02,0x00,
  141. };

  142. uchar code WJYY[]=
  143. {
  144. /*--  文字:  鹰  --*/
  145. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  146. 0x00,0x00,0xFE,0x22,0x12,0xFA,0x26,0x12,0xFB,0xAE,0xAA,0xFE,0xAA,0xAA,0x02,0x00,
  147. 0x40,0x30,0x0F,0x40,0x40,0x5E,0x52,0x53,0x56,0x52,0x1A,0x56,0x90,0x70,0x00,0x00,
  148. };

  149. uchar code WJYZH[]=
  150. {
  151. /*--  文字:  制  --*/
  152. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  153. 0x40,0x50,0x4E,0x48,0x48,0xFF,0x48,0x48,0x48,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00,
  154. 0x00,0x00,0x3E,0x02,0x02,0xFF,0x12,0x22,0x1E,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,
  155. };


  156. /*uchar code WJYZZ[]=
  157. {
  158. /*--  文字:  作  --*/
  159. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  160. /*0x00,0x80,0x60,0xF8,0x07,0x40,0x30,0x0F,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0x00,
  161. 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x00,0x00,
  162. };
  163. */

  164. uchar code WWJJYYJ[]=
  165. {
  166. /*--  文字:  鉴  --*/
  167. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  168. 0x00,0x00,0x3E,0x00,0x80,0xBF,0x40,0x20,0x58,0x87,0x84,0x0C,0x34,0x04,0x00,0x00,
  169. 0x02,0x42,0x49,0x49,0x5A,0x6A,0x4A,0x7E,0x4A,0x6A,0x5A,0x49,0x49,0x42,0x02,0x00,
  170. };

  171. uchar code WWJJYYY[]=
  172. {
  173. /*--  文字:  鹰  --*/
  174. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  175. 0x00,0x00,0xFE,0x22,0x12,0xFA,0x26,0x12,0xFB,0xAE,0xAA,0xFE,0xAA,0xAA,0x02,0x00,
  176. 0x40,0x30,0x0F,0x40,0x40,0x5E,0x52,0x53,0x56,0x52,0x1A,0x56,0x90,0x70,0x00,0x00,
  177. };

  178. uchar code WWJJYYD[]=
  179. {
  180. /*--  文字:  电  --*/
  181. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  182. 0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
  183. 0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,
  184. };

  185. uchar code WWJJYYZ[]=
  186. {
  187. /*--  文字:  子  --*/
  188. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  189. 0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,
  190. 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  191. };


  192. uchar code WWJJYYG[]=
  193. {
  194. /*--  文字:  工  --*/
  195. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  196. 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,
  197. 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  198. };
  199. uchar code WWJJYYZ1[]=
  200. {
  201. /*--  文字:  作  --*/
  202. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  203. 0x00,0x80,0x60,0xF8,0x07,0x40,0x30,0x0F,0xF8,0x88,0x88,0x88,0x88,0x08,0x08,0x00,
  204. 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x00,0x00,
  205. };

  206. uchar code WWJJYYS[]=
  207. {
  208. /*--  文字:  室  --*/
  209. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  210. 0x10,0x0C,0x24,0x24,0xA4,0x64,0x25,0x26,0x24,0x24,0xA4,0x24,0x24,0x14,0x0C,0x00,
  211. 0x40,0x40,0x48,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x4B,0x48,0x40,0x40,0x00,
  212. };


  213. uchar code WWJJYYW[]=
  214. {
  215. /*--  调入了一幅图像:C:\Users\Administrator\Desktop\624814_225502035_2.bmp  --*/
  216. /*--  宽度x高度=16x16  --*/
  217. 0xE0,0x18,0x0C,0x06,0x53,0xE9,0x49,0x01,0x01,0x49,0xE9,0x53,0x06,0x0C,0x38,0xF0,
  218. 0x0F,0x18,0x30,0x60,0x46,0xCC,0x98,0x98,0x98,0x98,0xCC,0xC6,0x60,0x30,0x18,0x0F,
  219. };

  220. uchar code WWJJYYWXTP[]=
  221. {
  222. /*--  调入了一幅图像:C:\Users\Administrator\Desktop\624814_225502035_2.bmp  --*/
  223. /*--  宽度x高度=16x16  --*/
  224. 0xF0,0x18,0x0E,0x06,0x43,0xE9,0x49,0x01,0x01,0x49,0xE9,0x43,0x06,0x0C,0x38,0xF0,
  225. 0x0F,0x18,0x37,0x6F,0x5E,0xDC,0xB8,0xB8,0xB8,0xB8,0xDC,0xDE,0x6F,0x37,0x18,0x0F,
  226. };

  227. /******************************************************************
  228. **        标题:鉴鹰电子欢乐多啊
  229. **  功能:数组
  230. *****************************************************************/

  231. uchar code WWJJYYHH[] =
  232. {
  233. /*--  文字:  欢  --*/
  234. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  235. 0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
  236. 0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,
  237. };

  238. uchar code WWJJYYLE[]=
  239. {
  240. /*--  文字:  乐  --*/
  241. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  242. 0x00,0x00,0xE0,0x9C,0x84,0x84,0x84,0xF4,0x82,0x82,0x83,0x82,0x80,0x80,0x00,0x00,
  243. 0x00,0x20,0x10,0x08,0x06,0x40,0x80,0x7F,0x00,0x00,0x02,0x04,0x08,0x30,0x00,0x00,
  244. };

  245. uchar code WWJJYYDUO[]=
  246. {
  247. /*--  文字:  多  --*/
  248. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  249. 0x00,0x00,0x10,0x10,0x98,0xA4,0x47,0x44,0xA4,0x54,0x0C,0x04,0x00,0x00,0x00,0x00,
  250. 0x00,0x81,0x89,0x89,0x44,0x44,0x4A,0x31,0x21,0x11,0x09,0x05,0x03,0x00,0x00,0x00,
  251. };

  252. uchar code WWJJYYAA[]=
  253. {
  254. /*--  文字:  啊  --*/
  255. /*--  楷体_GB231212;  此字体下对应的点阵为:宽x高=16x16   --*/
  256. 0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,
  257. 0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,
  258. };

  259. uchar code Start_picture[]={/*--  调入了一幅图像:C:\Users\Administrator\Desktop\7308055_142022128173_2.bmp  --*/
  260. /*--  宽度x高度=128x64  --*/
  261. 0xFF,0x7F,0x7F,0xFF,0xF7,0xC3,0x87,0x07,0x0F,0x1F,0x1F,0x3F,0x7F,0x7F,0xFF,0xFF,
  262. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  263. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  264. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  265. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  266. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  267. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,
  268. 0xFF,0x7F,0x7F,0x3F,0x1F,0x1F,0x0F,0x87,0x87,0xC3,0xE1,0x7F,0x7F,0x7F,0xBF,0xFF,
  269. 0xFF,0xFF,0xF6,0xF6,0xA4,0xA4,0xA5,0xA1,0x81,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
  270. 0x01,0x01,0x03,0x03,0x00,0x03,0x07,0x07,0x0F,0x1F,0x0F,0x0F,0x1F,0x1F,0x3F,0x3F,
  271. 0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  272. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  273. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  274. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x3F,0x3F,0x3F,
  275. 0x3F,0x1F,0x1F,0x0F,0x0F,0x07,0x0F,0x0F,0x07,0x03,0x01,0x00,0x02,0x01,0x01,0x00,
  276. 0x00,0x00,0x00,0x00,0x00,0x81,0x81,0xC0,0xD0,0xD4,0xD2,0xD2,0xFB,0xFB,0xFB,0xFF,
  277. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF8,0xF0,
  278. 0xF0,0xE0,0xC0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  279. 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x07,0x07,0x0F,0x0F,0x1F,0x1F,0x3F,
  280. 0x7F,0x7F,0xFF,0xFF,0xFF,0xCF,0xEF,0xEF,0xC7,0x47,0x07,0x07,0x17,0x07,0x07,0x07,
  281. 0x0F,0x1F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x3F,0x1F,0x0F,
  282. 0x07,0x03,0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  283. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xE0,0xF0,0xF0,
  284. 0xF0,0xF8,0xFC,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  285. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  286. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFC,0xFC,0xF8,0xF0,0xF0,
  287. 0xF0,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
  288. 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  289. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  290. 0x00,0x80,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0x80,0xA0,0xE0,0xE0,0xE0,0xE0,0xF0,
  291. 0xF0,0xF8,0xF8,0xFC,0xFC,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  292. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  293. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  294. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  295. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,
  296. 0xFE,0xFE,0xFE,0xDC,0xDE,0xEC,0x8C,0xEC,0xE6,0x80,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,
  297. 0xE0,0xE0,0xE0,0xB0,0xD8,0xE0,0x80,0x8E,0xEC,0xDC,0xFE,0xFC,0xFE,0xFE,0xFE,0xFE,
  298. 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  299. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  300. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  301. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0xFF,0x3F,0x3F,0xFF,0x3F,
  302. 0x3F,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
  303. 0xBF,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,
  304. 0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,
  305. 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  306. 0xFF,0xFF,0xFF,0x3F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
  307. 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F,0xBF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  308. 0xFF,0xFF,0x7F,0x3F,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  309. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x98,0xD8,0x9F,0x88,0xA0,0x31,0x24,
  310. 0xAE,0x88,0xD2,0x96,0x9E,0xBE,0xFF,0xFF,0xFF,0xFF,0x00,0xFB,0xE1,0x20,0x39,0x20,
  311. 0x40,0x02,0xA0,0x20,0x22,0xA2,0xEE,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x76,0x76,0x00,
  312. 0x00,0x76,0x76,0x76,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,
  313. 0xEF,0x03,0x01,0xEC,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFE,0xF2,0x26,0x06,
  314. 0x00,0x76,0xF1,0x70,0x06,0x06,0x36,0xF0,0xF8,0xFE,0xFF,0xFF,0xFF,0xFF,0xE3,0x60,
  315. 0x28,0x2F,0xAF,0x00,0x00,0xEF,0xAF,0x2F,0x6F,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xCD,
  316. 0x4C,0x6E,0x2C,0x81,0x53,0x03,0x41,0xCC,0x5E,0x1F,0x9F,0xDF,0xFF,0xFF,0xFF,0xFF,
  317. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFB,0xFA,0xF8,0xF8,0xFA,0xF8,0xF8,
  318. 0xFA,0xF8,0xF8,0xFA,0xFB,0xFB,0xFF,0xFF,0xFF,0xF8,0xF8,0xFB,0xFB,0xFA,0xFA,0xFA,
  319. 0xFA,0xFA,0xFA,0xFA,0xF6,0xF8,0xF8,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xF8,
  320. 0xF8,0xFB,0xFB,0xFB,0xFB,0xFB,0xF9,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,
  321. 0xFB,0xF8,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFC,0xFE,0xFF,
  322. 0xFB,0xFA,0xF9,0xFC,0xFE,0xFF,0xFE,0xFC,0xF9,0xFB,0xFF,0xFF,0xFF,0xFD,0xFC,0xFC,
  323. 0xFE,0xFB,0xF3,0xF8,0xF8,0xFF,0xFF,0xFF,0xFE,0xFC,0xFD,0xFF,0xFF,0xFF,0xFF,0xF3,
  324. 0xF3,0xFB,0xFB,0xFB,0xF9,0xF8,0xFC,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

  325. };



  326. /*******************************************************************************************
  327. ** 函数名称:  void Delay_1ms(uint k)
  328. ** 功能描述:  精确延时函数,延时kms                                               
  329. ** 输 入:    uint k需要延时的ms数
  330. **         
  331. **        
  332. ** 输 出:   
  333. **         
  334. ** 全局变量:
  335. ** 调用模块:
  336. **
  337. ** 作 者:    吴鉴鹰
  338. ** 日 期:     14.05.16
  339. ********************************************************************************************/
  340. void Delay_1ms(uint k)
  341. {
  342.   k=k*125;
  343.   while(k--);
  344. }


  345. /*******************************************************************************************
  346. ** 函数名称:  void Chek_busy_12864(void)
  347. ** 功能描述:  12864判忙                                          
  348. ** 输 入:   
  349. **         
  350. **        
  351. ** 输 出:   
  352. **         
  353. ** 全局变量:
  354. ** 调用模块:
  355. **
  356. ** 作 者:    吴鉴鹰
  357. ** 日 期:     14.05.16
  358. ********************************************************************************************/
  359. void Chek_busy_12864(void)
  360. {
  361.   uchar dat;
  362.   EX0=0;
  363.   LCD_RS_OUT=0;       //指令模式
  364.   LCD_RW_OUT=1;       //读数据
  365. do{
  366.    LCD_12864_DATA  =0x00;                         //
  367.    LCD_E_OUT=1;
  368.    dat=LCD_12864_DATA  &0x80;
  369.    LCD_E_OUT=0;
  370.   }while(dat!=0x00);
  371.   EX0=1;
  372. }


  373. /*******************************************************************************************
  374. ** 函数名称:  void Choice_12864_Screen(uchar i);
  375. ** 功能描述:   选屏函数                                         
  376. ** 输 入:    uchar i //i是要写的屏.0是左屏,1是右屏,2是双屏;
  377. **         
  378. **        
  379. ** 输 出:   
  380. **         
  381. ** 全局变量:
  382. ** 调用模块:
  383. **
  384. ** 作 者:    吴鉴鹰
  385. ** 日 期:     14.05.16
  386. ********************************************************************************************/
  387. void Choice_12864_Screen(uchar i)//i是要写的屏.0是左屏,1是右屏,2是双屏;
  388. {                                                 //此处在硬件上运行时i的电平全部与程序相反;
  389.   switch (i)                         //此版本为仿真版;
  390.   {
  391.     case 0: LCD_CS1_OUT=0;LCD_CS2_OUT=1;break;        //比如此处如果要在电路上运行则应该改为CS=1;LCD_CS2_OUT=0;   
  392.     case 1: LCD_CS1_OUT=1;LCD_CS2_OUT=0;break;
  393.         case 2: LCD_CS1_OUT=0;LCD_CS2_OUT=0;break;
  394.         default: break;
  395.   }
  396. }


  397. /*******************************************************************************************
  398. ** 函数名称:  void Cmd_Write_12864(uchar cmd)                //写命令
  399. ** 功能描述:   //写命令函数                                       
  400. ** 输 入:    uchar cmd 要向液晶屏送入的命令
  401. **         
  402. **        
  403. ** 输 出:   
  404. **         
  405. ** 全局变量:
  406. ** 调用模块:
  407. **
  408. ** 作 者:    吴鉴鹰
  409. ** 日 期:     14.05.12
  410. ********************************************************************************************/
  411. void Cmd_Write_12864(uchar cmd)                //写命令
  412. {
  413.   Chek_busy_12864();
  414.   EX0=0;
  415.   LCD_RS_OUT=0;                    //指令模式
  416.   LCD_RW_OUT=0;             //写模式
  417.   LCD_E_OUT=1;
  418.   LCD_12864_DATA  =cmd;
  419.   LCD_E_OUT=0;
  420.   EX0=1;
  421. }

  422. /*******************************************************************************************
  423. ** 函数名称:  void  Dat_Write_12864(uchar dat)
  424. ** 功能描述:   //写数据函数                                         
  425. ** 输 入:    uchar cmd 要向液晶屏送入的命令
  426. **         
  427. **        
  428. ** 输 出:   
  429. **         
  430. ** 全局变量:
  431. ** 调用模块:
  432. **
  433. ** 作 者:    吴鉴鹰
  434. ** 日 期:     14.05.12
  435. ********************************************************************************************/
  436. void  Dat_Write_12864(uchar dat)
  437. {
  438.   Chek_busy_12864();
  439.   EX0=0;
  440.   LCD_RS_OUT=1;
  441.   LCD_RW_OUT=0;
  442.   LCD_E_OUT=1;
  443.   LCD_12864_DATA  =dat;
  444.   LCD_E_OUT=0;
  445.   EX0=1;
  446. }


  447. /*******************************************************************************************
  448. ** 函数名称: void Clear_12864_Screen(void)
  449. ** 功能描述:   清屏函数                                      
  450. ** 输 入:  
  451. **         
  452. **        
  453. ** 输 出:   
  454. **         
  455. ** 全局变量:
  456. ** 调用模块:
  457. **
  458. ** 作 者:    吴鉴鹰
  459. ** 日 期:     14.05.12
  460. ********************************************************************************************/
  461. void Clear_12864_Screen(void)
  462. {
  463.   uchar page,row;
  464.   for(page=0xb8;page<0xc0;page++)
  465.   {
  466.     Cmd_Write_12864(page);
  467.         Cmd_Write_12864(0x40);
  468.         for(row=0;row<64;row++)
  469.          {
  470.            Dat_Write_12864(0x00);          //对12864所有地址全部写零
  471.          }
  472.   }
  473. }


  474. /*******************************************************************************************
  475. ** 函数名称: void Init_12864_Screen(void)
  476. ** 功能描述:   12864初始化函数                                   
  477. ** 输 入:  
  478. **         
  479. **        
  480. ** 输 出:   
  481. **         
  482. ** 全局变量:
  483. ** 调用模块:
  484. **
  485. ** 作 者:    吴鉴鹰
  486. ** 日 期:     14.05.12
  487. ********************************************************************************************/
  488. void Init_12864_Screen(void)
  489. {
  490.   Chek_busy_12864();
  491.   Cmd_Write_12864(0xc0);          //从第零行开始显示
  492.   Cmd_Write_12864(0x3f);          //LCD显示RAM中的内容
  493. }


  494. /****************************************************************************
  495. ** 函数名称:  void Display_8_point(uchar ch,uchar row,uchar page,uchar *adr)
  496. ** 功能描述:  lcd12864的8X16字符的显示
  497. ** 输 入:    uchar ch,uchar row,uchar page,uchar *p(屏数,列数,页数,还有显示的数组首地址)
  498. **         
  499. **        
  500. ** 输 出:
  501. **         
  502. ** 全局变量:
  503. ** 调用模块:
  504. **
  505. ** 作 者:    吴鉴鹰
  506. ** 作者所在单位:鉴鹰电子工作室
  507. ** 日 期:     14.05.11
  508. ****************************************************************************/  
  509. void Display_8_point(uchar ch,uchar row,uchar page,uchar *adr)
  510. {
  511.   uchar i;
  512.   Choice_12864_Screen(ch);
  513.   page=page<<1;                           //程序中采用的位移运算代替乘法运算,这样可以大大降低处理器的负担
  514.   row=row<<3;
  515.   Cmd_Write_12864(row+0x40);
  516.   Cmd_Write_12864(page+0xb8);
  517.   for(i=0;i<8;i++)
  518.   {
  519.     Dat_Write_12864(*(adr+i));
  520.   }
  521.   Cmd_Write_12864(row+0x40);
  522.   Cmd_Write_12864(page+0xb9);
  523.   for(i=8;i<16;i++)
  524.   {
  525.     Dat_Write_12864(*(adr+i));
  526.   }
  527. }


  528. /****************************************************************************
  529. ** 函数名称:  void Display_8_point(uchar ch,uchar row,uchar page,uchar *adr)
  530. ** 功能描述:  lcd12864的16X16显示字符的显示
  531. ** 输 入:    uchar ch,uchar row,uchar page,uchar *p(屏数,列数,页数,还有显示的数组首地址)
  532. **         
  533. **        
  534. ** 输 出:
  535. **         
  536. ** 全局变量:
  537. ** 调用模块:
  538. **
  539. ** 作 者:    吴鉴鹰
  540. ** 作者所在单位:鉴鹰电子工作室
  541. ** 日 期:     14.05.10
  542. ****************************************************************************/
  543. void Display_16_point(uchar ch,uchar row,uchar page,uchar *adr)
  544. {
  545.   uchar i;
  546.   Choice_12864_Screen(ch);
  547.   page=page<<1;                                          
  548.   row=row<<3;
  549.   Cmd_Write_12864(row+0x40);
  550.   Cmd_Write_12864(page+0xb8);
  551.   for(i=0;i<16;i++)
  552.   {
  553.     Dat_Write_12864(*(adr+i));
  554.   }
  555.   Cmd_Write_12864(row+0x40);
  556.   Cmd_Write_12864(page+0xb9);
  557.   for(i=16;i<32;i++)
  558.   {
  559.     Dat_Write_12864(*(adr+i));
  560.   }
  561. }


  562. /****************************************************************************
  563. ** 函数名称:  uchar Lcd_Data_Write(uchar page,uchar arrange)  //page页地址.arrange列地址)
  564. ** 功能描述:  lcd12864的数据发送函数
  565. ** 输 入:    //page页地址.arrange列地址)
  566. **         
  567. **        
  568. ** 输 出:
  569. **         
  570. ** 全局变量:
  571. ** 调用模块:
  572. **
  573. ** 作 者:    吴鉴鹰
  574. ** 作者所在单位:鉴鹰电子工作室
  575. ** 日 期:     14.05.10
  576. ****************************************************************************/
  577. uchar Lcd_Data_Write(uchar page,uchar arrange)  //page页地址.arrange列地址)
  578. {
  579.   uchar dat;
  580.   Chek_busy_12864();
  581.   EA=0;
  582.   Cmd_Write_12864(page+0xb8);
  583.   Cmd_Write_12864(arrange+0x40);
  584.   EX0=0;                                                
  585.   LCD_12864_DATA  =0xff;
  586.   LCD_RW_OUT=1;
  587.   LCD_RS_OUT=1;
  588.   LCD_E_OUT=1;
  589.   LCD_E_OUT=0;                                 //12864读数据时第二次读才有效,第一次读取的值不采集
  590.   LCD_E_OUT=1;
  591.   dat=LCD_12864_DATA  ;
  592.   LCD_E_OUT=0;
  593.   EA=1;
  594.   return(dat);
  595.   //EX0=1;
  596.   
  597.   }

  598. /****************************************************************************
  599. ** 函数名称:  uchar Lcd_Data_Write(uchar page,uchar arrange)  //page页地址.arrange列地址)
  600. ** 功能描述:  反白显示函数
  601. ** 输 入:    uchar ch屏数,uchar arrange列地址,uchar page页地址
  602. **         
  603. **        
  604. ** 输 出:
  605. **         
  606. ** 全局变量:
  607. ** 调用模块:
  608. **
  609. ** 作 者:    吴鉴鹰
  610. ** 作者所在单位:鉴鹰电子工作室
  611. ** 日 期:     14.05.10
  612. ****************************************************************************/
  613. void play16_fb(uchar ch,uchar arrange,uchar page)
  614. {
  615.    uchar i;
  616.    uchar xdata dat_fb[32];
  617.    Choice_12864_Screen(ch);
  618.    for(i=0;i<16;i++)
  619.    {
  620.      dat_fb[i]=~(Lcd_Data_Write((page<<1),((arrange<<3)+i)));
  621.          dat_fb[i+16]=~(Lcd_Data_Write((page<<1)+1,((arrange<<3)+i)));
  622.         }
  623.    Display_16_point(ch,arrange,page,dat_fb);
  624. }

  625. /****************************************************************************
  626. ** 函数名称:  void vertical(uchar y1,uchar y2,uchar x)//y1表示起点,y2表示终点
  627. ** 功能描述:   画竖线的函数
  628. ** 输 入:    y1表示起点,y2表示终点
  629. **         
  630. **        
  631. ** 输 出:
  632. **         
  633. ** 全局变量:
  634. ** 调用模块:
  635. **
  636. ** 作 者:    吴鉴鹰
  637. ** 作者所在单位:鉴鹰电子工作室
  638. ** 日 期:     14.05.10
  639. ****************************************************************************/
  640. void Draw_Vertical_line(uchar y1,uchar y2,uchar x)//y1表示起点,y2表示终点
  641. {
  642.   uchar i,sum=0;
  643.   if(x>63)
  644.    {
  645.      Choice_12864_Screen(1);                                         //y1比y2小,这里给出画竖线的函数而不用画点的方法
  646.      x=x-64;                                                         //是为了减少单片机的处理负担。
  647.    }
  648.    else
  649.    {
  650.      Choice_12864_Screen(0);
  651.    }
  652.   if((y1/8)!=(y2/8))
  653.   {
  654.    for(i=0;i<(8-y1%8);i++)         
  655.    {
  656.       sum=sum|((2<<((y1%8)+i)));
  657.    }
  658.   Cmd_Write_12864(x+0x40);
  659.   Cmd_Write_12864(y1/8+0xb8);
  660.   Dat_Write_12864(sum);
  661.   sum=0;
  662.    for(i=0;i<(y2/8-y1/8-1);i++)
  663.     {
  664.      Cmd_Write_12864(x+0x40);
  665.          Cmd_Write_12864((y1/8)+0xb9+i);
  666.          Dat_Write_12864(0xff);
  667.     }
  668.   for(i=0;i<=(y2%8);i++)
  669.    {
  670.      sum=sum|(2<<i);
  671.    }
  672.    Cmd_Write_12864(x+0x40);
  673.    Cmd_Write_12864(y2/8+0xb8);
  674.    Dat_Write_12864(sum|1);
  675.    sum=0;        
  676. }
  677. else
  678. {
  679.    for(i=0;i<=y2-y1;i++)
  680.     {
  681.           sum=sum|(2<<(i+(y1%8)));
  682.         }
  683.         Cmd_Write_12864(0x40|x);
  684.         Cmd_Write_12864(0xb8|(y1/8));
  685.         Dat_Write_12864(sum);
  686. }
  687. }

  688. /****************************************************************************
  689. ** 函数名称:  void Draw_dot_Hs(uchar x,uchar y)
  690. ** 功能描述:  画点函数
  691. ** 输 入:    uchar x,uchar y 画点的x和y坐标
  692. **         
  693. **        
  694. ** 输 出:
  695. **         
  696. ** 全局变量:
  697. ** 调用模块:
  698. **
  699. ** 作 者:    吴鉴鹰
  700. ** 作者所在单位:鉴鹰电子工作室
  701. ** 日 期:     14.05.10
  702. ****************************************************************************/
  703. /**点的显示**/
  704. void Draw_dot_Hs(uchar x,uchar y)
  705. {
  706.   uchar dat;
  707.   if(x>63)
  708.   {
  709.     Choice_12864_Screen(1);
  710.         x=x-64;
  711.   }
  712.   else
  713.   {
  714.     Choice_12864_Screen(0);
  715.   }
  716.   dat=Lcd_Data_Write(y/8,x);
  717.   Cmd_Write_12864(0x40|x);
  718.   Cmd_Write_12864(0xb8|y/8);
  719.   Dat_Write_12864((1<<(y%8))|dat);
  720. }

  721. /****************************************************************************
  722. ** 函数名称:  Clear_8_Dot(uchar x,uchar y,uchar ch)
  723. ** 功能描述:  清点函数
  724. ** 输 入:    uchar x,uchar y 清点的x和y坐标
  725. **         
  726. **        
  727. ** 输 出:
  728. **         
  729. ** 全局变量:
  730. ** 调用模块:
  731. **
  732. ** 作 者:    吴鉴鹰
  733. ** 作者所在单位:鉴鹰电子工作室
  734. ** 日 期:     14.05.10
  735. ****************************************************************************/                                         
  736. Clear_8_Dot(uchar x,uchar y,uchar ch)
  737. {
  738.   uchar i;
  739.   Choice_12864_Screen(ch);
  740.   Cmd_Write_12864(x*8+0x40);
  741.   Cmd_Write_12864(y+0xb8);
  742.   for(i=0;i<8;i++)
  743.    {
  744.      Dat_Write_12864(0x00);
  745.    }
  746.    Cmd_Write_12864(x*8+0x40);
  747.    Cmd_Write_12864(y+0xb9);
  748.   for(i=0;i<16;i++)
  749.    {
  750.       Dat_Write_12864(0x00);
  751.    }
  752. }

  753. /****************************************************************************
  754. ** 函数名称:  void Change_4_Dot(uchar *x,uchar *y)     //x<24  y<15
  755. ** 功能描述:  4X4个点合为一个
  756. ** 输 入:    uchar *x,uchar *y 合点的首地址
  757. **         
  758. **        
  759. ** 输 出:
  760. **         
  761. ** 全局变量:
  762. ** 调用模块:
  763. **
  764. ** 作 者:    吴鉴鹰
  765. ** 作者所在单位:鉴鹰电子工作室
  766. ** 日 期:     14.05.10
  767. ****************************************************************************/
  768. void Change_4_Dot(uchar *x,uchar *y)     //x<24  y<15
  769. {
  770.   uchar i,m,n;                                           //24和15分别表示游戏的范围
  771.   if(*x<24&&*y<15)                                   //这里的点是个有花色的点而不是一个实心的点
  772.   {
  773.    m=(*x)<<2;
  774.    n=((*y)<<2)+2;
  775.    for(i=0;i<4;i++)
  776.    {
  777.     Draw_dot_Hs(31+m,n+i);
  778.         Draw_dot_Hs(34+m,n+i);
  779.    }
  780.    Draw_dot_Hs(32+m,n);                 
  781.    Draw_dot_Hs(32+m,n+1);
  782.    Draw_dot_Hs(32+m,n+3);
  783.    Draw_dot_Hs(33+m,n);
  784.    Draw_dot_Hs(33+m,n+2);
  785.    Draw_dot_Hs(33+m,n+3);
  786.   }
  787. }


  788. /****************************************************************************
  789. ** 函数名称:  void Change_4_Dot(uchar *x,uchar *y)     //x<24  y<15
  790. ** 功能描述:  4X4个点合为一个
  791. ** 输 入:    uchar *x,uchar *y 合点的首地址
  792. **         
  793. **        
  794. ** 输 出:
  795. **         
  796. ** 全局变量:
  797. ** 调用模块:
  798. **
  799. ** 作 者:    吴鉴鹰
  800. ** 作者所在单位:鉴鹰电子工作室
  801. ** 日 期:     14.05.10
  802. ****************************************************************************/
  803. void Change_4_Dot1(uchar x,uchar y)     //x<24  y<15
  804. {
  805.   
  806.   uchar i,m,n;        
  807.   EA=0;                                                //24和15分别表示游戏的范围
  808.   if(x<24&&y<15)                                   //这里的点是个有花色的点而不是一个实心的点
  809.   {
  810.    m=(x)<<2;
  811.    n=(y<<2)+2;
  812.    for(i=0;i<4;i++)
  813.    {
  814.     Draw_dot_Hs(31+m,n+i);
  815.         Draw_dot_Hs(34+m,n+i);
  816.    }
  817.    Draw_dot_Hs(32+m,n);
  818.    Draw_dot_Hs(32+m,n+1);
  819.    Draw_dot_Hs(32+m,n+3);
  820.    Draw_dot_Hs(33+m,n);
  821.    Draw_dot_Hs(33+m,n+2);
  822.    Draw_dot_Hs(33+m,n+3);
  823.   }
  824.   EA=1;

  825. }


  826. /****************************************************************************
  827. ** 函数名称:  void cleardot(uchar x,uchar y)
  828. ** 功能描述:  清点函数
  829. ** 输 入:    uchar x,uchar y 需要清点的地址
  830. **         
  831. **        
  832. ** 输 出:
  833. **         
  834. ** 全局变量:
  835. ** 调用模块:
  836. **
  837. ** 作 者:    吴鉴鹰
  838. ** 作者所在单位:鉴鹰电子工作室
  839. ** 日 期:     14.05.10
  840. ****************************************************************************/
  841. void Clear_Dot_Hs(uchar x,uchar y)
  842. {
  843.   uchar dat,j;
  844.   if(x>63)
  845.   {
  846.     Choice_12864_Screen(1);
  847.         x=x-64;
  848.   }
  849.   else
  850.   {
  851.     Choice_12864_Screen(0);
  852.   }
  853.   dat=Lcd_Data_Write(y/8,x);
  854.   Cmd_Write_12864(0x40|x);
  855.   Cmd_Write_12864(0xb8|(y/8));
  856.   j=~(1<<(y%8));
  857.   Dat_Write_12864(dat&j);
  858. }

  859. /****************************************************************************
  860. ** 函数名称:  void Clear_Dot_four(uchar *x,uchar *y)
  861. ** 功能描述:  清除一个4X4的点
  862. ** 输 入:    uchar *x,uchar *y 需要清点的地址指针
  863. **         
  864. **        
  865. ** 输 出:
  866. **         
  867. ** 全局变量:
  868. ** 调用模块:
  869. **
  870. ** 作 者:    吴鉴鹰
  871. ** 作者所在单位:鉴鹰电子工作室
  872. ** 日 期:     14.05.10
  873. ****************************************************************************/
  874. void Clear_Dot_four(uchar *x,uchar *y)
  875. {
  876.   uchar i,m,n;
  877.   m=((*x)<<2)+31;
  878.   n=((*y)<<2)+2;
  879.   for(i=0;i<4;i++)
  880.   {
  881.     Clear_Dot_Hs(m,n+i);
  882.         Clear_Dot_Hs(m+1,n+i);
  883.         Clear_Dot_Hs(m+2,n+i);
  884.         Clear_Dot_Hs(m+3,n+i);
  885.   }
  886. }  

  887. /****************************************************************************
  888. ** 函数名称:  void Clear_Dot_four(uchar *x,uchar *y)
  889. ** 功能描述:  清除一个4X4的点
  890. ** 输 入:    uchar x,uchar y 需要清点的地址
  891. **         
  892. **        
  893. ** 输 出:
  894. **         
  895. ** 全局变量:
  896. ** 调用模块:
  897. **
  898. ** 作 者:    吴鉴鹰
  899. ** 作者所在单位:鉴鹰电子工作室
  900. ** 日 期:     14.05.10
  901. ****************************************************************************/
  902. void Clear_Four_DoT(uchar x,uchar y)
  903. {
  904.   uchar i,m,n;
  905.   if(x>=0&&x<24&&y>=0&&y<15)
  906.   {
  907.    m=((x)<<2)+31;
  908.    n=((y)<<2)+2;
  909.    for(i=0;i<4;i++)
  910.    {
  911.         Clear_Dot_Hs(m,n+i);
  912.         Clear_Dot_Hs(m+1,n+i);
  913.         Clear_Dot_Hs(m+2,n+i);
  914.         Clear_Dot_Hs(m+3,n+i);
  915.    }
  916.   }
  917. }

  918. /****************************************************************************
  919. ** 函数名称:  bit Read_Fk_Dot(char x,char y)
  920. ** 功能描述:  清除一个点
  921. ** 输 入:    uchar x,uchar y 需要清点的地址
  922. **         
  923. **        
  924. ** 输 出:
  925. **         
  926. ** 全局变量:
  927. ** 调用模块:
  928. **
  929. ** 作 者:    吴鉴鹰
  930. ** 作者所在单位:鉴鹰电子工作室
  931. ** 日 期:     14.05.10
  932. ****************************************************************************/
  933. bit Read_Fk_Dot(char x,char y)
  934. {
  935.   bit flagfk=0;
  936.   uchar m,n;
  937.   if(y>=0)
  938.   {
  939.   m=(x<<2)+31;
  940.   n=(y<<2)+2;
  941.   Choice_12864_Screen(0);
  942.   if(m>63)
  943.   {
  944.    m=m-64;
  945.    Choice_12864_Screen(1);
  946.   }                                                                                                                                                               
  947.   m=Lcd_Data_Write(n>>3,m);
  948.   if((n%8)==2)
  949.   {
  950.     if((m&0x3c)==0x3c)
  951.         {
  952.           flagfk=1;
  953.          }
  954.         else
  955.         {
  956.           flagfk=0;
  957.         }
  958.   }
  959.    if((n%8)==6)
  960.    {
  961.     if((m&0xc0)==0xc0)
  962.         {flagfk=1;

  963.         }
  964.         else
  965.         {flagfk=0;}
  966.    }
  967.   }
  968.   return(flagfk);

  969. }


  970. /****************************************************************************
  971. ** 函数名称:  void Timer_Machine_Fu() interrupt 1  using 1  //定时程序.产生步进时间
  972. ** 功能描述:   //定时程序,产生步进时间,中断次数控制
  973. ** 输 入:   
  974. **         
  975. **        
  976. ** 输 出:
  977. **         
  978. ** 全局变量:
  979. ** 调用模块:
  980. **
  981. ** 作 者:    吴鉴鹰
  982. ** 作者所在单位:鉴鹰电子工作室
  983. ** 日 期:     14.05.10
  984. ****************************************************************************/                          
  985. void Timer_Machine_Fu() interrupt 1  using 1  //定时程序.产生步进时间
  986. {
  987.    if(p--)
  988.    {
  989.     TL0=0;
  990.         TH0=0xa0;
  991.         flag1=0;
  992.    }
  993.    else
  994.    {
  995.      flag1=1;
  996.          TL0=0;
  997.          TH0=0x00;
  998.          p=20-(dengji>>1);
  999.    }
  1000. }

  1001. /****************************************************************************
  1002. ** 函数名称:  void Start_Key_Judge() interrupt 2 using 2
  1003. ** 功能描述:   开始确认暂停键的判断
  1004. ** 输 入:   
  1005. **         
  1006. **        
  1007. ** 输 出:
  1008. **         
  1009. ** 全局变量:
  1010. ** 调用模块:
  1011. **
  1012. ** 作 者:    吴鉴鹰
  1013. ** 作者所在单位:鉴鹰电子工作室
  1014. ** 日 期:     14.05.10
  1015. ****************************************************************************/
  1016. void Start_Key_Judge() interrupt 2 using 2
  1017. {
  1018.    if(!flag5)
  1019.    {
  1020.      flag5=1;
  1021.    }
  1022.    else
  1023.    {
  1024.      flag5=0;
  1025.    }
  1026. }

  1027. /****************************************************************************
  1028. ** 函数名称:  void Dire_Inte_Fu() interrupt 0 using 0
  1029. ** 功能描述:   开始确认暂停键的判断
  1030. ** 输 入:   
  1031. **         
  1032. **        
  1033. ** 输 出:
  1034. **         
  1035. ** 全局变量:
  1036. ** 调用模块:
  1037. **
  1038. ** 作 者:    吴鉴鹰
  1039. ** 作者所在单位:鉴鹰电子工作室
  1040. ** 日 期:     14.05.10
  1041. ****************************************************************************/
  1042. void Dire_Inte_Fu() interrupt 0 using 0
  1043.   {
  1044.     uchar i=0;
  1045.         if(first)               //FIRST=1;打开方向按键判断标志
  1046.         {
  1047.         first=0;            
  1048.         k=(P2>>6);           
  1049.         k=k&0x03;                                
  1050.         if(flag)
  1051.           {
  1052.             if(k==1)     direction=3;//左
  1053.             if(k==2)         direction=1;//右
  1054.              }
  1055.           else
  1056.            {
  1057.             if(k==0)         direction=4;//上
  1058.             if(k==3)         direction=2;//下
  1059.              }
  1060.         }
  1061.   }


  1062. /****************************************************************************
  1063. ** 函数名称:  void Play_Buf_Model(uchar buff,char offsetx,char offsety)
  1064. ** 功能描述:    显示四个小格的方块
  1065. ** 输 入:     uchar buff:数组的首地址,char offsetx:位置的x坐标,char offsety:位置y坐标
  1066. **         
  1067. **        
  1068. ** 输 出:
  1069. **         
  1070. ** 全局变量:
  1071. ** 调用模块:
  1072. **
  1073. ** 作 者:    吴鉴鹰
  1074. ** 作者所在单位:鉴鹰电子工作室
  1075. ** 日 期:     14.05.10
  1076. ****************************************************************************/
  1077. void Play_Buf_Model(uchar buff,char offsetx,char offsety)         
  1078. {
  1079.   //i=(Model+((dat&0xf0)|((dat&0x0f)<<2)));
  1080.   Change_4_Dot1((((*(Model+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx,((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))))&0x0f)+offsety);
  1081.   Change_4_Dot1((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx,((*(((Model+((buff&0xf0)|((buff&0x0f)<<2))))+1))&0x0f)+offsety);
  1082.   Change_4_Dot1((((*(((Model+((buff&0xf0)|((buff&0x0f)<<2))))+2))&0xf0)>>4)+offsetx,((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);
  1083.   Change_4_Dot1((((*(((Model+((buff&0xf0)|((buff&0x0f)<<2))))+3))&0xf0)>>4)+offsetx,((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety);

  1084. }


  1085. /****************************************************************************
  1086. ** 函数名称:  bit Stop_Dir_Down(uchar buff,char offsetx,char offsety)
  1087. ** 功能描述:  判断方块停止向下运动
  1088. ** 输 入:    uchar buff:数组的首地址,char offsetx:位置的x坐标,char offsety:位置y坐标
  1089. **         
  1090. **        
  1091. ** 输 出:
  1092. **         
  1093. ** 全局变量:
  1094. ** 调用模块:
  1095. **
  1096. ** 作 者:    吴鉴鹰
  1097. ** 作者所在单位:鉴鹰电子工作室
  1098. ** 日 期:     14.05.10
  1099. ****************************************************************************/
  1100. bit Stop_Dir_Down(uchar buff,char offsetx,char offsety)
  1101. {
  1102.    char x0,y0,x1,y1,x2,y2,x3,y3;
  1103.    bit tz=0;
  1104.    x0=(((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
  1105.    x1=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
  1106.    x2=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
  1107.    x3=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
  1108.    y2=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
  1109.    y3=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
  1110.    y0=((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
  1111.    y1=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
  1112.    
  1113.    if(Read_Fk_Dot(x0+1,y0))
  1114.    {
  1115.       if(!((((x0+1)==x1)&&(y0==y1))|(((x0+1)==x2)&&(y0==y2))|(((x0+1)==x3)&&(y0==y3))))
  1116.          {
  1117.           tz=1;
  1118.           }
  1119.    }
  1120.     if(Read_Fk_Dot(x1+1,y1))
  1121.    {
  1122.       if(!((((x1+1)==x0)&&(y1==y0))|(((x1+1)==x2)&&(y1==y2))|(((x1+1)==x3)&&(y1==y3))))
  1123.          {
  1124.           tz=1;
  1125.          }
  1126.    }
  1127.    if(Read_Fk_Dot(x2+1,y2))
  1128.    {
  1129.       if(!((((x2+1)==x0)&&(y2==y0))|(((x2+1)==x1)&&(y2==y1))|(((x2+1)==x3)&&(y2==y3))))
  1130.           {
  1131.            tz=1;
  1132.           }
  1133.    }
  1134.    if(Read_Fk_Dot(x3+1,y3))
  1135.    {
  1136.       if(!((((x3+1)==x0)&&(y3==y0))|(((x3+1)==x1)&&(y3==y1))|(((x3+1)==x2)&&(y3==y2))))
  1137.           {
  1138.            tz=1;
  1139.           }
  1140.    }
  1141.    return(tz);
  1142. }


  1143. /****************************************************************************
  1144. ** 函数名称:  bit Line_Disapp_Fu(uchar x)
  1145. ** 功能描述:  判断一行是否可以消除
  1146. ** 输 入:    uchar x行数
  1147. **         
  1148. **        
  1149. ** 输 出:
  1150. **         
  1151. ** 全局变量:
  1152. ** 调用模块:
  1153. **
  1154. ** 作 者:    吴鉴鹰
  1155. ** 作者所在单位:鉴鹰电子工作室
  1156. ** 日 期:     14.05.10
  1157. ****************************************************************************/
  1158. bit Line_Disapp_Fu(uchar x)
  1159. {
  1160. uchar i;
  1161. bit   man=1;
  1162. for(i=0;i<15;i++)
  1163. {
  1164.          man=man&(Read_Fk_Dot(x,i));
  1165.         if(!man)
  1166.         break;
  1167. }
  1168. return(man);
  1169. }



  1170. /****************************************************************************
  1171. ** 函数名称: void Elim_Line_Fu(uchar x)
  1172. ** 功能描述:  消除一行
  1173. ** 输 入:    uchar x行数
  1174. **         
  1175. **        
  1176. ** 输 出:
  1177. **         
  1178. ** 全局变量:
  1179. ** 调用模块:
  1180. **
  1181. ** 作 者:    吴鉴鹰
  1182. ** 作者所在单位:鉴鹰电子工作室
  1183. ** 日 期:     14.05.10
  1184. ****************************************************************************/
  1185. void Elim_Line_Fu(uchar x)
  1186. {
  1187.   uchar i,j;
  1188.   for(i=0;i<15;i++)
  1189.   {
  1190.     Clear_Four_DoT(x,i);
  1191.   }
  1192.   for(i=1;i<=x;i++)
  1193.   {
  1194.    for(j=0;j<15;j++)
  1195.    {
  1196.      if(Read_Fk_Dot(x-i,j))
  1197.          {
  1198.           Change_4_Dot1(x-i+1,j);
  1199.           Clear_Four_DoT(x-i,j);
  1200.          }
  1201.    }
  1202.   }
  1203. }

  1204. /****************************************************************************
  1205. ** 函数名称:  bit Stop_Dir_Right(uchar buff,char offsetx,char offsety)
  1206. ** 功能描述:  判断是否停止向右
  1207. ** 输 入:    uchar buff:数组的首地址,char offsetx:位置的x坐标,char offsety:位置y坐标
  1208. **         
  1209. **        
  1210. ** 输 出:
  1211. **         
  1212. ** 全局变量:
  1213. ** 调用模块:
  1214. **
  1215. ** 作 者:    吴鉴鹰
  1216. ** 作者所在单位:鉴鹰电子工作室
  1217. ** 日 期:     14.05.10
  1218. ****************************************************************************/
  1219. bit Stop_Dir_Right(uchar buff,char offsetx,char offsety)
  1220. {
  1221.    char x0,y0,x1,y1,x2,y2,x3,y3;
  1222.    bit tz=0;
  1223.    x0=(((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
  1224.    x1=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
  1225.    x2=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
  1226.    x3=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
  1227.    y2=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
  1228.    y3=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
  1229.    y0=((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
  1230.    y1=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
  1231.    if(Read_Fk_Dot(x0,y0-1))
  1232.    {
  1233.       if(!(((x0==x1)&&((y0-1)==y1))|((x0==x2)&&((y0-1)==y2))|((x0==x3)&&((y0-1)==y3))))
  1234.          {
  1235.            tz=1;
  1236.           }
  1237.    }
  1238.    if(Read_Fk_Dot(x1,y1-1))
  1239.      {
  1240.       if(!(((x1==x0)&&((y1-1)==y0))|((x1==x2)&&((y1-1)==y2))|((x1==x3)&&((y1-1)==y3))))
  1241.          {
  1242.           tz=1;           
  1243.          }
  1244. }
  1245.     if(Read_Fk_Dot(x2,y2-1))
  1246.    {
  1247.       if(!(((x2==x0)&&((y2-1)==y0))|((x2==x1)&&((y2-1)==y1))|((x2==x3)&&((y2-1)==y3))))
  1248.           {
  1249.            tz=1;
  1250.           }
  1251.    }
  1252.       if(Read_Fk_Dot(x3,y3-1))
  1253.    {
  1254.       if(!(((x3==x0)&&((y3-1)==y0))|((x3==x1)&&((y3-1)==y1))|((x3==x2)&&((y3-1)==y2))))
  1255.           {
  1256.            tz=1;
  1257.           }
  1258.    }
  1259.    return(tz);
  1260. }

  1261. /****************************************************************************
  1262. ** 函数名称:  bit Stop_Dir_Left(uchar buff,char offsetx,char offsety)
  1263. ** 功能描述:  判断是否停止向左
  1264. ** 输 入:    uchar buff:数组的首地址,char offsetx:位置的x坐标,char offsety:位置y坐标
  1265. **         
  1266. **        
  1267. ** 输 出:
  1268. **         
  1269. ** 全局变量:
  1270. ** 调用模块:
  1271. **
  1272. ** 作 者:    吴鉴鹰
  1273. ** 作者所在单位:鉴鹰电子工作室
  1274. ** 日 期:     14.05.10
  1275. ****************************************************************************/
  1276. bit Stop_Dir_Left(uchar buff,char offsetx,char offsety)
  1277. {
  1278.    char x0,y0,x1,y1,x2,y2,x3,y3;
  1279.    bit tz=0;
  1280.    x0=(((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;
  1281.    x1=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;
  1282.    x2=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;
  1283.    x3=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;
  1284.    y2=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;
  1285.    y3=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;
  1286.    y0=((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;
  1287.    y1=((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;
  1288.    if(Read_Fk_Dot(x0,y0+1))
  1289.    {
  1290.       if(!(((x0==x1)&&((y0+1)==y1))|((x0==x2)&&((y0+1)==y2))|((x0==x3)&&((y0+1)==y3))))
  1291.          {
  1292.            tz=1;
  1293.           }
  1294.    }
  1295.    if(Read_Fk_Dot(x1,y1+1))
  1296.      {
  1297.       if(!(((x1==x0)&&((y1+1)==y0))|((x1==x2)&&((y1+1)==y2))|((x1==x3)&&((y1+1)==y3))))
  1298.          {
  1299.           tz=1;           
  1300.          }
  1301. }
  1302.     if(Read_Fk_Dot(x2,y2+1))
  1303.    {
  1304.       if(!(((x2==x0)&&((y2+1)==y0))|((x2==x1)&&((y2+1)==y1))|((x2==x3)&&((y2+1)==y3))))
  1305.           {
  1306.            tz=1;
  1307.           }
  1308.    }
  1309.       if(Read_Fk_Dot(x3,y3+1))
  1310.    {
  1311.       if(!(((x3==x0)&&((y3+1)==y0))|((x3==x1)&&((y3+1)==y1))|((x3==x2)&&((y3+1)==y2))))
  1312.           {
  1313.            tz=1;
  1314.           }
  1315.    }
  1316.    return(tz);
  1317. }

  1318. /****************************************************************************
  1319. ** 函数名称:  void Clear_bufF_Fuc(uchar dat,char setx,char sety)
  1320. ** 功能描述:  清除一个方块
  1321. ** 输 入:    uchar dat:緩存的首地址,char setx:方块的x坐标,char sety:方块的y坐标
  1322. **         
  1323. **        
  1324. ** 输 出:
  1325. **         
  1326. ** 全局变量:
  1327. ** 调用模块:
  1328. **
  1329. ** 作 者:    吴鉴鹰
  1330. ** 作者所在单位:鉴鹰电子工作室
  1331. ** 日 期:     14.05.10
  1332. ****************************************************************************/
  1333. void Clear_bufF_Fuc(uchar dat,char setx,char sety)
  1334. {
  1335.   uchar *i;
  1336.   i=(Model+((dat&0xf0)|((dat&0x0f)<<2)));
  1337.   Clear_Four_DoT(((((*i)&0xf0)>>4)+setx),(((*i)&0x0f)+sety));
  1338.   Clear_Four_DoT(((((*(i+1))&0xf0)>>4)+setx),(((*(i+1))&0x0f)+sety));
  1339.   Clear_Four_DoT(((((*(i+2))&0xf0)>>4)+setx),(((*(i+2))&0x0f)+sety));
  1340.   Clear_Four_DoT(((((*(i+3))&0xf0)>>4)+setx),(((*(i+3))&0x0f)+sety));  
  1341. }

  1342. /****************************************************************************
  1343. ** 函数名称:  void Russia_Box_Fuction(void)
  1344. ** 功能描述:  俄罗斯方块子程序
  1345. ** 输 入:   
  1346. **         
  1347. **        
  1348. ** 输 出:
  1349. **         
  1350. ** 全局变量:
  1351. ** 调用模块:
  1352. **
  1353. ** 作 者:    吴鉴鹰
  1354. ** 作者所在单位:鉴鹰电子工作室
  1355. ** 日 期:     14.05.10
  1356. ****************************************************************************/
  1357. void Russia_Box_Fuction(void)
  1358. {
  1359.   uchar fenshu=0;
  1360.   char offsety,offsetx;
  1361.   char offsety_buff,offsetx_buff;
  1362.   uchar buff=0x10;                 
  1363.   bit ting=0;                                                               
  1364.   uchar i;
  1365.   //flag5=1;
  1366.   TMOD=1;          //定时器工作方式
  1367.   IT0=1;          //边延有效
  1368.   IT1=1;
  1369.   EA=1;                  //开CPU中断
  1370.   ET0=1;          //开定时器中断
  1371.   EX0=1;          //开外部中断
  1372.   EX1=1;
  1373.   TL0=0x00;
  1374.   TH0=0x00;          //定时器初值
  1375.   TR0=1;          //启动定时器
  1376.   k=5;
  1377.   Choice_12864_Screen(2);
  1378.   Clear_12864_Screen();
  1379.   Display_16_point(0,0,0,WJYJ);
  1380.   Display_16_point(0,0,1,WJYJ+32);
  1381.   Display_16_point(0,0,2,RussiaBOX);
  1382.   Display_16_point(0,2,0,RussiaBOX+32);
  1383.   Display_16_point(0,2,1,RussiaBOX+64);
  1384.   Display_16_point(0,2,2,RussiaBOX+96);
  1385.   Display_16_point(0,2,3,RussiaBOX+128);
  1386.   Display_8_point(0,0,3,Num0);
  1387.   Display_8_point(0,1,3,Num0);
  1388.   Draw_Vertical_line(1,60,30);
  1389.   Draw_Vertical_line(1,60,127);
  1390.   for(i=0;i<98;i++)
  1391.   {
  1392.     Draw_dot_Hs(30+i,1);
  1393.         Draw_dot_Hs(30+i,62);
  1394.   }
  1395.   offsety=7;
  1396.   offsetx=-3;
  1397.   for(;;)
  1398. {
  1399.    if(P3&0x04)
  1400.    first=1;
  1401.    if((k==0x02)&&((P3&0x04)==0x04))
  1402.    {
  1403.      offsety_buff=offsety;
  1404.          ting=Stop_Dir_Right(buff,offsetx,offsety);
  1405.         if(!ting)
  1406.          {
  1407.           if(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety)
  1408.       offsety--;
  1409.           Clear_bufF_Fuc(buff,offsetx_buff,offsety_buff);
  1410.           Play_Buf_Model(buff,offsetx,offsety);
  1411.           offsety_buff=offsety;
  1412.          
  1413.     }
  1414.           k=5;
  1415.    }
  1416.    if((k==0x01)&&((P3&0x04)==0x04))
  1417.    {

  1418.      offsety_buff=offsety;
  1419.          ting=Stop_Dir_Left(buff,offsetx,offsety);
  1420.          if(!ting)
  1421.         {
  1422.           if(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety<=13)
  1423.      offsety++;
  1424.          k=5;
  1425.          Clear_bufF_Fuc(buff,offsetx_buff,offsety_buff);
  1426.          Play_Buf_Model(buff,offsetx,offsety);
  1427.          offsety_buff=offsety;
  1428.         }
  1429.    }
  1430.    if((k==0x03)&&((P3&0x04)==0x04))
  1431.    {
  1432.      dengji=36;/////////////
  1433.          k=5;
  1434.    }
  1435.    if((k==0x00)&&((P3&0x04)==0x04))
  1436.    {
  1437.       uchar i;
  1438.           k=5;
  1439.           i=buff;
  1440.           buff++;
  1441.           if((buff&0x0f)>=4)
  1442.           buff=buff&0xf0;
  1443.          
  1444.           //Change_4_Dot1(0,14);
  1445.       if(((*(((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14)
  1446.        {
  1447.              do
  1448.                   {
  1449.                           offsety--;
  1450.                   }while((((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14);
  1451.                  
  1452.            }
  1453.           if(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety<0)
  1454.           {
  1455.             do
  1456.                 {
  1457.                   offsety++;
  1458.                 }while(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);
  1459.           }
  1460.           Clear_bufF_Fuc(i,offsetx_buff,offsety_buff);
  1461.           Play_Buf_Model(buff,offsetx,offsety);
  1462.    }
  1463.    ting=Stop_Dir_Down(buff,offsetx,offsety);
  1464.    while(flag5);
  1465.    if(flag1)
  1466.    {
  1467.      offsetx_buff=offsetx;
  1468.          offsety_buff=offsety;
  1469.      offsetx++;
  1470.          Clear_bufF_Fuc(buff,offsetx_buff,offsety_buff);
  1471.          Play_Buf_Model(buff,offsetx,offsety);
  1472.      offsetx_buff=offsetx;
  1473.          flag1=0;
  1474.     }
  1475.    if((((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)>22)|ting)
  1476.    {
  1477.     uchar i=0;
  1478.         if(Line_Disapp_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx))
  1479.         {Elim_Line_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx);fenshu++;i++;}
  1480.    
  1481.         if((((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx>=(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx)         //x2>=x3
  1482.         {
  1483.          if((((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((Model+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)        //x2<x1
  1484.          {
  1485.            if(Line_Disapp_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i))
  1486.            {Elim_Line_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  1487.          }
  1488.          if((((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx)         //x3<x2
  1489.           {
  1490.            if(Line_Disapp_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i))
  1491.            {Elim_Line_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  1492.           }
  1493.          if((((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx)         //x0<x3
  1494.          {
  1495.            if(Line_Disapp_Fu((((*(Model+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i))
  1496.            {Elim_Line_Fu((((*(Model+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;}
  1497.          }
  1498.         }
  1499.         if((((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx) //x2<x3
  1500.         {
  1501.            if((((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((Model+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)
  1502.            {
  1503.               if(Line_Disapp_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i))
  1504.               {
  1505.                Elim_Line_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;
  1506.               }
  1507.            }
  1508.            if(Line_Disapp_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i))
  1509.            {
  1510.              Elim_Line_Fu((((*((Model+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;
  1511.            }
  1512.            if((((*(Model+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((Model+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx)
  1513.            {
  1514.               if(Line_Disapp_Fu((((*(Model+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i))
  1515.               {
  1516.                Elim_Line_Fu((((*(Model+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;
  1517.                }
  1518.            }
  1519.         }
  1520.          
  1521.         Display_8_point(0,0,3,Num0+((fenshu/10)<<4));
  1522.         Display_8_point(0,1,3,Num0+((fenshu%10)<<4));
  1523.         dengji=fenshu/5;
  1524.         if(((((*(Model+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx)<1)
  1525.         {

  1526.           Delay_1ms(450);
  1527.       Delay_1ms(450);
  1528.       Choice_12864_Screen(2);
  1529.       Clear_12864_Screen();
  1530.       Display_16_point(0,4,1,Game_Over);
  1531.       Display_16_point(0,6,1,Game_Over+32);
  1532.       Display_16_point(1,0,1,Game_Over+64);
  1533.       Display_16_point(1,2,1,Game_Over+96);
  1534.       Delay_1ms(450);
  1535.       Delay_1ms(450);
  1536.       break;
  1537.         }        
  1538.         buff=(((TL0%7)<<4)|(TH0%4));
  1539.         //buff=0x11;
  1540.     offsety=7;
  1541.     offsetx=-3;
  1542.         offsetx_buff=-9;
  1543.         offsety_buff=-9;
  1544.         }
  1545. }

  1546. }

  1547. /*******************************************************************************************
  1548. ** 函数名称:  void Delay_S(void)   //延时1s误差 0us
  1549. ** 功能描述:  精确延时函数,延时1秒,软件算得                                                
  1550. ** 输 入:   
  1551. **         
  1552. **        
  1553. ** 输 出:   
  1554. **         
  1555. ** 全局变量:
  1556. ** 调用模块:
  1557. **
  1558. ** 作 者:    吴鉴鹰
  1559. ** 日 期:     14.05.16
  1560. ********************************************************************************************/
  1561. void Delay_S(void)   //延时1s误差 0us
  1562. {
  1563.     unsigned char a,b,c;
  1564.     for(c=167;c>0;c--)
  1565.         for(b=171;b>0;b--)
  1566.             for(a=16;a>0;a--);
  1567.     _nop_();  //if Keil,require use intrins.h
  1568. }        

  1569. /*******************************************************************************************
  1570. ** 函数名称:  void CHECK_busy()
  1571. ** 功能描述:  读“忙”函数,判断液晶当前是否忙碌  
  1572. ** 输 入:     
  1573. **         
  1574. **        
  1575. ** 输 出:
  1576. **         
  1577. ** 全局变量:
  1578. ** 调用模块:
  1579. **
  1580. ** 作 者:    吴鉴鹰
  1581. ** 日 期:     14.05.16
  1582. ********************************************************************************************/
  1583. void CHECK_busy()//读“忙”函数-----数据线的最高位DB71则busy               
  1584. {
  1585.         P0=0x00;
  1586.            LCD_RS_OUT=0;  
  1587.            LCD_RW_OUT=1;
  1588.         LCD_E_OUT=1;
  1589.         while(P0 & 0x80);
  1590.         LCD_E_OUT=0;
  1591. }
  1592.                                           

  1593. /*******************************************************************************************
  1594. ** 函数名称:  void LCD_COM_WRI(uchar value)
  1595. ** 功能描述:  LCD液晶写命令函数  
  1596. ** 输 入:    uchar value(向LCD写入的命令)
  1597. **         
  1598. **        
  1599. ** 输 出:
  1600. **         
  1601. ** 全局变量:
  1602. ** 调用模块:
  1603. **
  1604. ** 作 者:    吴鉴鹰
  1605. ** 日 期:     14.05.16
  1606. ********************************************************************************************/
  1607. void LCD_COM_WRI(uchar value)        //写命令函数
  1608. {
  1609.    CHECK_busy();                                                //对LCD的每次读写都要读忙
  1610.    LCD_RS_OUT=0;                                                         //选择命令
  1611.    LCD_RW_OUT=0;                                                         //读操作
  1612.    LCD_12864_DATA = value;
  1613.    LCD_E_OUT=1;                                                        //LCD_EN_OUT由1----0锁存有效数据
  1614.    _nop_();
  1615.    _nop_();
  1616.    LCD_E_OUT=0;
  1617. }

  1618. /*******************************************************************************************
  1619. ** 函数名称:  void LCD_DATA_WRI(uchar value)
  1620. ** 功能描述:  LCD液晶写数据的函数  
  1621. ** 输 入:    uchar value(向LCD写入的数据)
  1622. **         
  1623. **        
  1624. ** 输 出:
  1625. **         
  1626. ** 全局变量:
  1627. ** 调用模块:
  1628. **
  1629. ** 作 者:    吴鉴鹰
  1630. ** 日 期:     14.05.16
  1631. ********************************************************************************************/
  1632. void LCD_DATA_WRI(uchar value)//写数据函数        
  1633. {
  1634.    CHECK_busy();
  1635.    LCD_RS_OUT=1;                                                 //选择数据
  1636.    LCD_RW_OUT=0;        
  1637.    LCD_12864_DATA = value;
  1638.    LCD_E_OUT=1;                                                //LCD_EN_OUT由1----0锁存有效数据
  1639.    _nop_();               
  1640.    _nop_();
  1641.    LCD_E_OUT=0;
  1642. }

  1643. /*******************************************************************************************
  1644. ** 函数名称:  void CHOOSE_COLUMN(uchar column)
  1645. ** 功能描述:  设置显示的列
  1646. ** 输 入:    uchar column(设置显示的列)
  1647. **         
  1648. **        
  1649. ** 输 出:   
  1650. **         
  1651. ** 全局变量:
  1652. ** 调用模块:
  1653. **
  1654. ** 作 者:    吴鉴鹰
  1655. ** 日 期:     14.05.16
  1656. ********************************************************************************************/
  1657. void CHOOSE_COLUMN(uchar column)        //设置显示的列        
  1658. {
  1659.   column=column &0x3f;                         //列的最大值为64
  1660.   column= 0x40|column;                         //列的首地址为0x40
  1661.   LCD_COM_WRI(column);        //规定显示的列的位置
  1662. }


  1663. /*******************************************************************************************
  1664. ** 函数名称:  void CHOOSE_PG(uchar page)
  1665. ** 功能描述:  设置“页”LCD12864共8页,一页是8行点阵点
  1666. ** 输 入:    uchar page(送入设置的页数)
  1667. **         
  1668. **        
  1669. ** 输 出:   
  1670. **         
  1671. ** 全局变量:
  1672. ** 调用模块:
  1673. **
  1674. ** 作 者:    吴鉴鹰
  1675. ** 日 期:     14.05.16
  1676. ********************************************************************************************/
  1677. void CHOOSE_PG(uchar page)                //设置“页”LCD12864共8页,一页是8行点阵点        
  1678. {
  1679.   page=0xb8|page;                                 //页的首地址为0xB8
  1680.   LCD_COM_WRI(page);
  1681. }

  1682. /*******************************************************************************************
  1683. ** 函数名称:  void SEL_SCREN(uchar screen)
  1684. ** 功能描述:  LCD选择屏幕  
  1685. ** 输 入:    uchar screen(选择屏幕0:全屏  1:左半屏 2:右半屏)  
  1686. **         
  1687. **        
  1688. ** 输 出:   
  1689. **         
  1690. ** 全局变量:
  1691. ** 调用模块:
  1692. **
  1693. ** 作 者:    吴鉴鹰
  1694. ** 日 期:     14.05.16
  1695. ********************************************************************************************/
  1696. void SEL_SCREN(uchar screen)        //选择屏幕
  1697. {                                                  
  1698.    switch(screen)
  1699.    {
  1700.             case 0: LCD_CS1_OUT=0;LCD_CS2_OUT=0;break; //全屏     
  1701.      case 1: LCD_CS1_OUT=0;LCD_CS2_OUT=1;break;//左半屏        
  1702.      case 2: LCD_CS1_OUT=1;LCD_CS2_OUT=0;break;//右半屏      
  1703.      default:break;
  1704.    }
  1705. }

  1706. /*******************************************************************************************
  1707. ** 函数名称:  void Display_picture(uchar a[][64])
  1708. ** 功能描述:  显示图片的函数  
  1709. ** 输 入:    uchar a[][64](存放图片的数组)  
  1710. **         
  1711. **        
  1712. ** 输 出:   
  1713. **         
  1714. ** 全局变量:
  1715. ** 调用模块:
  1716. **
  1717. ** 作 者:    吴鉴鹰
  1718. ** 日 期:     14.05.16
  1719. ********************************************************************************************/
  1720. void GUI_CLEAR(uchar a[][64])//显示图形—128*64大小
  1721. {
  1722.         uchar i,j;
  1723.         
  1724.         for(j=0;j<8;j++)
  1725.         {        
  1726.                 SEL_SCREN(1);
  1727.                 CHOOSE_PG(j);
  1728.                 CHOOSE_COLUMN(0);
  1729.                 for(i=0;i<64;i++)
  1730.                 {
  1731.                         LCD_DATA_WRI(a[2*j][i]);//每隔一行取一次数组中的数据
  1732.                 }
  1733.                 SEL_SCREN(2);
  1734.                 CHOOSE_PG(j);
  1735.                 CHOOSE_COLUMN(0);
  1736.                 for(i=0;i<64;i++)
  1737.                 {
  1738.                         LCD_DATA_WRI(a[2*j+1][i]);//每隔一行取一次数组中的数据
  1739.                 }        
  1740.         }        
  1741. }

  1742. /*******************************************************************************************
  1743. ** 函数名称:  main(void)
  1744. ** 功能描述:  整个程序的框架
  1745. ** 输 入:   
  1746. **         
  1747. **        
  1748. ** 输 出:   
  1749. **         
  1750. ** 全局变量:
  1751. ** 调用模块:
  1752. **
  1753. ** 作 者:    吴鉴鹰
  1754. ** 日 期:     14.05.16
  1755. ********************************************************************************************/
  1756. //////////////////////////////
  1757. void main(void)
  1758. {
  1759.     uchar i;
  1760.     uchar count=0;
  1761.     P2=0xff;
  1762.     EA=1;                  //开CPU中断
  1763.     //ET0=1;          //开定时器中断
  1764.     EX0=1;          //开外部中断
  1765.     EX1=1;
  1766.     Choice_12864_Screen(2);
  1767.     Init_12864_Screen();
  1768.     Clear_12864_Screen();
  1769.     ////////////////////
  1770.     // play16(0,4,0,Tan);
  1771.     //play16(0,6,0,Chi);
  1772.     //play16(1,0,0,Snake);
  1773.     ///////////////////
  1774.     Display_16_point(0,2,0,RussiaBOX);
  1775.     Display_16_point(0,4,0,RussiaBOX+32);
  1776.         Display_16_point(0,6,0,RussiaBOX+64);
  1777.     for(i=0;i<2;i++)
  1778.     {
  1779.         Display_16_point(1,i<<1,0,(RussiaBOX+96+(i<<5)));
  1780.     }

  1781.          Display_16_point(0,2,1,WJYZZ);
  1782.         Display_16_point(0,4,1,WJYZZ+32);
  1783.         Display_16_point(0,6,1,WJYZZ+64);
  1784.         for(i=0;i<2;i++)
  1785.         {
  1786.            Display_16_point(1,i<<1,1,(WJYZZ+96+(i<<5)));
  1787.         }

  1788.         Display_16_point(0,0,0,WWJJYYWXTP);
  1789.         //Display_16_point(0,2,0,WWJJYYWXTP);
  1790.         //Display_16_point(1,2,0,WWJJYYWXTP);
  1791.         Display_16_point(1,4,0,WWJJYYWXTP);
  1792.         Display_16_point(1,6,0,WWJJYYWXTP);
  1793.         
  1794.         Display_16_point(0,0,1,WWJJYYWXTP);
  1795.         Display_16_point(1,4,1,WWJJYYWXTP);
  1796.         Display_16_point(1,6,1,WWJJYYWXTP);

  1797.          
  1798.          //////////////////
  1799.         for(i=0;i<4;i++)
  1800.         {
  1801.             Display_16_point(0,i<<1,2,(WWJJYYJ+(i<<5))) ;
  1802.         }
  1803.         for(i=0;i<4;i++)
  1804.         {
  1805.             Display_16_point(1,i<<1,2,(WWJJYYG+(i<<5))) ;
  1806.         }

  1807.         for(i=0;i<4;i++)
  1808.         {
  1809.             Display_16_point(0,i<<1,3,(WWJJYYJ+(i<<5))) ;
  1810.         }
  1811.         for(i=0;i<4;i++)
  1812.         {
  1813.             Display_16_point(1,i<<1,3,(WWJJYYHH+(i<<5))) ;
  1814.         }

  1815.          //while(1);
  1816.             Delay_S(); Delay_S();Delay_S();
  1817.          GUI_CLEAR(Start_picture);
  1818.          // while(1);
  1819.           Delay_S(); Delay_S();Delay_S();
  1820.      Delay_S(); Delay_S();Delay_S();
  1821.         

  1822. //////////////////

  1823. //play16(0,4,2,Per_Cal_Li);
  1824. //play16(0,6,2,Per_Cal_Li+32);
  1825. //play16(1,0,2,Per_Cal_Li+64);

  1826. //////////////////
  1827. for(;;)
  1828.   {
  1829.     if((k==0x03)&&((P3&0x04)==0x04))
  1830.    {
  1831.         count++;
  1832.         k=0;
  1833.         if(count==4)
  1834.         count=1;
  1835.         switch(count)
  1836.         {
  1837.           case 1:
  1838.                  {
  1839.                             Display_16_point(0,4,2,Per_Cal_Li);
  1840.                 Display_16_point(0,6,2,Per_Cal_Li+32);
  1841.                 Display_16_point(1,0,2,Per_Cal_Li+64);
  1842.                                 play16_fb(0,4,0);
  1843.                 play16_fb(0,6,0);
  1844.                 play16_fb(1,0,0);
  1845.                          };break;
  1846.           case 2: {
  1847.                                       Display_16_point(0,4,0,Tan);
  1848.                  Display_16_point(0,6,0,Chi);
  1849.                  Display_16_point(1,0,0,Snake);
  1850.                                  play16_fb(0,4,1);
  1851.                  play16_fb(0,6,1);
  1852.                  for(i=0;i<3;i++)
  1853.                  {
  1854.                    play16_fb(1,i<<1,1);
  1855.                   }
  1856.                     };break;
  1857.           case 3:
  1858.                   {
  1859.                     
  1860.                                  Display_16_point(0,4,1,RussiaBOX);
  1861.                  Display_16_point(0,6,1,RussiaBOX+32);
  1862.                  for(i=0;i<3;i++)
  1863.                  {
  1864.                    Display_16_point(1,i<<1,1,(RussiaBOX+64+(i<<5)));
  1865.                  }
  1866.                                  play16_fb(0,4,2);
  1867.                  play16_fb(0,6,2);
  1868.                  play16_fb(1,0,2);
  1869.                   };break;
  1870.               default:break;
  1871.         }
  1872.   }         
  1873.   if(P3&0x04)
  1874.   first=1;
  1875.   if(flag5)
  1876.   {
  1877.     /*switch(count)
  1878.         {
  1879.         //          case 1:flag5=0;/*TanChiSnake();count=0;flag5=0;k=0;break;
  1880.         //          case 2:flag5=0;Russia_Box_Fuction();count=0;flag5=0; k=0;break;
  1881.         //          case 3:flag5=0;/*wannianli();count=0;flag5=0;k=0;break;
  1882.         //          default:count=0;k=3;flag5=0;break;
  1883.         //        }  */
  1884.          flag5=0;
  1885.          k=0;
  1886.          Russia_Box_Fuction();
  1887.          Choice_12864_Screen(2);
  1888.      Init_12864_Screen();
  1889.      Clear_12864_Screen();
  1890.           Display_16_point(0,2,0,RussiaBOX);
  1891.     Display_16_point(0,4,0,RussiaBOX+32);
  1892.         Display_16_point(0,6,0,RussiaBOX+64);
  1893.     for(i=0;i<2;i++)
  1894.     {
  1895.         Display_16_point(1,i<<1,0,(RussiaBOX+96+(i<<5)));
  1896.     }

  1897.          Display_16_point(0,2,1,WJYZZ);
  1898.         Display_16_point(0,4,1,WJYZZ+32);
  1899.         Display_16_point(0,6,1,WJYZZ+64);
  1900.         for(i=0;i<2;i++)
  1901.         {
  1902.            Display_16_point(1,i<<1,1,(WJYZZ+96+(i<<5)));
  1903.         }

  1904.         Display_16_point(0,0,0,WWJJYYWXTP);
  1905.         //Display_16_point(0,2,0,WWJJYYWXTP);
  1906.         //Display_16_point(1,2,0,WWJJYYWXTP);
  1907.         Display_16_point(1,4,0,WWJJYYWXTP);
  1908.         Display_16_point(1,6,0,WWJJYYWXTP);
  1909.         
  1910.         Display_16_point(0,0,1,WWJJYYWXTP);
  1911.         Display_16_point(1,4,1,WWJJYYWXTP);
  1912.         Display_16_point(1,6,1,WWJJYYWXTP);

  1913.          
  1914.          //////////////////
  1915.         for(i=0;i<4;i++)
  1916.         {
  1917.             Display_16_point(0,i<<1,2,(WWJJYYJ+(i<<5))) ;
  1918.         }
  1919.         for(i=0;i<4;i++)
  1920.         {
  1921.             Display_16_point(1,i<<1,2,(WWJJYYG+(i<<5))) ;
  1922.         }

  1923.         for(i=0;i<4;i++)
  1924.         {
  1925.             Display_16_point(0,i<<1,3,(WWJJYYJ+(i<<5))) ;
  1926.         }
  1927.         for(i=0;i<4;i++)
  1928.         {
  1929.             Display_16_point(1,i<<1,3,(WWJJYYHH+(i<<5))) ;
  1930.         }
  1931. //////////////////
  1932.   }
  1933. }

  1934. }
复制代码


此帖出自51单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

112
 


41、吴鉴鹰12864系列(连载)之基于12864的俄罗斯方块游戏的设计详精讲(七)——完整资料分享





吴鉴鹰俄罗斯方块设计Proteus仿真电路.zip (39.74 KB, 下载次数: 64)

吴鉴鹰俄罗斯方块的设计完整方案.pdf (1.13 MB, 下载次数: 106)

吴鉴鹰俄罗斯方块设计原理图.pdf (57.83 KB, 下载次数: 59)

吴鉴鹰俄罗斯方块设计原理图1.pdf (57.52 KB, 下载次数: 55)




此帖出自51单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

113
 
顶顶顶~~
此帖出自51单片机论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

114
 
吴鉴鹰. 发表于 2014-6-13 14:13
资深工程师单片机实战项目精讲(连载),由易到难连续分享
老师,如果要对单片机采集到的二点信号模拟值(一个高一个低)与标准仪器对比\校准,专业叫标定吧,单片机如何写程序,给大家普及一下知识.




此帖出自51单片机论坛

点评

你好,这个我们在做仪器的时候,是这样的,就是通过采集的值,然后通过一个比例系数做标定,比如你采集的AD电压是0.5V代表电流值是1000A,而采集到1V对应的是2000A,则比例系数是2000,就是你采集的值,乘以该系  详情 回复 发表于 2015-3-12 15:00
 
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

115
 
teddyliu 发表于 2015-3-12 14:24
老师,如果要对单片机采集到的二点信号模拟值(一个高一个低)与标准仪器对比\校准,专业叫标定吧,单片机如何写程序,给大家普及一下知识.


你好,这个我们在做仪器的时候,是这样的,就是通过采集的值,然后通过一个比例系数做标定,比如你采集的AD电压是0.5V代表电流值是1000A,而采集到1V对应的是2000A,则比例系数是2000,就是你采集的值,乘以该系数就是实际测试的值。

此帖出自51单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

116
 
本帖最后由 吴鉴鹰. 于 2015-3-19 16:04 编辑

42、吴鉴鹰单片机项目实战(连载)之如何看懂时序图




原理图点击下载:

吴鉴鹰教你看时序图.pdf (491.47 KB, 下载次数: 225)




      鉴鹰我原来一直看不懂时序图,很害怕看,自从学会了一个方法以后,再也不担心看了!     
操作时序永远使用是任何一片IC芯片的最主要的内容。一个芯片的所有使用细节都会在它的官方器件手册上包含。所以使用一个器件事情,要充分做好的第一件事就是要把它的器件手册上有用的内容提取,掌握。介于中国目前的芯片设计能力有限,所以大部分的器件都是外国几个IC巨头比如TI、AT、MAXIM这些公司生产的,器件资料自然也是英文的多,所以,英文的基础要在阅读这些数据手册时得到提高哦。即便有中文翻译版本,还是建议看英文原版,看不懂时不妨再参考中文版,这样比较利于提高。
我们首先来看1602的引脚定义,1602的引脚是很整齐的SIP单列直插封装,所以器件手册只给出了引脚的功能数据表:
我们只需要关注以下几个管脚:
3脚:VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。
4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而此脚为低电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。值得一提的是,LCD1602的数据是8位的。
5脚:R/W,读写选择端。当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。笔者认为,此脚其实用处不大,直接接地永久置为低电平也不会影响其正常工作。但是尚未经过复杂系统验证,保留此意见。
6脚:E,使能信号,其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。
7~14脚:8位并行数据口,使得对LCD1602的数据读写大为方便。


现在来看LCD1602的操作时序:


在此,我们可以先不读出它的数据的状态或者数据本身。所以只需要看两个写时序:
① 当我们要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
② 当我们要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。以下是LCD1602的时序图:
大家要慢慢学会看时序图,要知道操作一个器件的精华便蕴藏在其中,看懂看准了时序,你操控这个芯片就是非常容易的事了。1602的时序是我见过的一个最简单的时序:

1、注意时间轴,如果没有标明(其实大部分也都是不标明的),那么从左往右的方向为时间正向轴,即时间在增长。
2、上图框出并注明了看懂此图的一些常识:
(1).时序图最左边一般是某一根引脚的标识,表示此行图线体现该引脚的变化,上图分别标明了RS、R/W、E、DB0~DB7四类引脚的时序变化。
(2).有线交叉状的部分,表示电平在变化,如上所标注。
(3).应该比较容易理解,如上图右上角所示,两条平行线分别对应高低电平,也正好吻合(2)中电平变化的说法。
(4).上图下,密封的菱形部分,注意要密封,表示数据有效,Valid Data这个词也显示了这点。
3、需要十分严重注意的是,时序图里各个引脚的电平变化,基于的时间轴是一致的。一定要严格按照时间轴的增长方向来精确地观察时序图。要让器件严格的遵守时序图的变化。在类似于18B20这样的单总线器件对此要求尤为严格。
4、以上几点,并不是LCD1602的时序图所特有的,绝大部分的时序图都遵循着这样的一般规则,所以大家要慢慢的习惯于这样的规则。
也许你还注意到了上面有许多关于时间的标注,这也是个十分重要的信息,这些时间的标注表明了某些状态所要维持的最短或最长时间。因为器件的工作速度也是有限的,一般都跟不上主控芯片的速度,所以它们直接之间要有时序配合。话说现在各种处理器的主频也是疯狂增长,日后搞不好出现个双核单片机也不一定就是梦话。下面是时序参数表:

大家要懂得估计主控芯片的指令时间,可以在官方数据手册上查到MCU的一些级别参数。比如我们现在用AVR M16做为主控芯片,外部12MHz晶振,指令周期就是一个时钟周期为(1/12MHz)us,所以至少确定了它执行一条指令的时间是us级别的。我们看到,以上给的时间参数全部是ns级别的,所以即便我们在程序里不加延时程序,也应该可以很好的配合LCD1602的时序要求了。怎么看这个表呢?很简单,我们在时序图里可以找到TR1,对应时序参数表,可以查到这个是E上升沿/下降沿时间,最大值为25ns,表示E引脚上的电平变化,必须在最大为25ns之内的时间完成。大家看是不是这个意思?
现在我来解读我对这个时序图的理解:
当要写命令字节的时候,时间由左往右,RS变为低电平,R/W变为低电平,注意看是RS的状态先变化完成。然后这时,DB0~DB7上数据进入有效阶段,接着E引脚有一个整脉冲的跳变,接着要维持时间最小值为tpw=400ns的E脉冲宽度。然后E引脚负跳变,RS电平变化,R/W电平变化。这样便是一个完整的LCD1602写命令的时序。

此帖出自51单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

93

帖子

4

TA的资源

一粒金砂(中级)

117
 
赞一个楼主我想说的是我也是毕业不久进国企的一名的大学生,因为不愿意忍受那样的氛围所以我辞职了准备自己努力去找工作。
此帖出自51单片机论坛

点评

能吃苦者,建议出去闯荡,加油,兄弟。  详情 回复 发表于 2015-3-20 22:44
 
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

118
 
第四维思想 发表于 2015-3-19 18:47
赞一个楼主我想说的是我也是毕业不久进国企的一名的大学生,因为不愿意忍受那样的氛围所以我辞职了准备自己努力去找工作。



能吃苦者,建议出去闯荡,加油,兄弟。
此帖出自51单片机论坛

点评

谢谢楼主现在已经出来准备自己去找工作做模拟。  详情 回复 发表于 2015-3-21 19:38
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

119
 
这是高手的范
此帖出自51单片机论坛

点评

互相学习,互相进步  详情 回复 发表于 2015-3-21 09:43
 
 
 

回复

348

帖子

0

TA的资源

纯净的硅(初级)

120
 


互相学习,互相进步

此帖出自51单片机论坛
 
个人签名为了方便大家交流,建了两个QQ群:QQ群3号:198387118  【1000人群】QQ群5号: 239316959【2000人群】群内已有成员3000余人!
更多内容关注微信公众号:单片机精讲吴鉴鹰
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后一周!2025 英飞凌消费、计算与通讯创新大会-北京站
会议时间:3月18日(周二)09:30签到
参会奖励:电动螺丝刀套装、户外登山包、京东卡

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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