6655|12

55

帖子

3685

TA的资源

纯净的硅(初级)

楼主
 

51汇编游戏之“读心术” [复制链接]

51汇编游戏之“读心术”

  前一段时间在网上看到很多人在玩一个叫“读心术”的游戏,原理很简单,也许各位也有玩过。现在我弄了个51单片机版的“读心术”游戏,与大家分享。
  先说一下游戏的规则:玩者在心中随意想一个两位数,然后用这个两位数减去他的个位数,在减去他的十位数,得到一个新的数据,然后在1602屏幕上找到这个新数据,看它所代表的字符是什么,最后按确认键,这是“神奇的一幕”出现了,1602屏幕上出现了你刚才看到的字符。
  呵呵,这个原理很简单,大家别见笑,我就是拿来练练手的。

  看一下源程序,俺先弱弱的问一句:51单片机怎么产生随机数比较好啊??请大家给个方案。我用的是定时器,想找一个更好的随机数产生方法。


  1. ;##########################################################
  2. ;**********************************************************
  3. ;程序名称:51汇编游戏之"读心术"
  4. ;主控芯片:89c51 (12MHZ,LCD1602)
  5. ;程序功能:读懂你心中所想之事
  6. ;程序编写者:buyixin (不亦心)
  7. ;编写时间:2009年10月15日  19:49
  8. ;不亦心的博客:http://hi.baidu.com/不亦心/
  9. ;***********************************************************
  10. ;###########################################################
  11. ;//////变量地址申明/////////////////////////////////////////
  12.   Page_down    BIT    P1.0     ;向下翻页键
  13.   Page_up      BIT    P1.1     ;向上翻页键
  14.   Make_sure    BIT    P1.2     ;确定键
  15.   Play_start   BIT    P1.3     ;开始键
  16.   RS           EQU    P2.0     ;定义LCD1602的RS为P2.0
  17.   RW           EQU    P2.1     ;定义LCD1602的RW为P2.1
  18.   E            EQU    P2.2     ;定义LCD1602的E为P2.2
  19.   PageS        DATA   30H      ;页数暂存单元
  20.   Num_data     DATA   31H      ;确定符号暂存单元
  21.   Ran_data     DATA   32H      ;随机数暂存单元
  22.   Ran_datas    DATA   33H      ;随机符号暂存单元
  23.   Ran_data0    DATA   34H      ;第一页第一个符号暂存单元
  24.   Ran_data1    DATA   35H
  25.   Ran_data2    DATA   36H
  26.   Ran_data3    DATA   37H
  27.   Ran_data4    DATA   38H
  28.   Ran_data5    DATA   39H
  29.   Ran_data6    DATA   3AH
  30.   Ran_data7    DATA   3BH
  31.   Ran_data8    DATA   3CH
  32.   Ran_data9    DATA   3DH
  33.   Ran_data10   DATA   3EH
  34.   Ran_data11   DATA   3FH      ;第12页第一个符号暂存单元
  35.   data0        DATA   40H      ;数字十位暂存单元
  36.   data1        DATA   41H      ;数字个位暂存单元
  37. ;//////主程序开始///////////////////////////////////////////
  38.   ORG      0000H
  39.   AJMP     START     
  40.   ORG      000BH
  41.   LJMP     TIM0                ;定时器0  
  42.   ORG      0030H
  43. ;------各部分初始化---------------------------------------
  44. START:     MOV SP,#60H         ;设置堆栈  
  45.   MOV      Pages,#00H          ;清空关键暂存区
  46.   MOV      Num_data,#00H
  47.   MOV      Ran_data,#00H
  48.   MOV      data0,#00H
  49.   MOV      data1,#00H
  50.   LCALL    Init_tim0           ;调用定时器0初始化
  51. Repeat:    LCALL Ran_num       ;调用随机数产生子程序
  52.   MOV      DPTR,#TAB_code      ;获取确定符号
  53.   MOV      A,B
  54.   MOVC     A,@A+DPTR
  55.   MOV      Num_data,A
  56.   LCALL    Font_code           ;调用随机符号产生子程序
  57.   LCALL    Init_1602           ;调用LCD1602初始化子程序

  58. ;------开始游戏-----------------------------------------
  59. Repeat1:   JB       Play_start,$ ;等待开始按键按下
  60.   JNB      Play_start,$   
  61.   MOV        Pages,#00H
  62. FAN_YE:  LCALL    Page_shu       ;调用页数判定子程序
  63.   MOV      P0,#80H               ;LCD1602第一行开始显示  
  64.   LCALL    WR_COM                ;调用LCD1602写命令子程序
  65.   LCALL    WR_Page               ;调用LCD1602页写子程序   
  66.   MOV      P0,#0C0H              ;LCD1602第二行开始显示
  67.   LCALL    WR_COM
  68.   LCALL    WR_Page
  69. ;--------键判---------------------------------------
  70. AN_JIAN:  JB Page_down,Continue1 ;判断向下翻页键是否按下
  71.   JNB      Page_down,$            
  72.   INC      Pages                 ;页数增加1   
  73.   MOV      A,Pages
  74.   CJNE     A,#0CH,Cont1          ;12页翻完则重头开始
  75.   MOV      Pages,#00H
  76. Cont1:     AJMP     FAN_YE       ;跳到翻页处
  77. Continue1: JB Page_up,Continue2  ;判断向上翻页按键是否按下
  78.   JNB      Page_up,$
  79.   MOV      A,Pages
  80.   CJNE     A,#00H,Cont2          ;若为第一页则向上为第12页
  81.   MOV      Pages,#0BH
  82.   SJMP     Cont3
  83. Cont2:     DEC Pages             ;页数减1
  84. Cont3:     AJMP  FAN_YE
  85. Continue2: JB Make_sure,Cont4    ;检测确认键是否按下
  86.   JNB      Make_sure,$           ;确认键按下则显示结果  
  87.   LCALL     Display              ;调用显示结果子程序
  88.   LJMP     Repeat
  89.   Cont4:   AJMP AN_JIAN
  90. ;//////显示结果子程序////////////////////////////////////////////
  91. Display:   MOV P0,#01H   ;清除屏幕
  92.   ACALL    WR_COM   ;调用WR_COM子程序
  93.   MOV      P0,#80H
  94.   ACALL    WR_COM
  95.   MOV      R3,#00H
  96.   MOV      DPTR,#TAB2  ;your choose:
  97. REP4:      MOV A,R3
  98.   MOVC     A,@A+DPTR
  99.   LCALL    WR_DATA
  100.   INC      R3
  101.   MOV      A,R3
  102.   CJNE     A,#0EH,REP4
  103.   MOV      A,Num_data
  104.   LCALL    WR_DATA
  105.   MOV      P0,#0C0H    ;play again
  106.   ACALL    WR_COM
  107. REP5:      MOV A,R3
  108.   MOVC     A,@A+DPTR
  109.   LCALL    WR_DATA
  110.   INC      R3
  111.   MOV      A,R3
  112.   CJNE     A,#1EH,REP5
  113.   LCALL    DELAY600MS
  114.   RET
  115. ;//////页数判定子程序//////////////////////////////////
  116. ;------入口参数 Pages(页数)---------------------
  117. ;------出口参数 R0   (显示数字)------------------------
  118. Page_shu:
  119.   MOV      A,Pages
  120.   CJNE     A,#00H,NEXT1
  121.   MOV      R0,#00H  
  122.   MOV      Ran_datas,Ran_data0
  123. NEXT1:     CJNE A,#01H,NEXT2
  124.   MOV      R0,#08H
  125.   MOV      Ran_datas,Ran_data1
  126. NEXT2:     CJNE A,#02H,NEXT3
  127.   MOV      R0,#10H
  128.   MOV      Ran_datas,Ran_data2
  129. NEXT3:     CJNE A,#03H,NEXT4
  130.   MOV      R0,#18H
  131.   MOV      Ran_datas,Ran_data3
  132. NEXT4:     CJNE A,#04H,NEXT5
  133.   MOV      R0,#20H
  134.   MOV      Ran_datas,Ran_data4
  135. NEXT5:     CJNE A,#05H,NEXT6
  136.   MOV      R0,#28H
  137.   MOV      Ran_datas,Ran_data5
  138. NEXT6:     CJNE A,#06H,NEXT7
  139.   MOV      R0,#30H
  140.   MOV      Ran_datas,Ran_data6
  141. NEXT7:     CJNE A,#07H,NEXT8
  142.   MOV      R0,#38H
  143.   MOV      Ran_datas,Ran_data7
  144. NEXT8:     CJNE A,#08H,NEXT9
  145.   MOV      R0,#40H
  146.   MOV      Ran_datas,Ran_data8
  147. NEXT9:     CJNE A,#09H,NEXT10
  148.   MOV      R0,#48H
  149.   MOV      Ran_datas,Ran_data9
  150. NEXT10:    CJNE A,#0AH,NEXT11
  151.   MOV      R0,#50H
  152.   MOV      Ran_datas,Ran_data10
  153. NEXT11:    CJNE A,#0BH,OUT
  154.   MOV      R0,#58H
  155.   MOV      Ran_datas,Ran_data11
  156. OUT:        
  157.   RET

  158. ;//////1602写页子程序///////////////////////////////////////
  159. WR_page:
  160.   MOV      R1,#04H
  161. REP6:      LCALL Font_data
  162.   MOV      A,data0
  163.   LCALL    WR_DATA
  164.   MOV      A,data1
  165.   LCALL    WR_DATA
  166.   MOV      A,R0
  167.   MOV      B,#09H
  168.   DIV      AB
  169.   MOV      A,B
  170.   JNZ      NEXT
  171.   MOV      A,Num_data
  172.   SJMP     OVER
  173. NEXT:      MOV A,Ran_datas   ;取随机符号
  174.   ADD      A,#04H
  175.   CJNE     A,#09H,GO_ON
  176. GO_ON:     JC REP7
  177.   SUBB     A,#09H
  178. REP7:      MOV Ran_datas,A
  179.   MOV      A,Ran_datas
  180.   MOV      DPTR,#TAB_code
  181.   MOVC     A,@A+DPTR
  182. OVER:      LCALL WR_DATA
  183.   MOV      A,' '
  184.   LCALL    WR_DATA
  185.   INC      R0
  186.   DJNZ     R1,REP6
  187.   RET  

  188. 未完待续

复制代码
此帖出自51单片机论坛

最新回复

娱乐于学  详情 回复 发表于 2011-3-15 20:43
点赞 关注
 

回复
举报

55

帖子

3685

TA的资源

纯净的硅(初级)

沙发
 
  1. ;//////1602初始化子程序//////////////////////////////////
  2. Init_1602:
  3. MOV P0,#01H ;清除屏幕
  4. ACALL WR_COM ;调用WR_COM子程序 .
  5. MOV P0,#38H ;8位点阵方式 .
  6. ACALL WR_COM
  7. MOV P0,#06H
  8. ACALL WR_COM
  9. MOV P0,#0DH ;开显示
  10. ACALL WR_COM
  11. MOV P0,#80H
  12. ACALL WR_COM
  13. MOV R3,#00H
  14. MOV DPTR,#TAB1 ;显示welcomr to buyixin's design
  15. REP0: MOV A,R3
  16. MOVC A,@A+DPTR
  17. LCALL WR_DATA
  18. INC R3
  19. MOV A,R3
  20. CJNE A,#10H,REP0
  21. MOV P0,#0C0H
  22. LCALL WR_COM
  23. REP1: MOV A,R3
  24. MOVC A,@A+DPTR
  25. LCALL WR_DATA
  26. INC R3
  27. MOV A,R3
  28. CJNE A,#20H,REP1
  29. LCALL DELAY600MS
  30. MOV P0,#01H ;清除屏幕
  31. ACALL WR_COM ;调用WR_COM子程序
  32. MOV P0,#80H ;显示now just go! press page_start
  33. ACALL WR_COM
  34. REP21: MOV A,R3
  35. MOVC A,@A+DPTR
  36. LCALL WR_DATA
  37. INC R3
  38. MOV A,R3
  39. CJNE A,#30H,REP21
  40. MOV P0,#0C0H
  41. LCALL WR_COM
  42. REP3: MOV A,R3
  43. MOVC A,@A+DPTR
  44. LCALL WR_DATA
  45. INC R3
  46. MOV A,R3
  47. CJNE A,#40H,REP3
  48. RET
  49. ;//////取字型码子程序//////////////
  50. ;------出口参数 Ran_datan (随机字符)
  51. Font_code: LCALL Ran_num
  52. MOV Ran_data0,B ;随机取第一页第一个符号
  53. LCALL Ran_num
  54. MOV Ran_data1,B
  55. LCALL Ran_num
  56. MOV Ran_data2,B
  57. LCALL Ran_num
  58. MOV Ran_data3,B
  59. LCALL Ran_num
  60. MOV Ran_data4,B
  61. LCALL Ran_num
  62. MOV Ran_data5,B
  63. LCALL Ran_num
  64. MOV Ran_data6,B
  65. LCALL Ran_num
  66. MOV Ran_data7,B
  67. LCALL Ran_num
  68. MOV Ran_data8,B
  69. LCALL Ran_num
  70. MOV Ran_data9,B
  71. LCALL Ran_num
  72. MOV Ran_data10,B
  73. LCALL Ran_num
  74. MOV Ran_data11,B ;随机取第12页第一个字符
  75. RET

  76. ;//////取数据子程序///////////////////////////////////
  77. ;------出口参数 data0,data1 (顺序数字)----------------
  78. Font_data: MOV DPTR,#TAB_data
  79. MOV A,R0
  80. MOV B,#0AH
  81. DIV AB
  82. MOVC A,@A+DPTR
  83. MOV data0,A
  84. MOV A,B
  85. MOVC A,@A+DPTR
  86. MOV data1,A
  87. RET
  88. ;//////初始化定时器0////////////////////////////////
  89. Init_tim0: MOV TMOD,#01H
  90. SETB EA
  91. SETB ET0
  92. MOV TH0,#3CH
  93. MOV TL0,#0AFH
  94. SETB TR0
  95. RET

  96. ;//////定时器0中断服务程序//////////////////////////
  97. TIM0:
  98. MOV TH0,#3CH
  99. MOV TL0,#0AFH
  100. RETI


  101. ;//////随机数产生子程序/////////////////////////////
  102. ;------出口参数 B (随机数)------------------------
  103. Ran_num: MOV A,TL0
  104. MOV B,#0AH
  105. DIV AB
  106. RET

  107. ;//////1602写指令子程序/////////////////////////////
  108. WR_COM: CLR RS
  109. CLR RW
  110. CLR E
  111. ACALL DELAY60MS
  112. SETB E
  113. RET

  114. ;//////1602写数据子程序/////////////////////////////
  115. ;------入口参数 A (要写入的数据)-------------------
  116. WR_DATA:
  117. MOV P0,A
  118. SETB RS
  119. CLR RW
  120. CLR E
  121. LCALL DELAY60MS
  122. SETB E
  123. RET

  124. ;//////延时子程序////////////////////////////
  125. ;------60MS延时子程序-----------------------
  126. DELAY60MS: MOV R7,#75H
  127. D2: MOV R6,#0FFH
  128. DJNZ R6,$
  129. DJNZ R7,D2
  130. RET

  131. ;------600ms延时子程序----------------------
  132. DELAY600MS: MOV R5,#0AH
  133. D3: LCALL DELAY60MS
  134. DJNZ R5,D3
  135. RET

  136. ;//////字型码表///////////////////////////////
  137. TAB1: DB " Welcome to "
  138. DB "Buyixin's design"
  139. DB " Now-Just-go! "
  140. DB "Press Play_start"
  141. TAB2: DB " You Choose: "
  142. DB " Play again "
  143. TAB_data:
  144. DB "0123456789"
  145. TAB_code:
  146. DB "~!@#$%^&*?"

  147. ;//////程序结束///////////////////////////////
  148. END
复制代码
此帖出自51单片机论坛
 
 
 

回复

55

帖子

3685

TA的资源

纯净的硅(初级)

板凳
 

回复 沙发 火龙果 的帖子

"俺先弱弱的问一句:51单片机怎么产生随机数比较好啊??????????????请大家给个方案"

原来做一个贪吃蛇,要用随机数得出下一颗豆子的位置
最开始用最简单的,让豆子出现在蛇尾(最简单,不耗费资源,但效果不行...因为都知道会出现在哪里)
后来想用的方法是根据蛇当前的位置及已走过的步数来得出豆子的位置
效果还比较理想.....

用定时器或AD值我觉得...有一定的局限性,根据数学方法,去得出"完美随机数"又觉得太耗费资源,且原理也不是一时半会搞得明白
应该充分根据需要及应用本身的优势去实现,比如有按键输入的,可以根据输入值和输入间隔等
此帖出自51单片机论坛
 
 
 

回复

2400

帖子

0

TA的资源

裸片初长成(高级)

4
 
随机数:51单片机          产生随机数
此帖出自51单片机论坛
 
 
 

回复

278

帖子

0

TA的资源

一粒金砂(中级)

5
 
很不错!谢谢
此帖出自51单片机论坛
 
 
 

回复

259

帖子

0

TA的资源

一粒金砂(中级)

6
 
楼主太强了,向楼主学习
此帖出自51单片机论坛
 
 
 

回复

107

帖子

0

TA的资源

一粒金砂(中级)

7
 
随机数:51单片机          产生随机数?
此帖出自51单片机论坛
 
个人签名haha
 
 

回复

674

帖子

0

TA的资源

五彩晶圆(中级)

8
 

不太懂

有个想法:按键按下时  有个数在疯狂在0~255循环,当按键断开时, 停下的数就是
此帖出自51单片机论坛
 
 
 

回复
buyixin 该用户已被删除
9
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 

赞楼主

赞楼主,不过第一个图不完整,希望能改一下,O(∩_∩)O~
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

11
 

回复 楼主 火龙果 的帖子

汇编
此帖出自51单片机论坛
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(初级)

12
 
很不错!谢谢
此帖出自51单片机论坛
 
 
 

回复

289

帖子

0

TA的资源

一粒金砂(中级)

13
 
娱乐于学
此帖出自51单片机论坛
 
个人签名科学家研究已有的世界,工程师创造未来的世界!
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
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
快速回复 返回顶部 返回列表